时间序列学习 经典案例(2)【tsfresh】基于datetime索引的特征提取

时间:2022-11-24 11:55:32


1.使用Datetime索引从数据帧(某一个事物的多个时间点组成集合)中提取特征的案例背景

在许多情况下,假设定时进行时变测量就足够了。然而,对于大量的任务,在进行测量时考虑到这一点是很重要的。例如医疗保健,生命体征测量的间隔时间包含重要信息。

注意:这种提取是针对分类的情况对时间进行提取的,提取之后不再存在显性的时间。一般用于分类聚类,少用于预测,且一般用于不固定的时间间隔。

此外,本质上来说这是一种抽取特征的方法,比如本案例中,id 代表了某一个事物,这里有事物a、b,然后事物a 有多个时间点,事物b有多个时间点;拿a来说,a的多个时间点组成了一个集合,对这个集合进行抽取特征,那么这些特征可代表a用来把a和b区分开来。

Tsfresh现在支持使用timeseries容器的索引来计算特性的计算器函数。这些函数的唯一要求是输入数据帧的索引是​​pd.DatetimeIndex​​​类型。这些函数包含在新类​​TimeBasedFCParameters​​中。

注意,所有其他函数的行为都不受影响。​​extract_features()​​的设置参数既可以包含依赖索引的函数,也可以包含“常规”函数。

2.获取数据

import pandas as pd
from tsfresh.feature_extraction import extract_features
# TimeBasedFCParameters contains all functions that use the Datetime index of the timeseries container
from tsfresh.feature_extraction.settings import TimeBasedFCParameters
df = pd.DataFrame({"id": ["a", "a", "a", "a", "b", "b", "b", "b"], 
"value": [1, 2, 3, 1, 3, 1, 0, 8],
"kind": ["temperature", "temperature", "pressure", "pressure",
"temperature", "temperature", "pressure", "pressure"]},
index=pd.DatetimeIndex(
['2019-03-01 10:04:00', '2019-03-01 10:50:00', '2019-03-02 00:00:00', '2019-03-02 09:04:59',
'2019-03-02 23:54:12', '2019-03-03 08:13:04', '2019-03-04 08:00:00', '2019-03-04 08:01:00']
))
df = df.sort_index()
df

时间序列学习 经典案例(2)【tsfresh】基于datetime索引的特征提取

3.构建一个带有Datetime索引的时间序列容器

构建一个带有datetime索引的数据帧。格式必须包含一个value和一个kind列,因为每个度量值都有自己的时间戳——也就是说,不假设度量值是同步的。

现在TimeBasedFCParameters只包含linear_trend_timewise,它执行线性趋势的计算,但为了执行线性回归,使用测量之间的小时时间差。和往常一样,可以在tsfresh/feature_extraction/feature_calculators.py中添加自己的函数。

settings_time = TimeBasedFCParameters()
settings_time

时间序列学习 经典案例(2)【tsfresh】基于datetime索引的特征提取


提取特征,指定列值、类型和id。

X_tsfresh = extract_features(df, column_, column_value='value', column_kind='kind',
default_fc_parameters=settings_time)
X_tsfresh.head()

时间序列学习 经典案例(2)【tsfresh】基于datetime索引的特征提取


输出看起来和往常一样。如果将其与“常规”的线性趋势特征计算器进行比较,可以看到截距、p和R值是相同的,正如所期望的那样——只是斜率现在不同了。

settings_regular = {'linear_trend': [
{'attr': 'pvalue'},
{'attr': 'rvalue'},
{'attr': 'intercept'},
{'attr': 'slope'},
{'attr': 'stderr'}
]}

X_tsfresh = extract_features(df, column_, column_value='value', column_kind='kind',
default_fc_parameters=settings_regular)
X_tsfresh.head()

时间序列学习 经典案例(2)【tsfresh】基于datetime索引的特征提取

4.编写自己的基于时间的功能计算器

编写自己的基于时间的功能计算器与平常没有什么不同。只有两个新属性必须使用​​@set_property​​ 装饰器设置:

  • ​@set_property("input", "pd. series ")​​​告诉函数函数的输入是一个​​pd.Series​​而不是numpy数组。
  • ​@set_property("index_type", pd.DatetimeIndex)​​​告诉函数,输入是一个​​DatetimeIndex​​,允许它根据时间数据类型执行计算。

例如,如果想要编写一个函数来计算第一次和最后一次测量之间的时间,它可以像这样:

@set_property("input", "pd.Series")
@set_property("index_type", pd.DatetimeIndex)
def timespan(x, param):
ix = x.index

# Get differences between the last timestamp and the first timestamp in seconds, then convert to hours.
times_seconds = (ix[-1] - ix[0]).total_seconds()
return times_seconds / float(3600)