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

如何无需转换DataFrame批量生成滞后时间序列及拆分列回序列?

批量生成时间序列滞后项的方法

问题背景

已有名为m2的时间序列:

print(m2)
1960-01-01     4.047453
1960-02-01     3.719152
1960-03-01     3.492393
1960-04-01     3.447087
1960-05-01     2.977413
                ...    
2022-02-01    10.671207
2022-03-01     9.501048
2022-04-01     7.682554
2022-05-01     6.199250
2022-06-01     5.900724
Length: 750, dtype: float64

需要生成多个滞后序列(如滞后6、12、18...48个月),目前只能重复执行shift操作,希望找到批量生成方法。另外,已通过转DataFrame批量生成了滞后列:

# Convert series to DataFrame
m2_df = pd.DataFrame({'Date': m2.index, 'M2': m2.values})
m2_df['Date'] = pd.to_datetime(m2_df['Date'])
m2_df = m2_df.set_index('Date')

lags = (6, 12, 18)

df = m2_df.assign(**{
    f'{col} (t-{lag})': m2_df[col].shift(lag)
    for lag in lags
    for col in m2_df
})

输出结果:

M2   M2 (t-6)  M2 (t-12)  M2 (t-18)
Date                                                  
1960-01-01   4.047453        NaN        NaN        NaN
1960-02-01   3.719152        NaN        NaN        NaN
1960-03-01   3.492393        NaN        NaN        NaN
1960-04-01   3.447087        NaN        NaN        NaN
1960-05-01   2.977413        NaN        NaN        NaN
               ...        ...        ...        ...
2022-02-01  10.671207  13.596152  26.889066  23.040523
2022-03-01   9.501048  13.012511  24.173474  23.795052
2022-04-01   7.682554  12.854070  18.279665  23.715350
2022-05-01   6.199250  12.543622  14.484839  24.392947
2022-06-01   5.900724  12.367188  12.857088  24.842843
[750 rows x 4 columns]

需解决两个问题:

  1. 如何将上述DataFrame的列拆分并转换为对应列名的时间序列?
  2. 有没有无需在序列与DataFrame间转换的更优方法?

解决方案

一、拆分DataFrame列为独立时间序列

可以通过遍历列提取为单独Series,支持直接赋值变量或存入字典:

方法1:直接赋值给变量

# 提取原序列
m2_original = df['M2']
# 提取各滞后序列
m2_lag_6 = df['M2 (t-6)'].dropna()
m2_lag_12 = df['M2 (t-12)'].dropna()
m2_lag_18 = df['M2 (t-18)'].dropna()

方法2:批量存入字典(适合多滞后项)

用字典存储更灵活,后续可通过键名调用:

lag_series_dict = {}
for col in df.columns:
    if '(t-' in col:
        # 从列名提取滞后数
        lag_num = col.split('t-')[-1].strip(')')
        lag_series_dict[f'm2_lag_{lag_num}'] = df[col].dropna()

# 调用示例:获取滞后6个月的序列
print(lag_series_dict['m2_lag_6'])

二、无需转换DataFrame的批量生成方法

直接基于原Series批量生成,用字典存储所有滞后序列,步骤更简洁:

# 定义需要生成的滞后月份列表
lag_list = [6, 12, 18, 24, 30, 36, 42, 48]

# 批量生成并存储到字典
lag_series_dict = {}
for lag in lag_list:
    series_name = f'm2_lag_{lag}'
    lag_series_dict[series_name] = m2.shift(lag).dropna()

# 调用示例:获取滞后24个月的序列
print(lag_series_dict['m2_lag_24'])

如果需要合并为DataFrame方便后续分析,也可直接生成:

# 生成包含原序列和所有滞后项的DataFrame
lags_df = pd.DataFrame({
    'M2': m2,
    **{f'M2 (t-{lag})': m2.shift(lag) for lag in lag_list}
})

内容的提问来源于Stack Exchange,提问作者Galos Prigipas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 23:27:28