如何用Pandas实现窗口大小为3的混合滚动均值计算?
计算混合滚动窗口均值的实现方案
根据需求,我们需要构造大小为3的滚动窗口,每个窗口的取值规则是:取当前行的b列值,再加上前1或2行的a列值(窗口内最多包含2个历史a值),最后计算这些值的平均值。具体对应逻辑如下:
- 第0行:仅取当前行
b值,均值为10/1=10.0 - 第1行:当前行
b值 + 前1行a值,均值为(20+1)/2=10.5 - 第2行及以后:当前行
b值 + 前2行a值,均值为(b[i]+a[i-1]+a[i-2])/3
方法一:手动构造计算(高效直观)
通过shift函数获取历史a值,结合位置确定分母,直接计算:
import pandas as pd df = pd.DataFrame.from_dict({'a':[1, 2, 3, 4, 5], 'b':[10, 20, 30, 40, 50]}) # 计算分子:当前b + 前1行a + 前2行a(缺失补0) sum_vals = df['b'] + df['a'].shift(1).fillna(0) + df['a'].shift(2).fillna(0) # 计算分母:第0行取1,第1行取2,第2行及以后取3 denominator = df.index.map(lambda x: min(x + 1, 3)) # 得到目标列 df['hybrid_mean_3'] = sum_vals / denominator
方法二:滚动窗口自定义函数(通用扩展性强)
利用rolling窗口结合自定义函数,适配更复杂的窗口规则:
import pandas as pd df = pd.DataFrame.from_dict({'a':[1, 2, 3, 4, 5], 'b':[10, 20, 30, 40, 50]}) def hybrid_calc(window): # 取窗口最后一行的b值 current_b = window['b'].iloc[-1] # 取窗口中除最后一行外的所有a值(最多2个) history_a = window['a'].iloc[:-1] # 计算均值 return (current_b + history_a.sum()) / (1 + len(history_a)) # 设置窗口大小3,允许最小窗口为1 df['hybrid_mean_3'] = df.rolling(window=3, min_periods=1).apply(hybrid_calc, raw=False)
两种方法最终得到的hybrid_mean_3列都与示例结果一致:
a b hybrid_mean_3 0 1 10 10.0 1 2 20 10.5 2 3 30 11.0 3 4 40 15.0 4 5 50 19.0
内容的提问来源于stack exchange,提问作者Baron Yugovich
相关产品推荐
相关产品推荐

