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

将二维多元时间序列数组转换为带滞后的多级索引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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 20:05:33