功能说明
rolling()创建一个固定大小的滑动窗口对象,窗口沿数据轴滑动,每个窗口位置的统计量仅基于窗口内的数据计算。df.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)也支持对 Series 使用:
s.rolling(...)
📦 参数详解
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
window | int / Offset / str | 必填 | 窗口大小。整数表示样本数;Offset 或 str(如 '3D')表示时间窗口,需索引为 DatetimeIndex |
min_periods | int | None | 窗口内最少非缺失值数量,不足则结果为 NaN。默认等于 window(整数窗口)或 1(偏移窗口) |
center | bool | False | 为 True 时将窗口居中,窗口前沿/后沿各为 window//2 |
win_type | str | None | 加权窗口类型,如 'triang'、'gaussian'。为 None 时所有点等权(普通滚动),指定时需调用 mean() 等方法 |
on | str | None | 对于 DataFrame,指定作为时间窗口依据的列(需为 Datetime 类型) |
axis | int / str | 0 | 沿哪个轴计算(0 或 ‘index’ 为行方向) |
closed | str | None | 时间窗口端点闭合方式:'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)