You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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']

结果验证

执行上述代码后得到的计算结果和你给出的预期完全一致:

Closewindow_maxis_range_max
1013False
1213False
1313True
915False
1117False
1517False
1717True
1317False
1213False
1013False

如果需要输出带// 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:24:16