时间序列特征提取利器:18个高效Python库全解析

介绍了18个用于时间序列特征提取的Python库,方便数据科学家进行更深入的分析与建模。

原文标题:时间序列特征提取:18 种高效工具库及其应用分析

原文作者:数据派THU

冷月清谈:

本文深入探讨了时间序列特征提取的重要性及其在数据科学中的应用,详细介绍了18个强大的Python库,这些库能够帮助数据科学家从时间序列数据中提取关键特征,从而进行更深入的分析和建模,文章对每个库的功能特点、适用领域和资源链接进行了详细介绍,旨在为读者提供全面的时间序列特征提取工具选择指南,以便在实际项目中高效地利用这些工具。

怜星夜思:

1、文章提到了很多时间序列特征提取的库,如果让你选择,针对金融市场数据,你觉得除了ta-lib,哪个库在处理高噪声、不规则采样等方面会比较有优势?为什么?
2、文章中提到了tsfresh可以通过统计检验筛选特征,避免冗余。在实际应用中,你有什么经验可以分享,如何更好地利用这种自动化的特征选择方法,避免过度拟合或者丢失关键信息?
3、eeglib 专门用于脑电图分析,提取神经信号特征。如果想用类似的方法分析其他生物信号,比如心电图 (ECG),你觉得 eeglib 里的哪些特征提取方法可以直接借鉴?又有哪些地方需要特别注意和调整?

原文内容

来源:DeepHub IMBA
本文约4300字,建议阅读8分钟
本文详细介绍 18 种专业的 Python 库。


时间序列特征提取是数据科学工作流程中的关键环节,能够将原始时间序列数据转化为具有分析价值的特征表示。本文详细介绍 18 种专业的 Python 库,这些库可用于从时间序列数据中提取关键特征,支持数据科学家进行更深入的分析与建模。


时间序列特征提取的理论基础与价值


时间序列特征是对时间序列数据的统计量化表示,例如均值、方差、季节强度等指标。特征提取在时间序列分析中具有多重价值:


首先,特征提取提供了统一的数据表示方法。不同时间序列可能具有不同长度和采样频率,通过将其转换为固定维度的特征向量,可实现降维处理并使不同序列间的比较更加标准化和有意义。


其次,提取的特征具有较高的可解释性。通过诸如季节性强度、趋势变化率等指标,分析人员能够快速理解时间序列的基本结构和动态特性,而这些洞察往往难以直接从原始数据点中获取。


第三,精心设计的特征可显著提升模型性能。在聚类、分类或预测等多种机器学习任务中,良好的特征工程通常比复杂的模型架构更能提高最终效果。


鉴于时间序列特征提取的重要性,学术界和工业界开发了众多专业框架。下文将详细介绍 18 个基于 Python 的框架,这些框架涵盖了通用特征提取以及针对特定领域(如医疗健康、金融)和特定任务(如预测、异常检测)的专业化特征。


以下框架按功能特点进行介绍,而非按重要性排序。


1、 tsfeatures


tsfeatures 是时间序列特征提取领域的开创性框架,提供了丰富的特征集,包括基于自相关函数的特征、分解统计特征、熵测量以及平稳性检验等。


该框架最初设计用于预测模型选择,特别是在组合预测模型方面表现突出。基于 tsfeatures 开发的 FFORMA(特征型预测模型平均)方法在著名的 M4 预测竞赛中获得第二名的优异成绩,验证了其特征提取的有效性。


tsfeatures 最初在 R 语言环境中开发,后由 Nixtla 团队实现了同名的 Python 版本。Python 版本与 Nixtla 的时间序列分析生态系统实现了良好集成,提供了一致的用户体验。对于 R 用户,feasts 包提供了 tsfeatures 与 tsibble 和 tidyverse 的集成,并扩展了额外功能。


资源链接:
https://github.com/Nixtla/tsfeatures


2、 tsfresh



tsfresh 是一个综合性的时间序列特征提取框架,其核心优势在于能自动计算数百种特征,并通过统计检验方法筛选出最相关且非冗余的特征子集。


该框架与 scikit-learn 生态系统完全兼容,可无缝集成到机器学习工作流中。此外,tsfresh 支持用户自定义特征,允许研究人员将领域知识融入特征工程流程中,从而提高模型的适应性和精确度。


资源链接:
https://tsfresh.readthedocs.io/en/latest/index.html


3、 tsfel



tsfel(时间序列特征提取库)是另一个专业的时间序列特征提取 Python 库,提供了全面的特征提取功能。


tsfel 的特征体系分为四个主要类别:统计类特征(如熵测量、基于直方图的特征)、时域特征(如自相关系数)、频域特征(如功率谱密度)以及分形特征(如去趋势波动分析)。这种多维度的特征体系使其能够捕捉时间序列的不同方面。


