# 4.7.4 移动窗口计算（问答库）

1. 【单选题·易】对时间序列或任意连续数据进行移动窗口计算，课程采用的方法是？
   A. `resample()`
   B. `rolling()`
   C. `merge()`
   D. `diff()`
   **答案：B**
   **解析：** 语料明确：`rolling()` 方法用于对时间序列或任意连续数据进行移动窗口计算。`resample()` 属于 4.7.3 重采样，`diff()` 属于 4.7.2 时间间隔计算。

2. 【单选题·易】`rolling()` 的参数 `window` 指定的是？
   A. 重采样的时间频率，如 `'D'`、`'W'`
   B. 滚动窗口的大小，即每次计算时包含的连续数据点个数
   C. 数据框的列个数
   D. 缺失值填充方式
   **答案：B**
   **解析：** 语料：参数 `window` 指定滚动窗口的大小，即每次计算时包含的连续数据点个数。频率字符串是 `resample()` 的参数。

3. 【判断题·易】`rolling()` 只能用于带日期索引的时间序列，不能用于任意连续数据。
   **答案：×**
   **解析：** 语料写明：用于对时间序列**或任意连续数据**进行移动窗口计算。窗口按连续数据点滑动，不一定要求索引是时间。

4. 【判断题·易】移动窗口计算通常用于时间序列分析中的平滑处理、趋势分析或噪声过滤。
   **答案：√**
   **解析：** 这是 4.7.4 对 `rolling()` 典型用途的表述。窗口内可做求和、平均值、最大值、最小值等统计。

5. 【多选题·中】下列属于课程中移动窗口可进行的统计操作或相关用法的有：
   A. 求和、平均值、最大值、最小值
   B. 用 `window` 指定每次计算包含的连续数据点个数
   C. 用 `resample('W')` 按周取最大值
   D. 先 `rolling()` 得到窗口对象，再链式调用 `.max()` / `.min()` 等
   **答案：ABD**
   **解析：** A、B 来自 4.7.4；D 与课程写法 `df['温度'].rolling(window=3).max()` 及 4.7.5「先创建滚动窗口对象再聚合」一致。C 是 4.7.3 的 `resample()`，不是移动窗口。

6. 【单选题·中】执行下列代码后，2024-09-03 对应的「滚动平均」列的值是？

```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()
print(df.loc['2024-09-03', '滚动平均'])
```

   A. `NaN`
   B. `31.0`
   C. `32.0`
   D. `30.0`
   **答案：C**
   **解析：** 窗口为 3，9 月 3 日取最近 3 天 30、32、31 的最大值，为 32.0。列名虽为「滚动平均」，代码调用的是 `.max()` 而不是 `.mean()`。前两天才是 NaN。

7. 【单选题·中】沿用上题数据，2024-09-01 与 2024-09-05 的「滚动平均」依次是？
   A. `30.0` 与 `31.0`
   B. `NaN` 与 `31.0`
   C. `NaN` 与 `32.0`
   D. `0` 与 `28.0`
   **答案：B**
   **解析：** 默认窗口未满 3 个点时结果为 NaN，故 9 月 1 日（及 9 月 2 日）为空值，不是 0。9 月 5 日窗口为 31、29、28，最高温度 31.0。

8. 【多选题·中】关于下列代码的输出，说法正确的有：

```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()
print(df)
```

   A. 前 2 天「滚动平均」为 NaN，因为窗口尚未凑满 3 个点
   B. 9 月 4 日值为 32.0，对应窗口 32、31、29
   C. 9 月 7 日值为 28.0，对应窗口 28、27、26
   D. 列名叫「滚动平均」，所以实际计算的是 3 日均值
   **答案：ABC**
   **解析：** 课程输出与注释均为「最近 3 天的最高温度」。D 错误：注释虽写滚动平均，链式调用的是 `.max()`。若用 `.mean()`，9 月 3 日才是 31.0，与课程结果不符。

9. 【判断题·中】只写 `df['温度'].rolling(window=3)` 而不再调用 `.max()` 等方法，就已经得到各窗口的统计数值。
   **答案：×**
   **解析：** `rolling()` 只创建滚动窗口对象。必须再对窗口对象做聚合（如 `.max()`、`.min()`、`.mean()`、`.sum()`）才得到数值序列。课程写法是 `rolling(window=3).max()`。

10. 【单选题·难】执行下列代码后，`a` 在 9 月 1 日的值、`b` 在 9 月 1 日的值、`c` 在 9 月 3 日的值依次是？

