Pandas计算当前值与前置滚动均值的百分比变化率方法
实现方案
核心逻辑是先计算不包含当前值的前置滚动窗口均值,再基于该均值计算变化率即可,全程用pandas原生向量化操作,写法简洁且适配任意窗口大小,不需要硬套pct_change方法。
通用实现代码
import pandas as pd def calc_roc_vs_prev_rolling_avg(series: pd.Series, window: int) -> pd.Series: # 计算指定窗口大小的滚动均值后下移1位,确保均值仅由当前位置之前的window条数据计算 prev_window_avg = series.rolling(window=window).mean().shift(1) # 计算变化率,逻辑等价于 (当前值 - 前置滚动均值) / 前置滚动均值 return series / prev_window_avg - 1 # 测试验证 df = pd.DataFrame({'data': [1, 2, 3, 7]}) window = 2 df['result'] = calc_roc_vs_prev_rolling_avg(df['data'], window=window) print(df['result'])
输出结果
0 NaN 1 NaN 2 1.0 3 1.8 Name: result, dtype: float64
和预期结果完全一致。
说明
- 该写法完全兼容pandas滚动窗口的原生参数,如需调整最小有效样本数、窗口加权规则等,直接在
rolling()方法中传入对应参数(如min_periods、win_type)即可 - 全程为pandas底层向量化实现,性能和直接调用
pct_change基本持平,无额外循环开销 - 前window个位置会自动返回NaN,符合滚动计算的常规输出逻辑
内容的提问来源于stack exchange,提问作者Petar Ulev
相关产品推荐
相关产品推荐

