移动窗口计算是对时间序列或任意连续数据,在指定窗口大小内做统计操作的方法,课程用序列或数据框的 rolling() 实现。窗口内可进行求和、平均值、最大值、最小值等统计,通常用于时间序列分析中的平滑处理、趋势分析或噪声过滤。参数 window 指定滚动窗口的大小,即每次计算时包含的连续数据点个数。rolling() 本身只创建一个滚动窗口对象,随后再对该对象的每个子集执行聚合,如 .max()、.min()、.mean()、.sum()。
课程示例先用 pd.date_range('2024-09-01', periods=7, freq='D') 生成连续 7 天日期作为数据框行标签,温度列为 [30, 32, 31, 29, 28, 27, 26],再计算 3 天窗口统计:
import pandas as pd
dates = pd.date_range('2024-09-01', periods=7, freq='D')
df = pd.DataFrame({'温度': [30, 32, 31, 29, 28, 27, 26]}, index=dates)
df['滚动平均'] = df['温度'].rolling(window=3).max()
窗口为 3 时,前 2 天观测不足 3 个点,结果为空值 NaN;从第 3 天起,每个位置取「最近 3 天」的最高温度:9 月 3 日 32.0(窗口 30、32、31),9 月 4 日 32.0(32、31、29),9 月 5 日 31.0,9 月 6 日 29.0,9 月 7 日 28.0。窗口逐日向前滑动一格,始终覆盖当前位置及其前面共 window 个连续点。注释写「计算 3 天的滚动平均温度」,实际链式调用的是 .max(),列名与统计量不要混为一谈。
4.7.5 计算股票 KDJ 指标时再次使用滚动窗口:stockData['最低'].rolling(window=n, min_periods=1).min() 得到最近 n 天最低价,最高价则对「最高」列做 .max()。常用参数除 window 外还有 min_periods,用来指定窗口内至少要有多少个有效观测才出结果;设为 1 时,即使窗口尚未填满,也会从第一天开始计算,避免前若干行全是空值。
易错点:只调用 rolling(window) 得不到数值,必须再链式调用统计方法;默认 min_periods 等于 window,前 window-1 行是 NaN 而不是 0;window 按连续数据点个数计数,本例恰好按天索引、window=3 才对应 3 天;不要把 rolling() 与 4.7.3 按时间频率(如 'W')聚合的 resample() 混淆。
rolling() 用于时间序列或任意连续数据的移动窗口计算。window 指定每次计算包含的连续数据点个数。rolling(window=3).max(),前 2 行为 NaN,其后为最近 3 天最高温度。min_periods=1 时从第一行即可出结果(KDJ 示例)。rolling() 返回窗口对象,需再调用 .max() / .min() / .mean() 等;勿与 resample() 混淆。