如何在Pandas中计算窗口周期为2的滚动累积加权平均值?
实现窗口周期为2的滚动累积加权平均值
已知通过以下代码计算全局累积加权平均值:
df["cum_wt_avg"] = df['val'].mul(df['wt']).cumsum().div(df['wt'].cumsum())
要实现窗口大小为2的滚动版本,可通过以下两种方式完成:
方法1:向量化滚动计算(高效推荐)
直接分别计算窗口内的加权和与权重和,再做除法,这种方式避免自定义函数的开销,适合大数据集:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'val': [100, 300, 200], 'wt': [2, 3, 5] }, index=[1,2,3]) # 计算全局累积加权平均 df["cum_wt_avg"] = df['val'].mul(df['wt']).cumsum().div(df['wt'].cumsum()) # 计算窗口为2的滚动加权和与权重和 rolling_val_wt_sum = df['val'].mul(df['wt']).rolling(window=2, min_periods=1).sum() rolling_wt_sum = df['wt'].rolling(window=2, min_periods=1).sum() # 得到滚动累积加权平均值 df['rolling_cum_wt_avg_2periods'] = rolling_val_wt_sum.div(rolling_wt_sum)
方法2:自定义窗口函数(直观易懂)
如果需要更灵活的窗口逻辑,可以定义自定义函数传入rolling.apply():
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'val': [100, 300, 200], 'wt': [2, 3, 5] }, index=[1,2,3]) # 计算全局累积加权平均 df["cum_wt_avg"] = df['val'].mul(df['wt']).cumsum().div(df['wt'].cumsum()) # 定义窗口内加权平均函数 def window_weighted_avg(window_df): return (window_df['val'] * window_df['wt']).sum() / window_df['wt'].sum() # 应用滚动窗口计算,min_periods=1确保第一行输出有效值 df['rolling_cum_wt_avg_2periods'] = df.rolling(window=2, min_periods=1).apply(window_weighted_avg, raw=False)
验证结果
运行后得到的DataFrame与期望一致:
| val | wt | cum_wt_avg | rolling_cum_wt_avg_2periods | |
|---|---|---|---|---|
| 1 | 100 | 2 | 100 | 100.0 |
| 2 | 300 | 3 | 220 | 220.0 |
| 3 | 200 | 5 | 210 | 237.5 |
参数说明
window=2:设置滚动窗口大小为2min_periods=1:允许窗口最小包含1个元素,避免第一行出现NaN,匹配示例需求raw=False(仅方法2需要):确保rolling.apply()传递的是DataFrame对象,而非数组,方便同时访问val和wt列
内容的提问来源于stack exchange,提问作者Peslier53
相关产品推荐
相关产品推荐

