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

如何在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与期望一致:

valwtcum_wt_avgrolling_cum_wt_avg_2periods
11002100100.0
23003220220.0
32005210237.5

参数说明

  • window=2:设置滚动窗口大小为2
  • min_periods=1:允许窗口最小包含1个元素,避免第一行出现NaN,匹配示例需求
  • raw=False(仅方法2需要):确保rolling.apply()传递的是DataFrame对象,而非数组,方便同时访问val和wt列

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 07:27:26