功能说明

rolling() 创建一个固定大小的滑动窗口对象,窗口沿数据轴滑动,每个窗口位置的统计量仅基于窗口内的数据计算。

df.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)

也支持对 Series 使用:s.rolling(...)

📦 参数详解

参数类型默认值说明
windowint / Offset / str必填窗口大小。整数表示样本数;Offset 或 str(如 '3D')表示时间窗口,需索引为 DatetimeIndex
min_periodsintNone窗口内最少非缺失值数量,不足则结果为 NaN。默认等于 window(整数窗口)或 1(偏移窗口)
centerboolFalse为 True 时将窗口居中,窗口前沿/后沿各为 window//2
win_typestrNone加权窗口类型,如 'triang'、'gaussian'。为 None 时所有点等权(普通滚动),指定时需调用 mean() 等方法
onstrNone对于 DataFrame,指定作为时间窗口依据的列(需为 Datetime 类型)
axisint / str0沿哪个轴计算(0 或 ‘index’ 为行方向)
closedstrNone时间窗口端点闭合方式:'right'、'left'、'both'、'neither',仅对偏移窗口有效

⚙️ 固定窗口

基本用法

import pandas as pd
import numpy as np
 
s = pd.Series(np.arange(1, 11))
 
# 窗口大小为 3,不加权
s.rolling(3)          # 创建 Rolling 对象
s.rolling(3).sum()    # 滚动求和
# 0     NaN
# 1     NaN
# 2     6.0
# 3     9.0
# ...
 
# DataFrame 对所有数值列同时滚动
df = pd.DataFrame({'A': range(5), 'B': range(5, 10)})
df.rolling(2).mean()

min_periods 示例

s.rolling(3, min_periods=1).sum()
# 窗口不足 3 个数据时,只要有 1 个就计算
# 0     1.0
# 1     3.0
# 2     6.0
# 3     9.0

center=True 示例

s.rolling(3, center=True).sum()
# 结果对齐到窗口中间位置
# 0     NaN
# 1     6.0   # 覆盖索引 0,1,2
# 2     9.0   # 覆盖索引 1,2,3

📊 可用方法

方法清单

方法说明
sum()滚动求和
mean()滚动均值
median()滚动中位数
std()滚动标准差(ddof=1)
var()滚动方差
count()窗口内非缺失值数量
min() / max()滚动最小值 / 最大值
corr()滚动相关系数
cov()滚动协方差
skew()滚动偏度
kurt()滚动峰度
apply()应用自定义函数
agg() / aggregate()一次应用多个聚合
quantile()滚动分位数
rank()滚动排名
sem()滚动标准误

方法使用示例

df = pd.DataFrame({'A': np.random.randn(10), 'B': np.random.randn(10)})
 
# 滚动均值与标准差
df.rolling(3).mean()
df.rolling(3).std()
 
# 滚动相关系数(两列)
df['A'].rolling(5).corr(df['B'])
 
# 滚动分位数
df.rolling(5).quantile(0.75)
 
# 自定义函数
df.rolling(3).apply(lambda x: x.max() - x.min(), raw=True)
 
# 多个聚合一次完成
df.rolling(3).agg(['sum', 'mean', 'std'])
df.rolling(3).agg({'A': 'sum', 'B': ['mean', 'max']})

⏱️ 时间窗口

时间窗口

当索引为 DatetimeIndex 时,window 可指定为时间偏移字符串或 pd.Timedelta,窗口大小根据时间长度确定。

ts = pd.Series(np.random.randn(100),
               index=pd.date_range('2024-01-01', periods=100, freq='h'))
 
# 3 小时滚动均值(窗口包含索引在过去 3 小时内的所有数据点)
ts.rolling('3h').mean()
 
# 时间窗口 + closed 参数控制端点
ts.rolling('3h', closed='both').sum()
 
# 使用 pd.Offset
ts.rolling(pd.offsets.Day(2)).mean()

时间窗口注意点

  • 时间窗口要求索引为时间类型,且单调递增
  • 默认 min_periods=1(与整数窗口默认不同)
  • closed 参数仅对偏移窗口有效:
    • 'right':窗口包含 (end - window, end](默认)
    • 'left':窗口包含 [end - window, end)
    • 'both':两端都包含
    • 'neither':两端都不包含
  • 也可使用 on 参数指定 DataFrame 中某一时间列作为窗口依据

🪟 窗口类型

加权窗口类型

通过 win_type 参数指定不同的加权窗口函数。窗口内数据按权重函数加权后再计算。

# 三角加权窗口
s.rolling(5, win_type='triang').mean()
 
# 汉明窗
s.rolling(5, win_type='hamming').mean()
 
# 高斯窗(需额外参数 std)
s.rolling(5, win_type='gaussian').mean(std=1.0)

完整窗口类型列表

窗口类型说明
boxcar矩形窗(等权,等同于不加权)
triang三角窗
blackmanBlackman 窗
hammingHamming 窗
bartlettBartlett 窗
parzenParzen 窗
bohmanBohman 窗
blackmanharrisBlackman-Harris 窗
nuttallNuttall 窗
barthannBartlett-Hann 窗
cosine余弦窗
exponential指数窗(需额外参数 tau)
gaussian高斯窗(需额外参数 std)

加权窗口的限制

  • 使用 win_type 时,可调用的方法有限制:通常是 mean()、sum()、std()、var() 等基础聚合
  • 某些窗口类型需要额外的关键字参数(如 gaussian 需要 std,exponential 需要 tau)

🔗 相关链接