You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简洁实现基于过去数年同月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.tail(10)输出截图
  • df.head(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)

思路说明:

  1. 先将日期列转为datetime类型,提取月份用于分组,确保只计算同月的历史值
  2. 通过循环遍历需要计算的年数,批量生成对应的均值特征
  3. groupby('month')['y'].shift(1):在同月份组内,将y值向上移位一位(即获取上一年同月的y值)
  4. rolling(n).mean():对移位后的序列取窗口为n的均值,即过去n年同月y值的平均

这种方式的优势在于:后续需要新增更多年份的均值特征时,只需修改target_years列表即可,无需重复编写移位、均值计算的代码,可读性和可维护性更强。


内容的提问来源于stack exchange,提问作者ah bon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 03:55:37