推荐4个优秀的 Python 时间序列分析库

news2024/11/24 17:10:21

时间序列分析在金融和医疗保健等领域至关重要,在这些领域,理解随时间变化的数据模式至关重要。在本文中,我们将介绍四个主要的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

技术交流与源码获取

技术要学会交流、分享,不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。

好的文章离不开粉丝的分享、推荐,资料干货、资料分享、数据、技术交流提升,均可加交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

技术交流、代码、数据获取方式如下

方式①、添加微信号:dkl88194,备注:来自CSDN + 技术交流
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:技术交流

资料1
在这里插入图片描述
资料2

我们打造了《100个超强算法模型》,特点:从0到1轻松学习,原理、代码、案例应有尽有,所有的算法模型都是按照这样的节奏进行表述,所以是一套完完整整的案例库。

很多初学者是有这么一个痛点,就是案例,案例的完整性直接影响同学的兴致。因此,我整理了 100个最常见的算法模型,在你的学习路上助推一把!

在这里插入图片描述

1、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()

在这里插入图片描述

2、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轴加速度的步行活动识别和分析。

在这里插入图片描述

3、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)

在这里插入图片描述

在这里插入图片描述

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

4、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://www.kaggle.com/datasets/gaurav2022/mobile-health/discussion/375938

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1301775.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【每日一题】1631. 最小体力消耗路径-2023.12.11

题目&#xff1a; 1631. 最小体力消耗路径 你准备参加一场远足活动。给你一个二维 rows x columns 的地图 heights &#xff0c;其中 heights[row][col] 表示格子 (row, col) 的高度。一开始你在最左上角的格子 (0, 0) &#xff0c;且你希望去最右下角的格子 (rows-1, column…

太阳能光伏企业网站建设效果如何

光伏行业近些年发展也比较迅速&#xff0c;其服务/产品拓展度较高&#xff0c;对企业来说&#xff0c;合作商较少更需要多地域寻找目标客户及信息承载展示、拓展等&#xff0c;传统线下方式单一且不足&#xff0c;线上成为众商家经营的方向。 1、品牌宣传、信息呈现难 太阳能…

C/C++ 题目:给定字符串s1和s2,判断s1是否是s2的子序列

判断子序列一个字符串是否是另一个字符串的子序列 解释&#xff1a;字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符&#xff0c;不改变剩余字符相对位置形成的新字符串。 如&#xff0c;"ace"是"abcde"的一个子序…

git 关于分支、merge、commit提交

最近开始用git终端提交代码&#xff0c;梳理了一些知识点 一 关于分支 关于分支&#xff0c;git的分支分为本地分支远程分支两种分支&#xff0c;在上传代码时&#xff0c;我们要确保当前本地分支连接了一个远程分支。 我们可以通过下面代码查看当前的本地分支&#xff1a; g…

.NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(测试篇)

WebAppDbTest 项目测试 测试工具 ltt介绍安装使用方式1、Drill2、Hammer3、Nailgun 测试主机规格配置CRUD 性能测试对比1、ltt 工具测试1.1、AddSingle 单条数据添加1.2、AddBulk 批量数据&#xff08;1000&#xff09;条添加1.3、GetSingle 单条数据查询1.4、GetAll 多条&…

angular form 组件、双向绑定;反应式表单

1.使用双向绑定&#xff0c;以及angular的表单提交功能 app.moudle中引入 双向绑定 [(ngModel)]"text" ​​​​​​​ 效果 提交表单 2.反应式表单 在app.module.ts中引入在组件中引入&#xff0c;并放在一个变量里 在初始化时实列化这个module 定义规则 在html…

成都工业学院Web技术基础(WEB)实验五:CSS3动画制作

写在前面 1、基于2022级计算机大类实验指导书 2、代码仅提供参考&#xff0c;前端变化比较大&#xff0c;按照要求&#xff0c;只能做到像&#xff0c;不能做到一模一样 3、图片和文字仅为示例&#xff0c;需要自行替换 4、如果代码不满足你的要求&#xff0c;请寻求其他的…

【Python必做100题】之第四题(判断素数)

素数&#xff1a;约数只有1和本身的数叫素数 代码如下&#xff1a; a int(input("请随机输入一个数字&#xff1a;")) #键盘随机输入一个数字进行判断 flag False for i in range(2,a):if a % i 0: #在(2&#xff0c;a-1)之间但凡有一个可以整除就不是素数break…

