R语言如何实现仅VW品类的12个月滚动同比销售趋势计算
VW品类12个月同比销售趋势计算方案
以下是两种常用场景的实现方式,核心逻辑都是先获取上年同期销售额,再计算同比变化判断趋势:
方案1:SQL实现(基于lag窗口函数)
首先需要把日级数据聚合为月度粒度,再用lag取12个月前的对应值,支持MySQL 8.0+/PostgreSQL/Hive等支持窗口函数的数据库:
WITH monthly_vw_sales AS ( -- 过滤VW品类,聚合得到月度总销售额 SELECT DATE_FORMAT(Dates, '%Y-%m') AS year_month, -- 不同数据库日期格式化语法可调整,PG用to_char(Dates, 'yyyy-mm') SUM(Sales) AS monthly_sales FROM 你的表名 WHERE Category = 'VW' GROUP BY DATE_FORMAT(Dates, '%Y-%m') ) SELECT year_month, monthly_sales, -- 取12个月前的同期销售额 LAG(monthly_sales, 12) OVER (ORDER BY year_month) AS last_year_same_month_sales, -- 计算同比增长率,保留2位小数 ROUND((monthly_sales - LAG(monthly_sales, 12) OVER (ORDER BY year_month)) * 100.0 / LAG(monthly_sales, 12) OVER (ORDER BY year_month), 2) AS year_over_year_growth_rate FROM monthly_vw_sales ORDER BY year_month;
前12行数据因无上年同期值,对应字段会返回空,属于正常情况。
方案2:Python Pandas实现
逻辑和SQL一致,用shift(12)实现类似lag的取数效果:
import pandas as pd # 假设你已导入数据到df,且Dates字段已转为datetime类型 # 1. 过滤VW品类,按月聚合销售额 vw_df = df[df['Category'] == 'VW'].set_index('Dates') monthly_vw_sales = vw_df['Sales'].resample('M').sum().reset_index() # 2. 取12个月前的同期销售额 monthly_vw_sales['last_year_same_month_sales'] = monthly_vw_sales['Sales'].shift(12) # 3. 计算同比增长率 monthly_vw_sales['year_over_year_growth_rate'] = round( (monthly_vw_sales['Sales'] - monthly_vw_sales['last_year_same_month_sales']) * 100 / monthly_vw_sales['last_year_same_month_sales'], 2 ) # 查看结果 print(monthly_vw_sales)
注意事项
- 如果你的数据集本身就是月度粒度,可跳过聚合步骤,直接过滤
VW品类后调用lag/shift函数即可 - 计算同比增长率时如果上年同期销售额为0会触发除零错误,可新增判断逻辑过滤异常场景
- 若你需要计算滚动12个月累计销售额的同比而非单月同比,可先做滚动累计计算再求同比:SQL中用
sum(monthly_sales) over(order by year_month rows between 11 preceding and current row)计算滚动累计,Pandas中用rolling(12).sum()实现即可
内容的提问来源于stack exchange,提问作者Udo Gniß
相关产品推荐
相关产品推荐

