数据格式
tsfresh 提供了三种不同的选项来指定时间序列数据格式,以便与 tsfresh.extract_features() 函数(以及所有需要时间序列的实用函数,例如 tsfresh.utilities.dataframe_functions.roll_time_series())一起使用。
无论输入格式如何,tsfresh 始终会以如下所述的相同输出格式返回计算出的特征。
通常,输入格式选项是 pandas.DataFrame 对象(本文将讨论),以及 Dask 数据帧和 PySpark 计算图(此处讨论 大型输入数据)。
这些 DataFrames 由四种重要的列类型组成。每种类型都将结合机器人故障数据集的例子进行描述(参见 快速开始)。
- column_id:
- 此列指示时间序列属于哪个实体。将为每个实体(id)单独提取特征。生成的特征矩阵将包含每个 id 一行。每个机器人都是一个不同的实体,因此每组特征都有一个不同的 id。 
- column_sort:
- 此列包含允许对时间序列进行排序的值(例如按时间戳排序)。通常,不同 id 和/或 kind 的时间步长相等,或时间尺度相同,并非必需。然而,某些特征可能仅对等距时间戳有效。如果您省略此列,则假定 DataFrame 已按升序排序。每个机器人传感器测量都有一个时间戳,用作 column_sort。 
仅需在某些数据格式上指定(见下文)
- column_value:
- 此列包含时间序列的实际值。这对应于机器人上不同传感器的测量值。 
- column_kind:
- 此列指示不同时间序列类型的名称(例如工业应用中不同传感器的名称,如机器人数据集中所示)。将为每种时间序列单独计算特征。 
重要:这些列中不允许包含 NaN、Inf 或 -Inf 值。
在以下段落中,我们将描述基于这些列构建的不同输入格式:
- 平坦型 DataFrame 
- 堆叠型 DataFrame 
- 平坦型 DataFrames 字典 
平坦型和堆叠型 DataFrame 之间的区别在于,在 tsfresh.extract_features() 函数中是否指定了参数 column_value 和 column_kind。
如果您不确定选择哪种格式,可以尝试平坦型或堆叠型 DataFrame。
输入选项 1. 平坦型 DataFrame 或 宽型 DataFrame
如果 column_value 和 column_kind 都设置为 None,则假定时间序列数据为平坦型 DataFrame。这意味着每个不同的时间序列必须保存为其自己的列。
示例:假设您记录了对象 A 和 B 在三个不同时间 t1、t2 和 t3 的时间序列 x 和 y 的值。您的结果 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 有几个优点。例如,不同时间序列的时间戳不必对齐。
它不包含用于不同时间序列类型的不同列,而只包含一个值列和一个 kind 列。沿用前面的例子,DataFrame 如下所示:
| id | 时间 | kind | value | 
|---|---|---|---|
| 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. 平坦型 DataFrames 字典
除了传递一个必须由 tsfresh 按其不同 kinds 分割的 DataFrame 外,您还可以给出一个字典,将 kind(字符串)映射到仅包含该 kind 时间序列数据的 DataFrame。因此,本质上您是为每种时间序列使用一个单独的 DataFrame。
示例中的数据可以分成两个 DataFrame,形成如下字典:
{ “x”
id
时间
value
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
时间
value
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_feature_1 | … | y_feature_N | 
|---|---|---|---|---|---|---|
| A | … | … | … | … | … | … | 
| B | … | … | … | … | … | … | 
其中 x 特征是使用所有 x 值计算的(对于 A 和 B 分别计算),y 特征是使用所有 y 值计算的(对于 A 和 B 分别计算),依此类推。
此 DataFrame 也是 tsfresh 使用的特征选择算法(例如 tsfresh.select_features() 函数)预期的输入格式。