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

Pandas滚动窗口优化:替代循环计算涨跌均值和的高效方法

高效实现滚动窗口正负值均值求和

问题背景

现有DataFrame包含Change列,需要基于窗口大小100的滚动窗口,分别计算窗口内正值的均值、负值的均值,再将两个均值相加。原循环遍历的方法运行速度慢,需要更高效的实现方案。

高效实现方案

利用pandas的向量化滚动操作替代Python循环,大幅提升运行效率,代码如下:

import pandas as pd
import numpy as np

# 构造示例数据(可替换为你的真实数据)
df = pd.DataFrame({'Change': [-0.5, -0.25, 1, 1.5, 0.25, -0.75, -1, 2] + [0]*92 + [0.5, -0.3]*50})

# 分离正负值:将正值保留在positive列,负值保留在negative列,不符合条件的设为NaN
df['positive'] = df['Change'].mask(df['Change'] <= 0)
df['negative'] = df['Change'].mask(df['Change'] >= 0)

window_size = 100

# 滚动计算窗口内的总和与有效数据点数量(仅当窗口包含完整100条数据时计算)
roll_pos_sum = df['positive'].rolling(window=window_size, min_periods=window_size).sum()
roll_pos_count = df['positive'].rolling(window=window_size, min_periods=window_size).count()
roll_neg_sum = df['negative'].rolling(window=window_size, min_periods=window_size).sum()
roll_neg_count = df['negative'].rolling(window=window_size, min_periods=window_size).count()

# 计算均值:处理窗口内无正/负值的情况(此时均值设为NaN)
pos_mean = np.where(roll_pos_count > 0, roll_pos_sum / roll_pos_count, np.nan)
neg_mean = np.where(roll_neg_count > 0, roll_neg_sum / roll_neg_count, np.nan)

# 得到最终的diff列
df['diff'] = pos_mean + neg_mean

# 可选:删除临时生成的positive和negative列
df.drop(['positive', 'negative'], axis=1, inplace=True)

方案优势

  • 性能提升:pandas的滚动sum/count是内部优化的向量化操作,相比Python循环,数据量越大,速度差距越明显(百万级数据下能快几十甚至上百倍)。
  • 逻辑清晰:通过分离正负列,把复杂的窗口过滤计算拆解为简单的滚动统计,可读性更强。
  • 边界处理:通过min_periods=window_size确保只有完整100条数据的窗口才会计算结果,和原逻辑保持一致;同时用np.where处理窗口内无正/负值的情况,避免除以0的错误。

内容的提问来源于stack exchange,提问作者top bantz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 19:15:31