tsfel 的一个显著优势是其考虑了计算资源约束的场景,特别适用于从嵌入式设备(如可穿戴设备)收集的数据分析。实证研究表明,tsfel 在人类活动识别、康复监测和异常检测等应用中表现出色。研究[1]进一步证实,相较于其他同类工具,tsfel 在计算效率方面具有明显优势。


资源链接:https://github.com/fraunhoferportugal/tsfel


4、 TODS


TODS(时间序列异常检测系统)是一个专为多元时间序列异常检测设计的自动化框架。


除了提供各种异常检测算法外,TODS 还包含了丰富的时间序列预处理和特征提取功能。其特征集涵盖了从基本统计量(如均值、方差)到高级时间序列滤波器(如 Baxter-King 滤波器、Hodrick-Prescott 滤波器)以及小波变换等技术,这些工具能有效识别时间序列中的异常模式。


资源链接:
https://tods-doc.github.io/index.html

5、 librosa


librosa 是一个专门用于音乐和音频数据分析的 Python 库,其应用场景特别聚焦于音频信号处理。


从数据科学的角度看,音频信号本质上是一种特殊的时间序列,表示声压随时间的变化。下图展示了一个鼓点节奏逐渐加快的梅尔频谱图:



在音频分析中,特征提取是基础工作,librosa 提供了多种专业特征,包括:

  • 谱质心,用于量化声音的"亮度"

  • 梅尔频率倒谱系数 (MFCC),作为音色的低维表示

  • 色度特征,用于和声分析

  • 过零率,反映信号频率变化特性

这些特征在音频处理中各自捕获不同的声学属性。尽管 librosa 主要针对音频数据,其提供的特征提取方法同样可应用于其他领域的时间序列数据分析。


资源链接:
https://librosa.org/doc/main/tutorial.html


6、 mlforecast


mlforecast 是 Nixtla 预测生态系统中的核心组件,提供了基于机器学习算法构建预测模型的完整框架。


该库的特点是提供了系统化的特征工程流程,尤其适用于时间序列预测任务。通过 mlforecast 的 lag_transform 功能,用户可以进行基于窗口的特征提取操作,例如简便地构建移动平均特征,该特征能有效概括每个时间点前序列的平均水平,为预测提供重要信息。


资源链接:
https://nixtlaverse.nixtla.io/mlforecast/docs/how-to-guides/lag_transforms_guide.html


7、 eeglib


eeglib 是一个专门用于脑电图(EEG)时间序列分析的 Python 库,通过特征提取技术解析神经电生理数据。


考虑到脑电信号的特殊性,eeglib 包含了一系列在其他通用库中不常见的特征提取方法,这些方法特别适用于神经信号分析:

  • Petrosian 和 Higuchi 分形维数,用于量化信号的复杂度

  • Hjorth 参数,描述信号的活动度、移动度和复杂度

  • 去趋势波动分析,测量长程相关性

  • Lempel-Ziv 复杂度,评估信号的随机性


这些特征在癫痫发作检测、睡眠阶段分类和脑机接口等神经科学应用中具有显著价值。


资源链接:
https://eeglib.readthedocs.io/en/latest/index.html


8、 pywavelets


PyWavelets 是一个专业的小波变换库,提供了全面的小波分析工具,包括正向和逆向离散小波变换、连续小波变换等多种变换方法。


小波变换是一种先进的信号处理技术,能将时间序列分解为多尺度成分,揭示信号在不同频率和时间尺度上的特性。这种分解可用于提取高信息量的特征,支持下游分类或异常检测任务。研究文献[2]展示了一个实际应用案例,其中基于 Meyer 小波的离散小波分解被用于提取不同频带的相对能量,以预测医院 ICU 中的低血压事件发生。


资源链接:
https://pywavelets.readthedocs.io/en/latest/index.html


9、 hctsa



hctsa(高度比较时间序列分析)是一个基于 Matlab 开发的综合时间序列特征提取工具,通过 PYOPY 包可在 Python 环境中使用。

hctsa 的特点是能生成数千种特征类型,包括基于经验模式分解、可见性图、信息论度量等高级特征。这种大规模的特征集虽然在实际应用中可能显得过于庞大,但对于数据科学家探索新颖特征和拓展特征工程思路具有重要参考价值。


资源链接
https://github.com/benfulcher/hctsa


10、 catch22


catch22(CAnonical 时间序列特征)是从 hctsa 中精选出的 22 个时间序列特征子集,这些特征专为时间序列分类任务优化选择。此精简子集在保持可比分类性能的同时,显著提高了计算效率。


catch22 同样基于 Matlab 开发,但已有 Python (pycatch22) 和 R (Rcatch22) 语言的实现,方便不同技术栈的用户使用。


