将单索引时间序列DataFrame转换为sktime要求的多索引格式
格式转换实现方案
完全可以完成这种滚动窗口格式转换,以下是具体实现步骤及代码示例:
1. 模拟原始数据(以Time为索引的多变量时间序列)
先构造和你数据结构一致的示例数据:
import pandas as pd import numpy as np from sktime.datatypes import convert_to # 生成示例时间索引与多变量数据 time_index = pd.date_range(start='2023-01-01', periods=5, freq='D') raw_df = pd.DataFrame( { 'Var1': [1, 2, 3, 4, 5], 'Var2': [10, 20, 30, 40, 50], 'Var3': [100, 200, 300, 400, 500] }, index=time_index )
2. 转换为(instance, time)多索引的滚动窗口格式
提供两种实现方式,可根据需求选择:
方式一:Pandas手动构造滚动窗口
适合需要自定义窗口逻辑的场景:
window_size = 3 # 生成所有窗口的起始时间点 window_starts = raw_df.index[:-window_size+1] # 遍历每个窗口,生成对应instance的数据 instance_dfs = [] for instance_id, start in enumerate(window_starts): end = start + pd.Timedelta(days=window_size-1) window_data = raw_df.loc[start:end].reset_index() window_data['instance'] = instance_id instance_dfs.append(window_data) # 合并数据并设置多索引 target_df = pd.concat(instance_dfs).set_index(['instance', 'Time']).sort_index()
方式二:使用sktime原生工具
更贴合sktime生态,适合后续直接对接sktime算法的场景:
from sktime.forecasting.model_selection import SlidingWindowSplitter # 先将单索引数据转为sktime兼容的面板格式 panel_data = convert_to(raw_df, to_type='pd-multiindex') # 初始化滑动窗口拆分器 splitter = SlidingWindowSplitter(window_length=window_size, fh=0) # 提取每个窗口数据并构造多索引结构 window_panels = [] for instance_id, (train_idx, _) in enumerate(splitter.split(panel_data)): window = panel_data.iloc[train_idx] window = window.reset_index(level=0, drop=True) window = window.assign(instance=instance_id).set_index('instance', append=True).swaplevel() window_panels.append(window) target_df = pd.concat(window_panels).sort_index()
3. 格式验证
最终生成的target_df将以(instance, time)为双层索引,每个instance对应一个窗口大小为3的时间序列片段,完全符合sktime的输入要求。
内容的提问来源于stack exchange,提问作者Aditya Kumar
相关产品推荐
相关产品推荐

