tsfresh项目中的数据格式详解:时间序列特征提取的三种输入方式
引言
在时间序列分析领域,tsfresh作为一个强大的Python工具库,能够自动从时间序列数据中提取大量特征。本文将深入探讨tsfresh支持的三种数据输入格式,帮助开发者根据自身数据结构选择最适合的格式进行特征提取。
核心概念
在开始介绍具体格式前,我们需要理解tsfresh处理数据时的四个关键列概念:
-
实体标识列(column_id):标识时间序列所属的实体或对象,特征将针对每个实体单独提取。例如在工业设备监控中,每台设备就是一个独立实体。
-
排序列(column_sort):包含用于排序时间序列的值,通常是时间戳。值得注意的是,tsfresh不要求时间步长必须等距,但某些特定特征可能要求等距时间戳。
-
数值列(column_value):包含时间序列的实际测量值,如传感器读数。
-
类型列(column_kind):标识不同类型的时间序列,如不同传感器的测量数据。
重要提示:这些列中不允许包含NaN、Inf或-Inf值,否则可能导致特征提取失败。
输入格式选项详解
1. 扁平DataFrame(宽格式)
适用场景:当每种时间序列类型都有自己独立的列时使用。
特点:
- 每种时间序列类型(如不同传感器)占据单独一列
- 不需要指定column_kind和column_value参数
- 要求所有时间序列的时间点对齐
示例结构:
| id | time | sensor1 | sensor2 |
|----|------|---------|---------|
| A | t1 | 0.5 | 1.2 |
| A | t2 | 0.6 | 1.3 |
| B | t1 | 0.4 | 1.1 |
使用方法:
extract_features(df, column_id="id", column_sort="time")
优缺点分析:
- 优点:结构直观,易于理解
- 缺点:当时间序列类型很多时,列数会急剧增加;要求所有时间序列的时间点对齐
2. 堆叠DataFrame(长格式)
适用场景:当不同类型的时间序列共享相同的时间戳或时间点不对齐时使用。
特点:
- 所有时间序列值存储在一个列中
- 使用单独的列标识时间序列类型
- 更灵活,不要求时间点对齐
示例结构:
| id | time | kind | value |
|----|------|--------|-------|
| A | t1 | sensor1| 0.5 |
| A | t2 | sensor1| 0.6 |
| A | t1 | sensor2| 1.2 |
| B | t1 | sensor1| 0.4 |
使用方法:
extract_features(df, column_id="id", column_sort="time",
column_kind="kind", column_value="value")
优缺点分析:
- 优点:结构紧凑,适合时间点不对齐的情况
- 缺点:数据量较大时,行数会显著增加
3. 扁平DataFrame字典
适用场景:当不同类型的时间序列已经存储在不同的DataFrame中时使用。
特点:
- 每种时间序列类型对应一个独立的DataFrame
- 字典键作为时间序列类型标识
- 每个DataFrame只需包含id、时间和值列
示例结构:
{
"sensor1": DataFrame1,
"sensor2": DataFrame2
}
其中DataFrame1结构:
| id | time | value |
|----|------|-------|
| A | t1 | 0.5 |
| A | t2 | 0.6 |
使用方法:
extract_features(df_dict, column_id="id", column_sort="time",
column_value="value")
优缺点分析:
- 优点:天然分离不同类型的时间序列,便于预处理
- 缺点:需要预先组织数据为字典结构
输出格式说明
无论采用哪种输入格式,tsfresh的特征提取结果都遵循相同的输出结构:
- 每行对应一个实体(由column_id指定)
- 每列对应一个特征
- 特征命名遵循"类型_特征名"的格式
示例输出:
| id | sensor1_max | sensor1_min | sensor2_max |
|----|-------------|-------------|-------------|
| A | 0.6 | 0.5 | 1.3 |
| B | 0.4 | 0.4 | 1.1 |
选择建议
对于初学者,我们推荐以下选择策略:
- 如果数据已经是宽格式(每种时间序列有独立列),使用扁平DataFrame格式
- 如果数据是长格式或时间点不对齐,使用堆叠DataFrame格式
- 如果不同类型的时间序列已经分开存储,使用字典格式
常见问题解答
Q:我的数据包含缺失值怎么办? A:tsfresh不接受包含NaN的数据,需要在特征提取前进行缺失值处理,如插值或删除。
Q:时间戳必须是等间隔的吗? A:不是必须的,但某些特征(如FFT相关特征)可能需要等间隔时间戳才能计算。
Q:可以混合使用不同类型的时间序列长度吗? A:可以,特别是使用堆叠DataFrame格式时,不同时间序列可以有不同长度。
结语
理解tsfresh的数据格式要求是有效使用该库的第一步。本文介绍的三种输入格式各有优势,开发者应根据实际数据结构和分析需求选择最适合的格式。无论选择哪种格式,tsfresh都能将其转换为统一的特征矩阵,为后续的机器学习和数据分析提供有力支持。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考