如何用Pandas计算5分钟销售增量及25分钟均值(多门店场景)
解决方案
你之前计算出的数值过高,核心原因是没有按门店(LocationNumber)拆分分组,把所有门店的5分钟销售额混在一起累加了。下面是针对多门店场景的完整实现步骤:
步骤1:转换日期格式并按门店+5分钟粒度聚合
先将Date列转为datetime类型,再同时按门店编号和5分钟时间窗分组,对销售额求和得到各门店每个5分钟区间的销售额:
import pandas as pd # 转换日期列格式 df['Date'] = pd.to_datetime(df['Date']) # 按门店+5分钟时间窗分组求和 five_min_sales = df.groupby( ['LocationNumber', pd.Grouper(key='Date', freq='5min')] )['Sales'].sum().reset_index(name='Five_minute_sales')
步骤2:计算每25分钟的滚动平均值
25分钟对应5个5分钟周期,因此对每个门店的5分钟销售额做滚动窗口为5的均值计算,前面不足5个周期的结果填充为0:
# 按门店分组计算滚动均值,不足周期的填0 five_min_sales['25_minute Average'] = five_min_sales.groupby('LocationNumber')['Five_minute_sales'].rolling( window=5, min_periods=1 ).mean().reset_index(drop=True).fillna(0) # 可选:将Date设为索引,对齐示例格式 five_min_sales = five_min_sales.set_index('Date')
关键注意点
- 必须先按
LocationNumber分组再处理时间窗,否则会把不同门店的销售数据无差别累加,导致数值虚高 freq='5min'会自动将时间对齐到最近的5分钟整点(比如18:57:34会归到18:55:00)- 滚动参数
min_periods=1保证即使不足5个周期也能计算均值,最后用fillna(0)将前4个周期的结果转为0,和你的示例输出逻辑一致
示例输出(基于你的测试数据)
处理后会得到按门店拆分的结果,示例片段如下:
LocationNumber Five_minute_sales 25_minute Average Date 2022-02-01 15:25:00 6457 15.0 15.0 2022-02-01 15:55:00 3986 15.0 15.0 2022-02-01 18:55:00 8744 18.0 18.0 2022-02-02 11:50:00 5489 11.0 11.0 2022-02-03 14:30:00 1578 14.0 14.0
内容的提问来源于stack exchange,提问作者Aayush Sethi
相关产品推荐
相关产品推荐