资源链接:

https://github.com/DynamicsAndNeuralSystems/catch22


11、 ta-lib


ta-lib 是一个专为金融时间序列技术分析设计的库,包含了数百种技术指标,例如广泛应用的移动平均收敛/发散 (MACD) 和相对强度指数 (RSI) 等。


虽然 ta-lib 主要面向金融领域,但其技术指标和特征提取方法同样适用于其他类型的时间序列分析。ta-lib 中的许多特征专门设计用于应对金融时间序列中常见的高噪声环境,这一特性使其在处理其他领域的噪声数据时也具有应用价值。


资源链接:
https://ta-lib.org/functions/


12、 nolds


nolds(动态系统的非线性度量)是一个基于动态系统理论的库,提供了一系列从时间序列中提取非线性特征的工具。


非线性时间序列分析将序列视为复杂系统的表现,这种视角使得可以应用多种动态系统分析技术。nolds 提供的方法包括:

  • Lyapunov 指数,用于量化序列的混沌程度和可预测性

  • 相关维数,评估序列的复杂度和嵌入维度

  • Hurst 指数,测量序列的长期自相关性和持久性

这些非线性特征能捕捉传统线性分析方法难以识别的时间序列模式。


资源链接:
https://pypi.org/project/nolds/


13、 scipy


scipy 作为科学计算的基础库,其中包含许多可用于时间序列特征提取的功能模块。除了基本统计函数外,scipy 的信号处理模块提供了丰富的分析工具:

  • 频谱分析功能,通过周期图或频谱图提取频域特征

  • 多种滤波器实现,包括带通、低通或高通滤波器

  • 精确的峰值检测算法,对于基于事件的时间序列分析尤为重要

scipy 的主要优势在于其计算效率(核心组件用 C/C++ 实现)和稳定性。作为一个自 2000 年代初就存在的成熟库,scipy 与其他科学计算生态系统的集成度极高。


资源链接:
https://docs.scipy.org/doc/scipy/index.html


14、 statsmodels


statsmodels 虽主要定位于计量经济学和统计建模,但其中的多个模块可有效用于时间序列特征提取。


statsmodels 的时间序列分析(tsa)模块包含了多种高级技术,如季节性分解、平稳性检验、季节性测试和时间序列建模方法。这些功能可用于提取描述时间序列关键属性的特征。值得注意的是,前文提到的一些特征提取框架(如 tsfeatures、tsfel)在内部实现中也使用了 statsmodels 提供的计算功能。


与 scipy 类似,statsmodels 也是一个历经验证的成熟库,其实现稳定可靠,适合用于生产环境。


资源链接:
https://www.statsmodels.org/stable/index.html


15、 Featuretools


图片

Featuretools 是一个针对时间数据库和关系数据库的自动化特征工程框架,其核心技术"深度特征合成"能够从输入数据库构建综合特征矩阵。

在时间序列分析方面,Featuretools 包含了多种基于事件的特征提取方法:

  • 时间间隔特征,如自上次特定值或统计量(最大值、最小值等)出现以来的时间

  • 基于计数的指标,如大于特定阈值的连续值数量

  • 时间相关特征,如与节假日的距离(天数)


这类特征在对时间序列中的事件或特殊日期进行建模时(如零售销售分析、用户行为建模)具有重要价值。


资源链接:
https://featuretools.alteryx.com/en/stable/index.html


16、 FATS


FATS(时间序列特征分析)是一个专为天文光变曲线数据设计的特征提取框架,针对天体物理学研究中的时间序列分析进行了优化。


虽然 FATS 中的大多数特征最初设计用于区分不同类别的光变曲线,但这些特征同样适用于其他时间序列数据的分析。天文光变曲线数据通常具有不规则采样和多重周期性等特点,因此 FATS 提供的特征集对于具有类似特性的时间序列数据分析具有参考价值。


资源链接:
https://isadoranun.github.io/tsfeat/


17、 Cesium


Cesium 是一个集成了时间序列特征提取和建模功能的 Python 库,专注于天文数据分析但具有广泛适用性。


Cesium 提取的特征包括基于 Lomb-Scargle 模型的统计量和节奏度量等。后者能估计下一次观测出现在特定时间范围内(如接下来 10 分钟内)的概率分布,这类特征对于客户到达预测、事件触发建模等应用场景具有重要意义。


资源链接:

https://cesium-ml.org/docs/index.html


18、 Kats


Kats 是 Facebook Research 开发的时间序列分析库,其特征提取模块是该库的核心组件之一。


