数据格式
tsfresh 提供了三种不同的选项来指定与函数 tsfresh.extract_features()
一起使用的时间序列数据的格式(以及所有期望时间序列的实用函数,例如 tsfresh.utilities.dataframe_functions.roll_time_series()
)。
无论输入格式如何,tsfresh 总是以如下所述的相同输出格式返回计算的特征。
通常,输入格式选项是 pandas.DataFrame
对象,我们将在本文中讨论这些,还有 Dask 数据帧和 PySpark 计算图,这些在 大数据 中讨论。
有四种重要的列类型构成了这些数据框。每种类型都将通过机器人故障数据集中的一个示例进行描述(参见 快速开始)。
- column_id:
此列指示时间序列所属的实体。将为每个实体(id)单独提取特征。生成的特征矩阵将包含每个id一行。每个机器人是一个不同的实体,因此每组特征都有一个不同的id。
- column_sort:
此列包含允许对时间序列进行排序的值(例如,按时间戳排序)。一般来说,具有等距的时间步长,或不同id和/或种类的相同时间尺度,并不是一个要求。然而,某些功能可能仅对等距时间戳有意义。如果您省略此列,则假定DataFrame已按升序排序。每个机器人传感器测量值都有一个时间戳,用作`column_sort`。
只需要在某些数据格式上指定(见下文):
- column_value:
此列包含时间序列的实际值。这对应于机器人上不同传感器的测量值。
- column_kind:
此列表示不同时间序列类型的名称(例如,工业应用中的不同传感器,如机器人数据集中的情况)。对于每种时间序列类型,特征是单独计算的。
重要:这些列中不允许包含 NaN
、Inf
或 -Inf
值。
在接下来的段落中,我们描述了基于这些列构建的不同输入格式:
一个扁平的 DataFrame
堆叠的 DataFrame
一个扁平DataFrame的字典
通过在 tsfresh.extract_features()
函数中指定(或不指定)参数 column_value
和 column_kind
,可以区分扁平数据框和堆叠数据框。
如果你不确定选择哪一个,可以尝试扁平或堆叠的 DataFrame。
输入选项 1. 扁平 DataFrame 或宽 DataFrame
如果 column_value
和 column_kind
都设置为 None
,则假设时间序列数据在一个扁平的 DataFrame 中。这意味着每个不同的时间序列必须保存为其自己的列。
示例:想象你为不同的对象A和B记录了时间序列x和y在三个不同时间t1、t2和t3的值。你得到的结果DataFrame可能看起来像这样:
id |
时间 |
x |
y |
---|---|---|---|
A |
t1 |
x(A, t1) |
y(A, t1) |
A |
t2 |
x(A, t2) |
y(A, t2) |
A |
t3 |
x(A, t3) |
y(A, t3) |
B |
t1 |
x(B, t1) |
y(B, t1) |
B |
t2 |
x(B, t2) |
y(B, t2) |
B |
t3 |
x(B, t3) |
y(B, t3) |
现在,你想用 tsfresh 计算一些特征,所以你会传递:
column_id="id", column_sort="time", column_kind=None, column_value=None
对于提取函数,可以分别提取所有id的特征,以及分别提取x和y值的特征。你也可以省略 column_kind=None, column_value=None
,因为这是默认设置。
输入选项 2. 堆叠 DataFrame 或长 DataFrame
如果同时设置了 column_value
和 column_kind
,则假设时间序列数据是一个堆叠的 DataFrame。这意味着不同类型的时间序列没有不同的列。与扁平的 DataFrame 相比,这种表示形式有几个优点。例如,不同时间序列的时间戳不必对齐。
它不包含不同时间序列类型的不同列,而只有一列值列和一列类型列。按照我们之前的例子,数据框会是这样的:
id |
时间 |
种类 |
值 |
---|---|---|---|
A |
t1 |
x |
x(A, t1) |
A |
t2 |
x |
x(A, t2) |
A |
t3 |
x |
x(A, t3) |
A |
t1 |
y |
y(A, t1) |
A |
t2 |
y |
y(A, t2) |
A |
t3 |
y |
y(A, t3) |
B |
t1 |
x |
x(B, t1) |
B |
t2 |
x |
x(B, t2) |
B |
t3 |
x |
x(B, t3) |
B |
t1 |
y |
y(B, t1) |
B |
t2 |
y |
y(B, t2) |
B |
t3 |
y |
y(B, t3) |
然后你会设置:
column_id="id", column_sort="time", column_kind="kind", column_value="value"
最终得到相同的提取特征。你也可以省略值列,让 tsfresh
自动推断它。
输入选项 3. 扁平DataFrame的字典
除了传递一个必须由 tsfresh 按其不同种类拆分的 DataFrame 之外,您还可以提供一个从字符串类型的种类映射到仅包含该种类时间序列数据的 DataFrame 的字典。因此,您实际上是为每种时间序列使用了一个单独的 DataFrame。
示例中的数据可以被分割成两个 DataFrame,从而得到以下字典:
{ “x”: }
id
时间
值
A
t1
x(A, t1)
A
t2
x(A, t2)
A
t3
x(A, t3)
B
t1
x(B, t1)
B
t2
x(B, t2)
B
t3
x(B, t3)
,“y”:
id
时间
值
A
t1
y(A, t1)
A
t2
y(A, t2)
A
t3
y(A, t3)
B
t1
y(B, t1)
B
t2
y(B, t2)
B
t3
y(B, t3)
}
您可以将此字典与以下参数一起传递给 tsfresh:
column_id="id", column_sort="time", column_kind=None, column_value="value":
在这种情况下,我们不需要指定 kind 列,因为 kind 是相应的字典键。
输出格式
生成的特征矩阵,包含提取的特征,对于所有三种输入选项都是相同的。它将始终是一个 pandas.DataFrame
,具有以下布局:
id |
x_feature_1 |
… |
x_feature_N |
y_特征_1 |
… |
y_特征_N |
---|---|---|---|---|---|---|
A |
… |
… |
… |
… |
… |
… |
B |
… |
… |
… |
… |
… |
… |
其中,x特征是使用所有x值计算的(A和B分别独立计算),y特征是使用所有y值计算的(A和B分别独立计算),依此类推。
这个 DataFrame 也是 tsfresh 使用的特征选择算法的预期输入格式(例如 tsfresh.select_features()
函数)。