Python TSFRESH-对称滑动窗口提取的特征

Python TSFRESH-对称滑动窗口提取的特征,python,pandas,time-series,feature-extraction,tsfresh,Python,Pandas,Time Series,Feature Extraction,Tsfresh,作为原始数据,我们对数据集中的每个受试者每30秒(i=0,30,60,90,…720,…)进行测量 我希望使用TSFRESH(软件包)提取时间序列特征,以便对于时间I的兴趣点,基于对称滚动窗口计算特征。 我们希望基于i之前3小时和i之后3小时的上下文测量来计算时间点i,j的特征向量。 因此,721 dim特征向量表示被6小时“上下文”包围的关注点,即关注点之前的360次测量和之后的360次测量。 对于每个感兴趣的点,应该基于721个m_{i,j}的测量值来提取特征 我曾尝试在滚动时间序列()中使

作为原始数据,我们对数据集中的每个受试者每30秒(
i=0,30,60,90,…720,…
)进行测量

我希望使用TSFRESH(软件包)提取时间序列特征,以便对于时间
I
的兴趣点,基于对称滚动窗口计算特征。

我们希望基于
i
之前3小时和
i
之后3小时的上下文测量来计算时间点
i,j
的特征向量。 因此,721 dim特征向量表示被6小时“上下文”包围的关注点,即关注点之前的360次测量和之后的360次测量。 对于每个感兴趣的点,应该基于721个
m_{i,j}
的测量值来提取特征


我曾尝试在
滚动时间序列()
中使用
rolling\u direction
参数,但唯一的选项是在“时间”中向前或向后滚动-我正在寻找一种方法在特征计算中同时包含“过去”和“未来”数据。

如果我正确理解你的想法,甚至可以只用单面滚动来实现这一点。让我们举一个例子:

你想预测8:00的时间,你需要从5:00到11:00的数据。 如果以6h的大小和正滚动方向滚动数据,则最终将得到一个数据集,该数据集也正好包含这部分数据(5:00到11:00)。通常,它将用于11:00(或12:00)时的值训练-但没有任何东西阻止您使用它来预测8:00时的值。 基本上,这只是重新编制索引的问题

(负滚动方向实际上也是如此)

一种“变通”解决方案:

使用“
滚动时间序列
”功能两次;一个用于“向后”滚动(设置
滚动方向=1
),第二个用于“向前”(
滚动方向=-1
),然后将它们合并为一个

这将为原始数据集中的每个时间点
m{i,j}
$提供一个时间序列滚动对象,该对象具有360个“过去”值和360个“未来”值(即时间点位于窗口的中心,并且
max_timeshift=360

请注意以下
pandas
函数的使用:
concat()、sort_values()、drop_duplicates()
——这些函数是必须的,此解决方案才能工作

import numpy as np
import pandas as pd
from tsfresh.utilities.dataframe_functions import roll_time_series
from tsfresh.feature_extraction import EfficientFCParameters, MinimalFCParameters

rolled_backward = roll_time_series(activity_data,
                                           column_id=id_column,
                                           column_sort=sort_column,
                                           column_kind=None,
                                           rolling_direction=1,
                                           max_timeshift=360)

rolled_farward = roll_time_series(activity_data,
                                           column_id=id_column,
                                           column_sort=sort_column,
                                           column_kind=None,
                                           rolling_direction=-1,
                                           max_timeshift=360)

        # merge into one dataframe, with rolled_farward and rolled_backward window for every time point (sample)
        df = pd.concat([rolled_backward, rolled_farward])

        # important! - sort and drop duplicates
        df.sort_values(by=[id_column, sort_column], inplace=True)
        df.drop_duplicates(subset=[id_column, sort_column, 'activity'], inplace=True, keep='first')