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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 02:20:37