虽然 Kats 的基础特征集与其他特征提取库有相当程度的重叠,但它特别强调了适用于异常检测和短期预测的专门特征。这些包括多种变化点检测方法产生的估计结果,如 CUSUM(累积和控制图)等技术,这些特征能有效识别时间序列中的结构性变化。


资源链接:

https://github.com/facebookresearch/Kats


总结


本文综述了18 个时间序列特征提取库,这些库针对不同领域(如音频分析、医疗健康、金融)和不同任务(如预测、分类、异常检测)提供了专业化的特征提取功能。这些库的多样性反映了时间序列数据的复杂性,以及分析此类数据所需的多元化方法论。


尽管这些框架之间存在功能重叠,但它们也在各自专注的领域提供了独特价值。在实际应用中,数据科学家可以根据具体需求组合使用这些工具。例如,可以使用 tsfel 获取全面的基础特征集,同时结合 nolds 提供的非线性度量来捕捉更复杂的时间序列模式。


编辑:于腾凯
校对:林亦霖


关于我们

数据派THU作为数据科学类公众号,背靠清华大学大数据研究中心,分享前沿数据科学与大数据技术创新研究动态、持续传播数据科学知识,努力建设数据人才聚集平台、打造中国大数据最强集团军。




新浪微博:@数据派THU

微信视频号:数据派THU

今日头条:数据派THU

eeglib里像Petrosian和Higuchi分形维数,nolds里的Lyapunov指数这些量化信号复杂度的特征,我觉得都可以直接借鉴到心电图分析里。ECG信号的复杂度和心率变异性是评估心脏健康的重要指标。不过ECG信号的预处理很重要,要滤除噪声和基线漂移。另外,心电信号有明显的PQRST波形,可以针对这些波形设计一些特征,比如波形的幅值、持续时间、形状等。

从技术分析角度看,ta-lib肯定是首选。但如果想从更广泛的角度挖掘金融数据的一些潜在特征, Featuretools 可能会有意外惊喜。Featuretools 的“深度特征合成”可以自动从时间序列数据中构建更复杂的特征,例如考虑时间间隔、计数等,这些特征可能有助于捕捉到金融市场中不易察觉的模式。

我觉得可以考虑用一些降维的方法,比如 PCA,先对特征进行降维,然后再用 tsfresh 筛选。这样可以减少特征之间的相关性,提高筛选的效率。另外,可以尝试用一些集成学习的方法,比如随机森林,来评估特征的重要性,然后再用 tsfresh 筛选排名靠前的特征。

我之前用tsfresh做过一个项目,感觉预处理非常重要。首先要对数据进行清洗和标准化,去除异常值和噪声。然后,可以在 tsfresh 的参数设置里调整特征选择的阈值,比如增大 p-value 的阈值,降低特征选择的严格程度,这样可以避免误删一些有用的特征。另外,可以尝试不同的特征类型组合,看看哪种组合效果最好。

eeglib里的Hjorth 参数,描述信号的活动度、移动度和复杂度,我觉得可以试试看。心电信号的波形变化也反映了心脏的活动状态。不过,脑电信号和心电信号的频率范围和幅度差异很大,需要根据心电信号的特点调整参数。另外,心电信号更容易受到肌肉和运动伪迹的影响,需要更精细的伪迹去除方法。

我更倾向于scipy或statsmodels。虽然ta-lib专注于金融数据,但scipy的信号处理模块和statsmodels的时间序列分析模块提供了更通用的工具,适用于处理金融数据中的噪声和不规则采样问题。特别是statsmodels,它在计量经济学领域应用广泛,对金融数据的特性有深入的考虑,因此可能更适合。

如果只考虑特定领域的金融数据,ta-lib肯定是最优解

从信号处理的角度来看,小波变换是通用的。eeglib用小波分析提取不同频带的能量,这个方法可以直接用到心电信号上,分析心电信号在不同频率上的能量分布。但是需要注意的是,不同的小波基函数有不同的特点,需要根据心电信号的特点选择合适的小波基函数。另外,小波变换的尺度参数也需要根据心电信号的频率范围进行调整。

用tsfresh自动筛选特征确实很方便,但得小心过度拟合。我的经验是,首先要保证你的数据集足够大,不然统计检验的结果可能不靠谱。其次,可以结合领域知识,手动添加一些你认为重要的特征,再让 tsfresh 去筛选。最后,一定要用交叉验证来评估模型的泛化能力,别只看训练集上的效果。

我觉得除了ta-lib,nolds库在处理金融数据时可能也会有优势。金融时间序列常常表现出非线性、混沌的特性,nolds 能提取 Lyapunov 指数、Hurst 指数等非线性特征,这些特征可以捕捉传统线性分析方法难以发现的市场模式,对噪声有一定鲁棒性。但是具体哪个更好,可能还是得看实际的数据和任务来决定,最好都试试看。