```python
import pandas as pd
dates = pd.date_range('2024-09-01', periods=7, freq='D')
s = pd.Series([30, 32, 31, 29, 28, 27, 26], index=dates)
a = s.rolling(window=3).max()
b = s.rolling(window=3, min_periods=1).max()
c = s.rolling(window=3).mean()
print(a.loc['2024-09-01'], b.loc['2024-09-01'], c.loc['2024-09-03'])
```

   A. `NaN`、`30.0`、`31.0`
   B. `30.0`、`30.0`、`32.0`
   C. `NaN`、`NaN`、`32.0`
   D. `0`、`30.0`、`31.0`
   **答案：A**
   **解析：** 默认 `min_periods` 等于 `window`，窗口未满时 `a` 为 NaN。`min_periods=1` 时只要有 1 个观测就计算，`b` 在 9 月 1 日为 30.0（4.7.5 KDJ 写法同理）。`c` 是 3 日均值：(30+32+31)/3=31.0，不要与课程示例的 `.max()`（32.0）搞混。

11. 【简答题·中】说明 `rolling()` 的作用和 `window` 的含义；写出课程 7 天温度示例的完整可运行代码，并解释为什么前两天是 NaN、从第三天起各是多少。
   **答案：**
   `rolling()` 对时间序列或任意连续数据做移动窗口计算，在指定窗口内进行求和、平均、最大、最小等统计，常用于平滑、趋势或噪声过滤。`window` 是每次计算包含的连续数据点个数。

```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()
print(df)
```

   窗口为 3，前 2 天点数不足，结果为 NaN。其后为最近 3 天最高温度：9 月 3 日 32.0，9 月 4 日 32.0，9 月 5 日 31.0，9 月 6 日 29.0，9 月 7 日 28.0。注意代码用的是 `.max()`，不是均值。
   **解析：** 评分要点：① 点出时间序列/任意连续数据、窗口统计、平滑/趋势/噪声；② `window` 是连续点数；③ 代码含 `date_range`、温度列与 `rolling(window=3).max()`；④ 前两天 NaN 及后五天 32.0/32.0/31.0/29.0/28.0。把结果说成均值或漏写链式 `.max()` 应扣分。

12. 【简答题·难】结合下列代码，回答：（1）`r1` 前两行为什么是 NaN 而不是 0？（2）9 月 4 日 `r1` 与 `r2` 各是多少、窗口里有哪些温度？（3）若把 `r1` 改成 `.mean()`，9 月 3 日应变为多少？（4）`r3` 用 `min_periods=1` 的目的是什么，9 月 1 日会得到什么？它与 4.7.5 计算 KDJ 的写法有何对应？

```python
import pandas as pd
dates = pd.date_range('2024-09-01', periods=7, freq='D')
s = pd.Series([30, 32, 31, 29, 28, 27, 26], index=dates)
r1 = s.rolling(window=3).max()
r2 = s.rolling(window=3).min()
r3 = s.rolling(window=3, min_periods=1).min()
print(r1)
print(r2)
print(r3)
```

   **答案：**
   （1）默认至少要凑满 `window` 个点才出结果，不足则为缺失值 NaN，不是把空窗口当成 0。
   （2）9 月 4 日窗口是 32、31、29：`r1` 为 max=32.0，`r2` 为 min=29.0。
   （3）改为均值后，9 月 3 日窗口 30、32、31，(30+32+31)/3=31.0。课程列名「滚动平均」容易误导，原示例实际是最大值 32.0。
   （4）`min_periods=1` 表示至少 1 个有效观测即可计算，窗口未满也能出数。9 月 1 日 `r3` 为 30.0。4.7.5 中 `stockData['最低'].rolling(window=n, min_periods=1).min()`（以及最高价的 `.max()`）就是这种写法，用来取最近 n 天最低价/最高价且避免前若干日全空。
   **解析：** 评分要点：① NaN 来自窗口未满，不是 0；② 9 月 4 日窗口元素与 max/min 正确；③ 均值 31.0，并能指出课程示例用的是 max；④ `min_periods=1` 的含义、首日 30.0，以及与 KDJ 最近 n 日高低价的对应。只背数字不讲窗口内容可酌情扣分。

---

文件已写入：
- `知识库/第4章 pandas数据分析库/4.7.4-移动窗口计算.md`
- `问答库/第4章 pandas数据分析库/4.7.4-移动窗口计算.md`
