Python时间序列分析库介绍:statsmodels、tslearn、tssearch、tsfresh

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时计算 Flink 版,5000CU*H 3个月
简介: 时间序列分析在金融和医疗保健等领域至关重要,在这些领域,理解随时间变化的数据模式至关重要。在本文中,我们将介绍四个主要的Python库——statmodels、tslearn、tssearch和tsfresh——每个库都针对时间序列分析的不同方面进行了定制。这些库为从预测到模式识别的任务提供了强大的工具,使它们成为各种应用程序的宝贵资源。

我们使用来自Kaggle的数据集,通过加速度计数为各种身体活动进行分析。这些活动被分为12个不同的类别,每个类别对应一个特定的身体动作,如站立、坐着、行走,或从事更有活力的活动,如慢跑和骑自行车。每个活动都记录了一分钟的持续时间,提供了丰富的时间序列数据源。

用于此分析的库有:

 # statsmodels
 from statsmodels.tsa.seasonal import seasonal_decompose
 from statsmodels.tsa.stattools import adfuller
 from statsmodels.graphics.tsaplots import plot_acf

 #tslearn
 from tslearn.barycenters import dtw_barycenter_averaging

 # tssearch
 from tssearch import get_distance_dict, time_series_segmentation, time_series_search, plot_search_distance_result

 # tsfresh
 from tsfresh import extract_features
 from tsfresh.feature_selection.relevance import calculate_relevance_table
 from tsfresh.feature_extraction import EfficientFCParameters
 from tsfresh.utilities.dataframe_functions import impute

Statsmodels

从statmodels库中,两个基本函数在理解从x, y和z方向收集的加速度数据的特征方面起着关键作用。

adfuller函数是确定时间序列信号平稳性的有力工具。通过对我们的数据进行Augmented Dickey-Fuller检验,可以确定加速度信号是否表现出平稳的行为,这是许多时间序列分析技术的基本要求。这个测试帮助我们评估数据是否随时间而变化。

 def activity_stationary_test(dataframe, sensor, activity):
   dataframe.reset_index(drop=True)
   adft = adfuller(dataframe[(dataframe['Activity'] == activity)][sensor], autolag='AIC')
   output_df = pd.DataFrame({'Values':[adft[0], adft[1], adft[4]['1%']], 'Metric':['Test Statistics', 'p-value', 'critical value (1%)']})
   print('Statistics of {} sensor:\n'.format(sensor), output_df)
   print()
   if (adft[1] < 0.05) & (adft[0] < adft[4]['1%']):
     print('The signal is stationary')
   else:
     print('The signal is non-stationary')

seasonal_decomposition函数提供了对时间序列数据结构的宝贵见解。它将时间序列分解为三个不同的组成部分:趋势、季节性和残差。这种分解使我们能够可视化和理解加速度数据中的潜在模式和异常。

 def activity_decomposition(dataframe, sensor, activity):

   dataframe.reset_index(drop=True)
   data = dataframe[(dataframe['Activity'] == activity)][sensor]
   decompose = seasonal_decompose(data, model='additive', extrapolate_trend='freq', period=50)
   fig = decompose.plot()
   fig.set_size_inches((12, 7))
   fig.axes[0].set_title('Seasonal Decomposition Plot')
   fig.axes[3].set_xlabel('Indices')
   plt.show()

Tslearn

如果使用tslearn库进行时间序列分析。可以采用分割方法,将连续的加速信号分解成特定长度的离散段或窗口(例如,150个数据点)。这些片段提供了行走过程中运动的颗粒视图,并成为进一步分析的基础。重要的是,我们在相邻部分之间使用了50个数据点的重叠,从而可以更全面地覆盖潜在的动态。

 template_length = 150
 overlap = 50  # Adjust the overlap value as needed
 segments = [signal[i:i + template_length] for i in range(0, len(signal) - template_length + 1, overlap)]

