如何将多变量时间序列DataFrame按20秒窗口分组适配sktime
为sktime和MiniRocket准备时间序列分类数据
目标
我正尝试为基于sktime和MiniRocket的时间序列分类准备数据,分类将基于20秒的时间窗口进行。数据需要以多层索引(MultiIndex)的pandas DataFrame形式提供给MiniRocket,示例如下:
id name 20_s_window 1 A 0.469112 0.684662 1.462547 B -0.282863 ... 2 A -1.509059 ... B -1.135632 ... 3 A 1.212112 ... B -0.173215 ... 4 A 0.119209 ... B -1.044236 ...
每个“id”行代表20秒的数据。
但我当前的DataFrame格式如下:
A B 1 0.469112 -0.282863 2 0.684662 ...
其中A的所有数据在同一列,以此类推,行索引为毫秒级时间。
已尝试方案
我最接近预期结果的代码如下:
df["timestamp"] = pd.to_datetime(df.index, unit="ms") df_transpose = df.groupby(pd.Grouper(key="timestamp", freq="20s")).apply( lambda x: [x[track].tolist() for track in df.columns] )
得到的结果为:
timestamp 1970-01-01 00:05:00 [[69.19940185546875, 68.21199798583984, 68.211... 1970-01-01 00:05:20 [[82.0363998413086, 81.04889678955078, 79.0739... 1970-01-01 00:05:40 [[67.22450256347656, 67.22450256347656, 67.224... 1970-01-01 00:06:00 [[62.287200927734375, 63.27470016479492, 62.28...
问题在于所有列的数据都被放到同一行的列表中,而非拥有独立的索引。
我还尝试先创建多层索引DataFrame:
col = ["A", "B"] indexes = list(range(10)) iterables = [indexes, col] df = pd.MultiIndex.from_product(iterables, names=["col", "index"])
得到的对象如下:
MultiIndex([(0, 'A'), (0, 'B'), (1, 'A'), (1, 'B'), (2, 'A'), (2, 'B'), (3, 'A'), (3, 'B'), (4, 'A'), (4, 'B')], names=['col', 'index'])
但我不知道如何将原始DataFrame的数据填入其中。
可复现示例
数据代码:
import pandas as pd tracks = ["A", "B", "C"] values = [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]] df = pd.DataFrame(values, columns=tracks) df["timestamp"] = pd.to_datetime(df.index, unit="s") grouper = pd.Grouper(key="timestamp", freq="2s") df_transpose = df.groupby(grouper).apply( lambda x: [x[track].tolist() for track in df.columns if track != "timestamp"] )
我希望将该DataFrame按2行的窗口分组,目标格式如下:
id name values 1 A 1 2 1 B 5 6 1 C 9 10 2 A 3 4 2 B 7 8 2 C 11 12
但实际得到的是:
id 1970-01-01 00:00:00 [[1, 2], [5, 6], [9, 10]] 1970-01-01 00:00:02 [[3, 4], [7, 8], [11, 12]]
请问是否有方法实现目标格式?
最终解决方案
后续发现之前误解了sktime的输入结构,使用以下代码得到了符合要求的格式:
df["timestamp"] = pd.to_datetime(df.index, unit="ms") grouper = pd.Grouper(key="timestamp", freq="20s") out = ( df.assign( window=(g := df.groupby(grouper)).ngroup().add(1), row=g.cumcount().add(1) ) .drop(columns="timestamp") .set_index(["window", "row"]) )
最终得到的格式如下:
A B C window row 1 1 1 5 9 2 2 6 10 2 1 3 7 11 2 4 8 12
内容的提问来源于stack exchange,提问作者Côme Vincent
相关产品推荐
相关产品推荐