java代码test

目录结构 对于使用ArrayList集合并使用Iterator遍历 package test2; import java.util.ArrayList; import java.util.Iterator;public class T8 {public static void main(String[] args) {// 创建ArrayList集合并添加元素ArrayList<String> arrayList new ArrayList&l…

在项目中,使用drawio创建一个共享协作看板

在项目中&#xff0c;使用drawio创建一个共享协作看板 drawio是一款强大的图表绘制软件&#xff0c;支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用&#xff0c;则直接输入网址draw.io或者使用drawon(桌案), drawon.cn内部完整的集成了drawio的所有功…

Flask应用基础入门总结

【1】使用migrate方式进行数据库连接 使用migrate方式进行数据库连接需要在终端分别运行三行代码&#xff1a; #init&#xff08;运行一次即可&#xff09;&#xff08;此db为自己设置的连接数据库的对象,可以修改&#xff09; flask db init #&#xff08;将orm模型生成迁移…

Javaweb之附录的详细解析

05. 附录 5.1 更新依赖索引 有时候给idea配置完maven仓库信息后&#xff0c;在idea中依然搜索不到仓库中的jar包。这是因为仓库中的jar包索引尚未更新到idea中。这个时候我们就需要更新idea中maven的索引了&#xff0c;具体做法如下&#xff1a; 打开设置----搜索maven----R…

N皇后,回溯【java】

问题描述 八皇后问题是十九世纪著名的数学家高斯于1850年提出的。 问题是&#xff1a;在88的棋盘上摆放八个皇后&#xff0c;使其不能互相攻击&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上。可以把八皇后问题扩展到n皇后问题&#xff0c;即在nn的棋盘上摆…

JMeter提取器

JMeter三大提取器 一、正则表达式提取器二、XPath提取器三、JSON提取器四、JSON属性 一、正则表达式提取器 使用场景&#xff1a; 任意格式的响应数据都可以使用正则表达式提取器&#xff1b;操作步骤&#xff1a; 添加线程组-添加HTTP请求-添加后置处理器-添加正则表达式提取…

udp多播组播

import socket ,struct,time# 组播地址和端口号 MCAST_GRP 239.0.0.1 MCAST_PORT 8888 # 创建UDP socket对象 sock socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) # 绑定socket对象到本地端口号 # sock.bind((MCAST_GRP, MCAST_PORT)) …

textarea文本框回车enter的时候自动提交表单,根据内容自动高度

切图网近期一个bootstrap5仿chatgpt页面的项目遇到的&#xff0c;textarea文本框回车enter的时候自动提交表单&#xff0c;根据内容自动高度&#xff0c;代码如下&#xff0c;亲测可用。 <textarea placeholder"Message ChatGPT…" name"" rows"&q…

排序的简单理解(上)

1. 排序的概念及引用 1.1 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作&#xff08;按照我们的需求能够有序的将数据信息排列起来&#xff09;。 稳定性&#xff1a;假…

大数据讲课笔记1.3 Linux目录操作

文章目录 零、学习目标一、导入新课二、新课讲解&#xff08;一&#xff09;常用权限操作1、常用权限操作&#xff08;1&#xff09;chgrp命令&#xff08;2&#xff09;chown命令&#xff08;3&#xff09;chmod命令 2、权限操作实战任务1、创建文件&#xff0c;设置其用户组任…

docker Compose-网络设置

目录 一、概述 二、容器网络模型(了解) CNM主要有三部分组成 CNM驱动接口 Docker内置网络驱动 三、Docker Compose-网络设置二 一、概述 二、使用 links 三、自定义网络 四、配置默认网络 五、已存在的网络 一、概述 随着微服务的事件&#xff0c;应用的越来越多&a…

去除水中的悬浮固体、重金属和各种酸

每个球粒直径通常在2-5毫米范围内 的&#xff0c;可用于固定床吸附污染物。不过球粒尺寸可以根据客户的具体需求生产 TRAPPSORB尽管它与颗粒产品具有相同的化学成分&#xff0c;但由于其独特 的外表面和结构&#xff0c;它与其他基于MgO的材料根本不同&#xff0c; 它由独特的…