如何简化pandas滚动平均多移位结果求和的实现代码?
方案1:循环实现(可灵活调整移位次数,符合需求)
首先提前计算公共的3天滚动均值,避免重复计算提升效率,后续直接循环累加不同移位步长的结果即可,移位次数修改shift_total参数即可,70次直接改成70:
import pandas as pd # 原始数据构建逻辑不变 df = pd.DataFrame({ 'date': ['2021-01-01','2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05','2021-01-06','2021-01-07','2021-01-08','2021-01-09','2021-01-10'], 'value': [10,20,20,30,20,10,30,20,10,20] }) df.date = pd.to_datetime(df.loc[:, 'date'], format='%Y-%m-%d') df.set_index('date',inplace=True) # 提前计算公共的3天滚动均值,仅计算1次 rolling_mean = df.rolling(3).mean().round().fillna(0) # 定义总移位次数,示例为5次,70次直接修改为70即可 shift_total = 5 # 初始化结果为全0 df_all = pd.DataFrame(0, index=df.index, columns=df.columns) # 循环累加各次移位结果 for step in range(1, shift_total + 1): df_all += rolling_mean.shift(step).fillna(0)
方案2:向量化实现(更适合大数据量场景,效率更高)
你的需求本质是对滚动均值序列做长度为shift_total的滑动求和,可直接用pandas内置滚动求和实现,无需Python层循环,内部C语言优化执行速度更快:
# 接上面的rolling_mean计算逻辑 shift_total = 5 df_all = rolling_mean.shift(1).rolling(shift_total, min_periods=1).sum().fillna(0)
两种方案输出结果和你预期的完全一致。
内容的提问来源于stack exchange,提问作者Bluetail
相关产品推荐
相关产品推荐