为了从这些片段中获得一个封装行走典型特征的代表性模板,我们使用了dtw_barycenter_averaging函数。该方法采用动态时间规整(Dynamic Time Warping, DTW)对分割的时间序列进行对齐和平均,有效地创建了一个捕捉步行运动中心趋势的模板。

 template_signal = dtw_barycenter_averaging(segments)
 template_signal = template_signal.flatten()

生成的模板为后续的分类和比较任务提供了有价值的参考,有助于基于x轴加速度的步行活动识别和分析。

Tssearch

对于tssearch库使用time_series_segmentation函数,通过动态时间规整(DTW)或其他相似性度量来识别输入时间序列中与所提供的模板信号最相似的片段。

该函数的主要目标是定位和提取与模板信号密切匹配的输入时间序列片段。通过将模板信号与输入时间序列进行比较,可以找到这些片段,该函数返回输入时间序列中这些片段开始的位置或索引。

 segment_distance = get_distance_dict(["Dynamic Time Warping"])

 segment_results = time_series_segmentation(segment_distance, template_signal, signal_np)

 for k in segment_results:
   plt.figure(figsize=(15, 3))
   plt.plot(signal_np, color='gray')
   plt.vlines(segment_results[k], np.min(signal_np)-1, np.max(signal_np) + 1, 'C1')
   plt.xlabel('Indices')
   plt.ylabel('Amplitude')
   plt.title(k)

tssearch库中还有另一个用于发现时间序列数据中的相似性和差异性的方法。首先,我们配置了一个字典dict_distances来指定搜索的距离度量。定义了两种不同的方法。第一个,标记为“elastic”,采用动态时间规整(DTW)作为相似性度量。使用特定的参数定制DTW,例如dtw_type设置为“sub-dtw”,alpha设置为0.5,允许灵活的时间序列对齐和比较。然后是“lockstep”,它利用欧几里得距离以一种更严格的方式来衡量相似性。有了这些距离配置,就可以使用time_series_search函数执行时间序列搜索,将模板信号与目标信号(signal_np)进行比较,并指定前30个匹配项的输出。

 dict_distances = {
     "elastic": {
         "Dynamic Time Warping": {
             "function": "dtw",
             "parameters": {"dtw_type": "sub-dtw", "alpha": 0.5},
         }
     },
     "lockstep": {
         "Euclidean Distance": {
             "function": "euclidean_distance",
             "parameters": "",
       }
     }
 }

 result = time_series_search(dict_distances, template_signal, signal_np, output=("number", 30))
 plot_search_distance_result(result, signal_np)

这是一种时间序列聚类的简单的方法,并且可解释性很强。

Tsfresh

tsfresh库则是一个很好的自动化特征提取过程的工具。effentfcparameters()定义了一组提取设置,它指定了特征提取参数和配置。这些设置可以控制在提取过程中计算哪些特征。然后就可以使用extract_features函数应用进行特征的提取。这里应该将“Activity”列作为标识符列,并提供了特征提取参数。重要的是,该库可以对缺失值(NaN)的特征进行自动删除,结果保存在x_extract中,是从时间序列数据中提取的大量特征集合。Tsfresh简化了通常复杂且耗时的特征工程过程,为时间序列分析提供了宝贵的资源。

 extraction_settings = EfficientFCParameters()
 X_extracted = extract_features(final_df, column_id='Activity',
                       default_fc_parameters=extraction_settings,
                       # we impute = remove all NaN features automatically
                       impute_function=impute, show_warnings=False)

 X_extracted= pd.DataFrame(X_extracted, index=X_extracted.index, columns=X_extracted.columns)

 values = list(range(1, 13))
 y = pd.Series(values, index=range(1, 13))

 relevance_table_clf = calculate_relevance_table(X_extracted, y)
 relevance_table_clf.sort_values("p_value", inplace=True)
 relevance_table_clf.head(10)

 top_features = relevance_table_clf["feature"].head(10)
 x_features = X_extracted[top_features]

