如何简洁实现基于过去数年同月y均值的时间序列特征构建?
问题:构建过去数年同月y均值特征的简洁实现
我们有数据集df,需要构建基于过去数年同月y值的均值特征,比如y_avg_last2、y_avg_last3、y_avg_last4等:
- 以2022年9月为例,
y_avg_last2是2021年9月与2020年9月的y值均值 y_avg_last3是2021、2020、2019年9月的y值均值
当前使用的代码重复繁琐,如下:
df['y_shift12'] = df['y'].shift(12) df['y_shift24'] = df['y'].shift(24) df['y_shift36'] = df['y'].shift(36) df['y_avg_last2'] = df.loc[:, 'y_shift12': 'y_shift24'].mean(axis=1) df['y_avg_last3'] = df.loc[:, 'y_shift12': 'y_shift36'].mean(axis=1) df.drop(['y_shift12', 'y_shift24', 'y_shift36'], axis=1, inplace=True) df
数据预览
df.tail(10)输出:
df.head(10)输出:
简洁实现方案
可以通过分组+循环批量生成特征的方式简化代码,避免手动创建多个移位列:
import pandas as pd # 确保日期列为datetime类型(假设日期列名为'date') df['date'] = pd.to_datetime(df['date']) # 提取月份作为分组依据 df['month'] = df['date'].dt.month # 定义需要计算的过去年数列表 target_years = [2, 3, 4] for n in target_years: # 按月份分组后,取组内上一年及之前共n年的同月y值均值 df[f'y_avg_last{n}'] = df.groupby('month')['y'].shift(1).rolling(n).mean() # 若不需要保留month列,可删除 # df.drop('month', axis=1, inplace=True)
思路说明:
- 先将日期列转为datetime类型,提取月份用于分组,确保只计算同月的历史值
- 通过循环遍历需要计算的年数,批量生成对应的均值特征
groupby('month')['y'].shift(1):在同月份组内,将y值向上移位一位(即获取上一年同月的y值)rolling(n).mean():对移位后的序列取窗口为n的均值,即过去n年同月y值的平均
这种方式的优势在于:后续需要新增更多年份的均值特征时,只需修改target_years列表即可,无需重复编写移位、均值计算的代码,可读性和可维护性更强。
内容的提问来源于stack exchange,提问作者ah bon
相关产品推荐
相关产品推荐

