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

news2024/11/15 4:43:05

时间序列分析在金融和医疗保健等领域至关重要,在这些领域,理解随时间变化的数据模式至关重要。在本文中,我们将介绍四个主要的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。时间序列分析是金融和医疗保健等各个领域的重要工具,在这些领域,我们需要了解数据随时间的变化趋势,以便做出明智的决策和预测。

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

https://avoid.overfit.cn/post/ce023e947e0246c09a10a3d71f0181c5

作者:daython3

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

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

相关文章

深入浅出排序算法之计数排序

目录 1. 原理 2. 代码实现 3. 性能分析 1. 原理 首先看一个题目&#xff0c;有n个数&#xff0c;取值范围是 0~n&#xff0c;写出一个排序算法&#xff0c;要求时间复杂度和空间复杂度都是O(n)的。 为了达到这种效果&#xff0c;这一篇将会介绍一种不基于比较的排序方法。这…

Day 11 python学习笔记

模块 内置模块 random random&#xff1a;随机数模块 我们可以在解释器中看到其蕴含的方法 接下来我解释一些常用的方法&#xff1a; random.random( ) random.random( ) 返回0-1的随机数 [0,1) >>> random.random() 0.364183511476754 random.randint(n,m) r…

Java JSON字符串转换成JSON对象

方法一&#xff1a;要先转为LinkedHashMap&#xff0c;再转json&#xff08;推荐&#xff0c;我使用这种方法&#xff09; String jsonStr"{\"id\":\"10001\",\"name\":\"肉类\",\"menus\":[{\"name\":\&qu…

Node切换版本

以非安转版本方式安装Node&#xff0c;经常会需要进行Node的版本切换。 官方的做法是&#xff1a;nvm use version。 但是这种方法经常会失败。如下&#xff1a; 其实nvm命令的本质就是给当前node版本添加一个快捷方式&#xff08;或软连接&#xff09;&#xff0c;因为环境变…

AT800(3000) +昇腾300V 之一 环境部署

环境部署 背景服务器 硬件资源系统&#xff1a;CPU&#xff1a;NPU&#xff1a;固件与驱动CANN 背景 因nvidia 受限 公司转华为推理服务器 AT800&#xff08;3000&#xff09; 昇腾 &#xff0c;将推出一系列文章 &#xff0c;记录过程。 服务器 硬件资源 系统&#xff1a;…

再畅通工程(最小生成树)

题目描述&#xff1a;还是畅通工程 某省调查乡村交通状况&#xff0c;得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通&#xff08;但不一定有直接的公路相连&#xff0c;只要能间接通过公路可达即可&#xff09;&…

