# 4.7.4 移动窗口计算

移动窗口计算是对时间序列或任意连续数据，在指定窗口大小内做统计操作的方法，课程用序列或数据框的 `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 天窗口统计：

```python
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` 指定每次计算包含的连续数据点个数。
- 窗口内可做 sum、mean、max、min 等，用于平滑、趋势或噪声过滤。
- 课程示例：7 天温度，`rolling(window=3).max()`，前 2 行为 NaN，其后为最近 3 天最高温度。
- 默认窗口未满为 NaN；`min_periods=1` 时从第一行即可出结果（KDJ 示例）。
- `rolling()` 返回窗口对象，需再调用 `.max()` / `.min()` / `.mean()` 等；勿与 `resample()` 混淆。

---