总结

本文向您介绍了时间序列分析的四个基本Python库:statmodels、tslearn、tssearch和tsfresh。时间序列分析是金融和医疗保健等各个领域的重要工具,在这些领域,我们需要了解数据随时间的变化趋势,以便做出明智的决策和预测。

每个库都专注于时间序列分析的不同方面,选择哪个库取决于具体问题。通过结合使用这些库,可以处理各种与时间相关的挑战,从预测财务趋势到对医疗保健中的活动进行分类。当要开始自己的时间序列分析项目时,请记住这些库,结合着使用它们可以帮助你解决很多的实际问题。

kaggle数据集:https://avoid.overfit.cn/post/ce023e947e0246c09a10a3d71f0181c5

作者:daython3

目录
相关文章
|
26天前
|
缓存 Rust 算法
从混沌到秩序:Python的依赖管理工具分析
Python 的依赖管理工具一直没有标准化,主要原因包括历史发展的随意性、社区的分散性、多样化的使用场景、向后兼容性的挑战、缺乏统一治理以及生态系统的快速变化。依赖管理工具用于处理项目中的依赖关系,确保不同环境下的依赖项一致性,避免软件故障和兼容性问题。常用的 Python 依赖管理工具如 pip、venv、pip-tools、Pipenv、Poetry 等各有优缺点,选择时需根据项目需求权衡。新工具如 uv 和 Pixi 在性能和功能上有所改进,值得考虑。
84 35
|
27天前
|
数据采集 数据可视化 数据挖掘
金融波动率的多模型建模研究:GARCH族与HAR模型的Python实现与对比分析
本文探讨了金融资产波动率建模中的三种主流方法:GARCH、GJR-GARCH和HAR模型,基于SPY的实际交易数据进行实证分析。GARCH模型捕捉波动率聚类特征,GJR-GARCH引入杠杆效应,HAR整合多时间尺度波动率信息。通过Python实现模型估计与性能比较,展示了各模型在风险管理、衍生品定价等领域的应用优势。
245 66
金融波动率的多模型建模研究:GARCH族与HAR模型的Python实现与对比分析
|
3天前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
27 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
17天前
|
并行计算 安全 Java
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
在Python开发中,GIL(全局解释器锁)一直备受关注。本文基于CPython解释器,探讨GIL的技术本质及其对程序性能的影响。GIL确保同一时刻只有一个线程执行代码,以保护内存管理的安全性,但也限制了多线程并行计算的效率。文章分析了GIL的必要性、局限性,并介绍了多进程、异步编程等替代方案。尽管Python 3.13计划移除GIL,但该特性至少要到2028年才会默认禁用,因此理解GIL仍至关重要。
92 16
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
|
28天前
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
103 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
1月前
|
机器学习/深度学习 运维 数据可视化
Python时间序列分析:使用TSFresh进行自动化特征提取
TSFresh 是一个专门用于时间序列数据特征自动提取的框架,支持分类、回归和异常检测等机器学习任务。它通过自动化特征工程流程,处理数百个统计特征(如均值、方差、自相关性等),并通过假设检验筛选显著特征,提升分析效率。TSFresh 支持单变量和多变量时间序列数据,能够与 scikit-learn 等库无缝集成,适用于大规模时间序列数据的特征提取与模型训练。其工作流程包括数据格式转换、特征提取和选择,并提供可视化工具帮助理解特征分布及与目标变量的关系。
72 16
Python时间序列分析:使用TSFresh进行自动化特征提取
|
1月前
|
数据采集 缓存 API
python爬取Boss直聘,分析北京招聘市场
本文介绍了如何使用Python爬虫技术从Boss直聘平台上获取深圳地区的招聘数据,并进行数据分析,以帮助求职者更好地了解市场动态和职位需求。
|
2月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
2月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
2月前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
126 80