如何用Pandas实现过去4周至2周的偏移滚动窗口统计?
解决方案
要提取t=-4周至t=-2周这个区间的质量数据均值,不需要自定义复杂函数,用Pandas滚动窗口的差值法就能简洁实现,核心思路是用两个不同窗口的滚动总和做差,得到中间区间的统计值。
前提准备
首先确保你的数据满足两个条件:
- 时间列已转为
datetime类型,且设为DataFrame的索引 - 数据已按时间(或供应商+时间)排序
基础实现(单供应商场景)
# 设置时间索引并排序 df = df.set_index('date').sort_index() # 计算过去28天(截至当前时间的前1天)的滚动总和 rolling_28d_sum = df['score'].rolling(window='28d', closed='left').sum() # 计算过去14天(截至当前时间的前1天)的滚动总和 rolling_14d_sum = df['score'].rolling(window='14d', closed='left').sum() # 中间14天(t-4w 到 t-2w)的均值 = (28天总和 - 14天总和)/ 14 df['average_score_t-4w_to_t-2w'] = (rolling_28d_sum - rolling_14d_sum) / 14
多供应商分组场景
如果数据包含多个供应商,需要先按供应商分组再执行滚动计算:
# 设置时间索引并排序 df = df.set_index('date').sort_index() # 按供应商分组 grouped = df.groupby('supplier_id') # 分组计算滚动总和 rolling_28d_sum = grouped['score'].rolling(window='28d', closed='left').sum() rolling_14d_sum = grouped['score'].rolling(window='14d', closed='left').sum() # 计算分组后的区间均值 df['average_score_t-4w_to_t-2w'] = (rolling_28d_sum - rolling_14d_sum) / 14
原理说明
window='28d'的滚动窗口覆盖了当前时间t往前推28天到前1天的所有数据window='14d'的滚动窗口覆盖了当前时间t往前推14天到前1天的所有数据- 两者的总和差值,正好是
t往前推28天到15天(也就是t-4周到t-2周)这14天的数据总和,除以14就得到了目标区间的均值
参数调整
如果需要调整区间的闭合规则(比如是否包含t-14天的当天数据),可以修改closed参数:
closed='left':排除窗口的右边界(即不包含t-1天的数据)closed='right':包含窗口的右边界- 根据你的数据时间粒度(天/小时等)选择合适的参数即可
内容的提问来源于stack exchange,提问作者Job E
相关产品推荐
相关产品推荐

