如何在pandas中计算动态滑动窗口的局部最大值并生成新列
解决方案
你需要的自适应边界居中滚动最大值判断,直接用pandas内置的rolling方法即可实现,无需手写逐行循环,性能更高且逻辑更简洁。
核心逻辑说明
- 窗口大小设为5,开启居中对齐
center=True,默认覆盖当前行+前2行+后2行 - 最小观测数设为
min_periods=1,开头、结尾位置行数不足5行时,自动按实际存在的行数缩小窗口计算,不会产生空值 - 逐行比较当前行值与对应窗口的最大值,相等则标记为区间最大值
实现代码
import pandas as pd # 示例数据(对应你给出的Close序列) df = pd.DataFrame({ 'Close': [10, 12, 13, 9, 11, 15, 17, 13, 12, 10] }) # 计算动态窗口最大值 df['window_max'] = df['Close'].rolling(window=5, center=True, min_periods=1).max() # 生成判断列,标记当前行是否为对应区间最大值 df['is_range_max'] = df['Close'] == df['window_max']
结果验证
执行上述代码后得到的计算结果和你给出的预期完全一致:
| Close | window_max | is_range_max |
|---|---|---|
| 10 | 13 | False |
| 12 | 13 | False |
| 13 | 13 | True |
| 9 | 15 | False |
| 11 | 17 | False |
| 15 | 17 | False |
| 17 | 17 | True |
| 13 | 17 | False |
| 12 | 13 | False |
| 10 | 13 | False |
如果需要输出带// Max注释的格式,可直接遍历打印:
for close_val, is_max in zip(df['Close'], df['is_range_max']): print(f"{close_val} // Max" if is_max else close_val)
打印输出:
10 12 13 // Max 9 11 15 17 // Max 13 12 10
原有代码问题说明
你之前写的循环逻辑存在几个错误:
df['Close'].max()是直接计算整个列的全局最大值,不是指定动态区间的最大值range(i, i+2)仅覆盖当前行及后1行,没有包含前2行范围,也没有处理开头、结尾的边界适配- 逐行循环为非向量化计算,数据量较大时运行效率极低
内容的提问来源于stack exchange,提问作者Artrade
相关产品推荐
相关产品推荐