轻量封装WebGPU渲染系统示例<6>-混合模式(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/version-1.01/src/voxgpu/sample/BlendTest.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 2. 高频调用与低频调用隔离。 3. 面向用户的易用性封装。 4. 渲染数据和渲染机制分离。 5. 用户…

8086汇编环境的使用

先打开emu8086&#xff0c;写入代码 ;给11003H的地址赋1234H的值;不能直接给DS赋值需要寄存器中转 mov dx, 1100H mov ds, dx mov ax, 1234H ;不能直接给内存地址赋值&#xff0c;需要DS:[偏移地址]指向内存 mov [3H], ax 点击emulate开始模拟 出现调试框&#xff0c;调试框的…

moviepy处理手机端图片旋转问题

1.手机拍摄的图片或者在ffmpeg处理的时候&#xff0c;会读取图片的元数据从而进行旋转 左边是拍摄的图片&#xff0c;右侧是进行处理以后得图片 video VideoFileClip(file_path) if video.rotation in (90, 270):video video.resize(video.size[::-1])video.rotation 0

Live800:智能客服的意义和价值

近年来&#xff0c;智能客服系统的出现引起了各行各业的共同关注&#xff0c;成为了许多企业在数字化转型中的重要步骤之一。智能客服系统能够帮助企业降低人力成本&#xff0c;提高客户满意度&#xff0c;对于企业而言具有不可替代的价值和意义。 智能客服系统的主要价值包括以…

Diffusion Models视频生成-博客汇总

0、【论文汇总】Diffusion Models视频生成/视频编辑/可控视频生成/跨模态视频生成 本文总结了Diffusion Models视频生成领域相关的工作,目前共收录142篇,持续更新中。 1、Video Diffusion Models:基于扩散模型的视频生成 扩散模型已经被广泛运用到图像生成、image-to-image转…

网络搭建和运维的基础题目

服务部分&#xff08;linux&#xff09; 实操部分 1.在任意文件夹下面创建形如 A/B/C/D 格式的文件夹系列。 [rootlocalhost ~]# mkdir -p A/B/C/D 2.在创建好的文件夹下面&#xff0c;A/B/C/D &#xff0c;里面创建文本文件 mkdir.txt [rootlocalhost ~]# cd A/B/C/D [r…

前端跨页面通信,你知道哪些方法?

一、同源页面 1.广播站模式 一个页面将消息通知给一个“中央站”&#xff0c;再由“中央站”通知给各个页面&#xff0c;以下会介绍这个中央站可以是LocalStorage&#xff0c;可以是BroadCast Channel实例&#xff0c;也可以是一个Service worker 1.1.LocalStorageStorageEven…

[AUTOSAR][诊断管理][ECU][$27] 安全访问

文章目录 一、简介$27服务有何作用,为什么要有27服务呢?功能描述应用场景安全解锁基本原理服务请求服务响应Verify Key负响应NRC支持二、常见Bug大揭秘三、示例代码uds27_security_access.c一、简介 $27服务有何作用,为什么要有27服务呢? 功能描述 根据ISO14119-1标准中…

网络基础-3

路由开销 一条路由的开销时指到达这条路由的目的地/掩码需要付出的带价值。同一种路由协议发现有多条路由可以到达同一目的地/掩码时&#xff0c;将优选开销最小的路由&#xff0c;即只把开销最小的路由加入进本协议的路由表中。 路由协议 内部网关协议&#xff08;IGP&…

【C++项目】高并发内存池第六讲 当申请内存大于256K时的处理

目录 1.申请过程2.释放过程 1.申请过程 当申请的内存大于256kb时直接向堆中申请&#xff1a; static void* ConcurrentAlloc(size_t size) {if (size > MAX_BYTES){size_t alignSize SizeClass::RoundUp(size);size_t kpage alignSize >> PAGE_SHIFT;PageCache::…

数据隐私保护的方法有哪些?

数据隐私保护的方法有哪些&#xff1f; 安企神U盘管理系统下载使用 互联网时代的到来&#xff0c;给我们的生活带来极大的方便&#xff0c;但也给我们保护隐私数据带来巨大的挑战&#xff0c;数据隐私保护是确保个人或企业数据和敏感信息不被未经授权的访问或滥用的关键问题。…

CPU 与简单模型机实验

实验报告 实验名称&#xff1a; CPU 与简单模型机实验 日期&#xff1a; ----.--.-- 班级&#xff1a; ----------- 学号&#xff1a; ------------ 姓名&#xff1a; ---------- 一、实验目的&#xff1a; 1、 掌握一个简单CPU 的组成原理&#xff1b; 2、 在掌…

驱动定时器

基于GPIO子系统编写LED驱动&#xff0c;编写应用程序进行测试 设置定时器&#xff0c;5秒钟打印一次hello world text.c #include<stdlib.h> #include<stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include<…

【数据结构初阶】十、快速排序(比较排序)讲解和实现(三种递归快排版本 + 非递归快排版本 -- C语言实现)

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【数据结构初阶】九、排序的讲解和实现&#xff08;直接插入 \ 希尔 \ 直接选择 \ 堆 \ 冒泡 -- C语言&#xff09;-CSDN博客 常见排序算法的实现&#xff08;续上期&#xff09; …