Pandas同比季度销售额差值计算的优化方案问询
优化同比季度销售额差值计算的简洁方案
你的现有方案可行,但可以利用Pandas内置的日期处理和分组函数大幅简化步骤,以下是两种高效实现方式:
方法一:针对已聚合的季度数据(如你提供的样本)
直接利用dt.quarter提取季度标识,结合groupby和diff/unstack完成计算,无需手动条件判断:
import pandas as pd # 加载样本数据 sample_data = [{'date': pd.Timestamp('2019-03-31 00:00:00'), '#_widgets': 4502}, {'date': pd.Timestamp('2019-06-30 00:00:00'), '#_widgets': 4388}, {'date': pd.Timestamp('2019-09-30 00:00:00'), '#_widgets': 4703}, {'date': pd.Timestamp('2019-12-31 00:00:00'), '#_widgets': 4344}, {'date': pd.Timestamp('2020-03-31 00:00:00'), '#_widgets': 4206}, {'date': pd.Timestamp('2020-06-30 00:00:00'), '#_widgets': 4281}, {'date': pd.Timestamp('2020-09-30 00:00:00'), '#_widgets': 4879}, {'date': pd.Timestamp('2020-12-31 00:00:00'), '#_widgets': 4115}, {'date': pd.Timestamp('2021-03-31 00:00:00'), '#_widgets': 4313}, {'date': pd.Timestamp('2021-06-30 00:00:00'), '#_widgets': 4578}, {'date': pd.Timestamp('2021-09-30 00:00:00'), '#_widgets': 4467}, {'date': pd.Timestamp('2021-12-31 00:00:00'), '#_widgets': 4871}] df = pd.DataFrame(sample_data) # 1. 一键提取季度(Q1-Q4格式)和年份,替代手动条件判断 df['quarter'] = 'Q' + df['date'].dt.quarter.astype(str) df['year'] = df['date'].dt.year # 2. 分组聚合+计算同比差值 # 方式A:展开年份为列,直观对比 result = df.groupby(['quarter', 'year'])['#_widgets'].sum().unstack() result['diff_2020-2019'] = result[2020] - result[2019] result['diff_2021-2020'] = result[2021] - result[2020] # 方式B:保持原始层级结构,自动计算差值 result_stack = df.groupby(['quarter', 'year'])['#_widgets'].sum().to_frame() result_stack['yoy_diff'] = result_stack.groupby(level=0)['#_widgets'].diff()
方法二:针对原始每日数据(一步到位)
如果是未聚合的每日销售额数据,直接用resample完成季度求和,结合shift计算同比:
# 假设df是包含每日销售额的原始数据 # 1. 重采样为季度总额+提取季度标识 quarterly_df = df.resample('Q', on='date')['#_widgets'].sum().reset_index() quarterly_df['quarter'] = 'Q' + quarterly_df['date'].dt.quarter.astype(str) # 2. 按季度分组,获取上一年同期数据并计算差值 quarterly_df['prev_year_sales'] = quarterly_df.groupby('quarter')['#_widgets'].shift(1) quarterly_df['yoy_diff'] = quarterly_df['#_widgets'] - quarterly_df['prev_year_sales']
核心优化点
- 用
dt.quarter替代手动月份判断,代码更简洁且避免逻辑错误 - 利用
unstack将年份转为列,更直观地对比同季度跨年度数据 - 针对每日数据,
resample('Q')一步完成季度聚合,无需额外分组操作 shift函数可以明确展示上一年同期销售额,差值计算逻辑更清晰
内容的提问来源于stack exchange,提问作者SMJune
相关产品推荐
相关产品推荐

