如何在pandas中获取total_percentage_sale列的滞后月度平均值
计算total_percentage_sale滞后月度平均值的操作方法
首先明确:下述方案默认计算的是单月滞后1期的平均值,即当月对应上一个自然月的total_percentage_sale全月平均占比,若需滞后N个月仅调整平移步长即可。
操作步骤
- 数据预处理:将date列转换为标准日期格式,提取「年月」组合字段作为分组依据,避免不同年份同月份数据混淆。
- 计算月度均值:按年月字段分组,对
total_percentage_sale列求平均值,得到每个自然月的平均销售额占比。 - 生成滞后值:将月度均值序列整体向下平移1行,得到每个月份对应的上一月平均占比,即所需的滞后月度平均值。
- 关联回原数据集:把滞后后的月度平均值按年月匹配回原始明细数据,同月份的所有商品行都会关联到对应上一月的滞后均值。
代码示例
Python Pandas 实现
import pandas as pd # 读取数据集,替换为你的实际数据路径 df = pd.read_csv("your_data_path.csv") # 日期格式处理,去掉样例中date末尾的多余点号 df['date'] = pd.to_datetime(df['date'].str.strip('.')) # 提取年月分组字段 df['year_month'] = df['date'].dt.to_period('M') # 计算每月平均销售额占比 monthly_avg = df.groupby('year_month')['total_percentage_sale'].mean().reset_index() monthly_avg.rename(columns={'total_percentage_sale': 'current_month_avg'}, inplace=True) # 生成滞后1个月的平均值 monthly_avg['lag_1_month_avg'] = monthly_avg['current_month_avg'].shift(1) # 关联回原始数据集 df = df.merge(monthly_avg[['year_month', 'lag_1_month_avg']], on='year_month', how='left')
SQL 实现(基于MySQL语法)
WITH monthly_avg AS ( -- 先计算每个月的平均销售额占比 SELECT DATE_FORMAT(`date`, '%Y-%m') AS year_month, AVG(total_percentage_sale) AS current_month_avg FROM your_table_name GROUP BY DATE_FORMAT(`date`, '%Y-%m') ), lag_monthly_avg AS ( -- 用LAG窗口函数生成滞后1个月的均值 SELECT year_month, LAG(current_month_avg, 1) OVER (ORDER BY year_month) AS lag_1_month_avg FROM monthly_avg ) -- 关联回原表得到最终结果 SELECT t.*, l.lag_1_month_avg FROM your_table_name t LEFT JOIN lag_monthly_avg l ON DATE_FORMAT(t.`date`, '%Y-%m') = l.year_month
内容的提问来源于stack exchange,提问作者StackUser
相关产品推荐
相关产品推荐

