将二维多元时间序列数组转换为带滞后的多级索引DataFrame
解决多元时间序列转多级索引窗口化DataFrame的问题
需求分析
需要将形状为(n_samples, n_channels)的多元时间序列,转换为以通道名为第一级、时间滞后标签为第二级的多级列索引DataFrame,每一行对应一个不重叠的时间窗口,窗口大小为最大滞后值+1(包含当前点lag0和L个滞后点),最终行数为原始样本数除以窗口大小(需确保整除,或自行处理剩余行)。
代码实现
以下是基于Pandas和NumPy的实现方案,完全匹配你给出的示例:
import pandas as pd import numpy as np # 1. 构造原始数据(示例) df = pd.DataFrame({ 'x1': [0.23, 0.80, 0.39, 0.2, -1., 5], 'x2': [0.32, 0.68, 0.33, 0.4, -1, 8] }) # 2. 定义最大滞后值 max_lag = 2 window_size = max_lag + 1 # 窗口大小=滞后数+1(包含当前点) # 3. 数据转换核心步骤 data = df.values n_samples, n_channels = data.shape n_windows = n_samples // window_size # 处理无法整除的情况(可选:丢弃剩余行) if n_samples % window_size != 0: data = data[:n_windows * window_size] # 重塑为三维数组:(窗口数, 窗口内时间点数, 通道数) windows = data.reshape(n_windows, window_size, n_channels) # 反转每个窗口的时间顺序,让lag0(最新点)排在最前 windows_reversed = windows[:, ::-1, :] # 重塑为二维数组:(窗口数, 通道数*窗口大小) reshaped_data = windows_reversed.reshape(n_windows, -1) # 4. 构建多级列索引 channel_names = df.columns lag_labels = [f'lag{i}' for i in range(window_size)] multi_columns = pd.MultiIndex.from_product( [channel_names, lag_labels], names=['channel', 'time-lag'] ) # 5. 生成最终DataFrame result_df = pd.DataFrame(reshaped_data, columns=multi_columns) print(result_df)
输出结果
channel x1 x2 time-lag lag0 lag1 lag2 lag0 lag1 lag2 0 0.39 0.80 0.23 0.33 0.68 0.32 1 5.00 -1.00 0.20 8.00 -1.00 0.40
关键逻辑说明
- 窗口分割:通过
reshape将原始数据分割为不重叠的时间窗口,每个窗口包含max_lag+1个连续时间点 - 滞后顺序调整:反转窗口内的行顺序,确保
lag0对应窗口的最新时间点,lag1对应前一个时间点,以此类推 - 多级索引构造:用
from_product生成通道名与滞后标签的笛卡尔积,作为DataFrame的多级列索引
内容的提问来源于stack exchange,提问作者ajl123
相关产品推荐
相关产品推荐

