Pandas按id分组计算两个90天周期销售总额差值的简化方法
实现方法
核心思路是不用创建多个临时DataFrame,通过条件聚合一次性计算两个窗口的求和结果,再做差值计算,代码更简洁高效。
前置准备
首先确保date列是datetime类型:
import pandas as pd # 数据读取后先转换日期格式 df['date'] = pd.to_datetime(df['date'])
定义时间边界
根据你指定的当日日期(示例为2021-10-13),直接计算两个90天窗口的起止时间:
current_date = pd.to_datetime('2021-10-13') # 窗口1:以当日为终点的近90天 end_1 = current_date start_1 = end_1 - pd.DateOffset(days=90) # 窗口2:以30天前为终点的近90天 end_2 = current_date - pd.DateOffset(days=30) start_2 = end_2 - pd.DateOffset(days=90)
单步分组聚合计算
提前定义区间筛选掩码提升性能,直接在groupby中完成两个区间的求和计算,无需额外合并操作:
# 提前定义两个区间的筛选掩码,避免分组时重复计算 mask_recent = (df['date'] >= start_1) & (df['date'] <= end_1) mask_30d_ago = (df['date'] >= start_2) & (df['date'] <= end_2) result = df.groupby('id').agg( sum_recent=('value', lambda x: x[mask_recent.loc[x.index]].sum()), sum_30d_ago=('value', lambda x: x[mask_30d_ago.loc[x.index]].sum()) ).assign(fluctuation=lambda x: x['sum_recent'] - x['sum_30d_ago']).reset_index()
最终得到的result就包含每个id的两个区间求和结果和最终波动值。
扩展场景(可选)
如果你需要对多个日期批量计算这个波动值,可以用pandas的时间滚动窗口功能:先按id和日期排序后设置时间索引,再用rolling('90D').sum()计算滚动90天总和,再偏移30天做差值即可。
内容的提问来源于stack exchange,提问作者luizsantag
相关产品推荐
相关产品推荐

