如何无需转换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]
需解决两个问题:
- 如何将上述DataFrame的列拆分并转换为对应列名的时间序列?
- 有没有无需在序列与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
相关产品推荐
相关产品推荐

