时间序列结构变化分析:Python实现时间序列变化点检测

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 3个月
简介: 在时间序列分析和预测中,准确检测结构变化至关重要。新出现的分布模式往往会导致历史数据失去代表性,进而影响基于这些数据训练的模型的有效性。

平稳性是时间序列分析与预测的核心概念。在平稳条件下,时间序列的统计特性(如均值)在时间维度上保持不变,仅存在随机波动。

但是实际数据集中很少观察到完全的平稳性。时间序列通常会经历结构性断裂或变化。这些变化会引入非平稳性,从而改变时间序列的整体分布,这些标志着变化开始的时间点被称为变化点。

在时间序列分析和预测中,准确检测结构变化至关重要。新出现的分布模式往往会导致历史数据失去代表性,进而影响基于这些数据训练的模型的有效性。因此需要采用最新数据更新模型或采取其他适当策略。对于历史数据中的变化点,可以通过特征工程方法(如干预分析)进行处理。

但需要注意的是,结构变化与异常值是两个不同的概念。异常值是指与时间序列的基本结构或分布所定义的正常行为显著偏离的观测值。而变化点则是指时间序列的整体结构发生转变,导致分布特性的改变。

接下来,我们首先详细探讨不同类型的结构变化。

结构变化的类型

结构变化可以分为多种类型。深入理解这些变化的性质对于选择适当的处理策略至关重要。

水平变化

水平变化主要体现在序列的均值或方差上。均值的变化表现为平均水平的移动,可以是永久性的,也可以是暂时性的。

永久性水平移动是指序列的平均值永久性地转移到一个新的水平。例如当一家零售企业开设新店时,销售时间序列可能会转移到一个更高的水平,反映出扩大的客户基础。

暂时性水平移动是指平均值在一段时间后恢复到原有水平。例如制造工厂的一台机器因维修而临时停机,生产时间序列在维修期间会出现暂时性的低值。一旦机器恢复运行,生产水平预计会回到正常状态。

方差变化

方差的变化会导致时间序列离散程度的增加或减少,具有非恒定方差的时间序列通常被称为异方差序列。方差的变化同样可以是永久性的或暂时性的。

方差的周期性变化是波动聚类现象的典型特征。波动聚类指的是时间序列呈现出低方差期和高方差期交替出现的模式。换言之,大(小)幅度变化往往会连续出现。

以下是表示每小时风速变化的时间序列示例,展示了波动聚类现象:

具有波动聚类特征的时间序列示例。

波动聚类在气象学(如风速分析)和金融学(如资产价格研究)等领域中较为常见。

基于Python的变化点检测代码实现

变化点检测算法旨在精确识别时间序列分布发生显著变化的时间点。本节将详细探讨多种变化点检测方法的实际应用。

我们从 datasetsforecast 库中加载一个示例时间序列数据:

 fromdatasetsforecast.m4importM4  

 dataset, *_=M4.load('./data', 'Monthly')  

 series=dataset.query(f'unique_id=="M1430"').reset_index(drop=True)  
 series['time'] =pd.date_range(end='2023-12-01', periods=series.shape[0], freq='M')

此数据集是非常有名的销量预测比赛M4

利用kats进行变化点检测

kats是Meta开发的一个功能强大的时间序列分析库。它提供了多种变化检测方法,包括CUSUM(累积和)和贝叶斯在线变化点检测等。

kats要求使用特定的数据结构,可以按以下方式进行设置:

 fromkats.constsimportTimeSeriesData  

 ts=TimeSeriesData(df=series[['time', 'y']])

CUSUM(累积和)是一种广泛应用于检测时间序列均值变化的方法。其原理是计算相对于预期值的偏差累积和。如果序列的均值保持稳定,累积和将呈现围绕零的随机波动。累积和的持续正向(或负向)变化则表明均值发生了上升(或下降)移动。

以下代码展示了如何使用kats中的CUSUM方法:

 fromkats.tests.detectors.test_cusum_detectionimportCUSUMDetector  

 model=CUSUMDetector(ts)  
 change_points=model.detector(direction=['decrease', 'increase'])  
 model.plot(change_points)

detector方法的 direction 参数用于指定需要监测的变化方向。在本例中我们同时监测序列的上升和下降变化。

CUSUM方法实现了对变化点的准确检测:

另一种与CUSUM相似的方法是在移动平均的基础上计算z分数。kats中的 RobustStatDetector 就采用了这种方法:

 fromkats.tests.detectors.test_robust_stat_detectionimportRobustStatDetector  

 model=RobustStatDetector(ts)  
 change_points=model.detector(p_value_cutoff=0.001, comparison_window=12)  
 model.plot(change_points)

在这个方法中,我们将p值阈值设置为0.001,窗口大小设置为12(对应于一年的数据,因为该序列是按月收集的)。

使用kats中的RobustStatDetector检测变化点。RobustStatDetector在这个例子中检测到了几个相互靠近的变化点。

利用ruptures进行变化点检测

ruptures库同样提供了多种变化点检测算法的实现,包括PELT(修剪精确线性时间)、基于核的算法和动态规划算法等。

以下是使用PELT算法检测均值变化的示例:

 importrupturesasrpt  

 # 将时间序列转换为numpy数组  
 signal=series['y'].values  

 # 拟合PELT模型  
 model=rpt.Pelt(model="rbf").fit(signal)  

 # 获取变化点  
 result=model.predict(pen=10)

PELT算法的核心思想是将时间序列分割成具有不同统计特性(如均值)的多个片段。它通过最小化一个用户定义的成本函数来实现这一目标,该函数的具体形式取决于需要检测的变化类型。在这个例子中我们使用了基于径向基函数的模型(model="rbf")。

以下是PELT模型的检测结果:

变化点的处理策略

在识别出变化点后,下一步就是采取适当的处理措施。以下是几种常用的处理方法:

差分法

对时间序列进行差分是处理均值变化的一种有效方法。这种技术通过计算连续观测值之间的差值来稳定序列的平均水平。

以下是示例序列的一阶差分结果:

差分法能够有效消除许多类型的非平稳性,使得后续的分析和建模工作更加可靠。

虚拟变量法

另一种处理变化点的方法是引入虚拟变量。这种方法在变化点之前赋值为0,之后赋值为1,从而在模型中显式地表示结构变化。

虚拟变量法允许模型捕捉变化前后的不同行为,提高了模型的灵活性和准确性。

区制转换模型

对于暂时性变化,区制转换模型(regime-switching)是一种较为复杂但有效的建模方法。这类模型能够根据当前的状态或区制采用不同的参数设置。

阈值自回归(TAR)模型是区制转换模型的一个典型例子。TAR模型对不同范围的时间序列值采用不同的参数,从而能够捕捉复杂的非线性动态。

总结结论

通过本文的分析,我们可以得出以下几点重要结论:

  1. 时间序列常常受到结构变化的影响,这些变化会显著改变序列的统计分布特性。
  2. 结构变化可能发生在均值或方差上,并且可能是永久性的或暂时性的。准确识别变化的性质对于选择适当的处理方法至关重要。
  3. 现代统计和机器学习提供了多种变化点检测方法,如CUSUM和PELT算法。这些方法在kats和ruptures等Python库中都有实现,为实践应用提供了便利。
  4. 对于检测到的变化点,可以采用多种处理策略。差分法和引入虚拟变量是处理均值变化的常用方法,而对于更复杂的情况,可以考虑使用区制转换模型。
  5. 数据预处理在处理结构变化中扮演着关键角色。合适的预处理不仅可以稳定序列的方差,还能为后续的建模工作奠定基础。

通过深入理解时间序列的结构变化,并灵活运用各种检测和处理方法,分析人员可以显著提高时间序列模型的准确性和可靠性,为决策提供更有力的支持。

https://avoid.overfit.cn/post/79dc01ee0f834c03af1991a118b5fed0

作者:Vitor Cerqueira

目录
相关文章
|
3月前
|
运维 监控 算法
时间序列异常检测:MSET-SPRT组合方法的原理和Python代码实现
MSET-SPRT是一种结合多元状态估计技术(MSET)与序贯概率比检验(SPRT)的混合框架,专为高维度、强关联数据流的异常检测设计。MSET通过历史数据建模估计系统预期状态,SPRT基于统计推断判定偏差显著性,二者协同实现精准高效的异常识别。本文以Python为例,展示其在模拟数据中的应用,证明其在工业监控、设备健康管理及网络安全等领域的可靠性与有效性。
656 13
时间序列异常检测:MSET-SPRT组合方法的原理和Python代码实现
|
23天前
|
数据可视化 数据挖掘 数据安全/隐私保护
Python实现时间序列动量策略:波动率标准化让量化交易收益更平稳
时间序列动量策略(TSMOM)是一种基于资产价格趋势的量化交易方法,通过建立多头或空头头寸捕捉市场惯性。然而,传统TSMOM策略因风险敞口不稳定而面临收益波动问题。波动率调整技术通过动态调节头寸规模,维持恒定风险水平,优化了策略表现。本文系统分析了波动率调整TSMOM的原理、实施步骤及优势,强调其在现代量化投资中的重要地位,并探讨关键参数设定与实际应用考量,为投资者提供更平稳的风险管理体验。
63 4
Python实现时间序列动量策略:波动率标准化让量化交易收益更平稳
|
17天前
|
网络协议 API 开发者
分析http.client与requests在Python中的性能差异并优化。
合理地选择 `http.client`和 `requests`库以及在此基础上优化代码,可以帮助你的Python网络编程更加顺利,无论是在性能还是在易用性上。我们通常推荐使用 `requests`库,因为它的易用性。对于需要大量详细控制的任务,或者对性能有严格要求的情况,可以考虑使用 `http.client`库。同时,不断优化并管理员连接、设定合理超时和重试都是提高网络访问效率和稳定性的好方式。
62 19
|
16天前
|
XML JSON 安全
分析参数顺序对Python requests库进行POST请求的影响。
最后,尽管理论上参数顺序对POST请求没影响,但编写代码时仍然建议遵循一定的顺序和规范,比如URL总是放在第一位,随后是data或json,最后是headers,这样可以提高代码的可读性和维护性。在处理复杂的请求时,一致的参数顺序有助于调试和团队协作。
77 9
|
2月前
|
数据采集 数据可视化 数据挖掘
基于Python的App流量大数据分析与可视化方案
基于Python的App流量大数据分析与可视化方案
|
1月前
|
存储 数据采集 大数据
Python推导式进阶指南:优雅初始化序列的科学与艺术
本文系统讲解Python推导式的用法与技巧,涵盖列表、字典、集合推导式及生成器表达式。通过代码示例和性能对比,展示推导式在数据结构初始化中的优势:简洁高效、执行速度快30%-50%。文章分析基础语法、核心应用场景(如序列构造、键值对转换、去重运算)及嵌套使用,并探讨使用边界与最佳实践,强调可读性优先原则。最后指出,合理运用推导式能显著提升代码质量和处理效率,同时避免过度复杂化的陷阱。
41 0
|
2月前
|
开发框架 Java .NET
Python中main函数:代码结构的基石
在Python中,`main`函数是程序结构化和模块化的重要组成部分。它实现了脚本执行与模块导入的分离,避免全局作用域污染并提升代码复用性。其核心作用包括:标准化程序入口、保障模块复用及支持测试驱动开发(TDD)。根据项目复杂度,`main`函数有基础版、函数封装版、参数解析版和类封装版四种典型写法。 与其他语言相比,Python的`main`机制更灵活,支持同一文件作为脚本运行或模块导入。进阶技巧涵盖多文件项目管理、命令行参数处理、环境变量配置及日志集成等。此外,还需注意常见错误如全局变量污染和循环导入,并通过延迟加载、多进程支持和类型提示优化性能。
202 0
|
5月前
|
并行计算 安全 Java
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
在Python开发中,GIL(全局解释器锁)一直备受关注。本文基于CPython解释器,探讨GIL的技术本质及其对程序性能的影响。GIL确保同一时刻只有一个线程执行代码,以保护内存管理的安全性,但也限制了多线程并行计算的效率。文章分析了GIL的必要性、局限性,并介绍了多进程、异步编程等替代方案。尽管Python 3.13计划移除GIL,但该特性至少要到2028年才会默认禁用,因此理解GIL仍至关重要。
439 16
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
|
4月前
|
存储 索引 Python
Python入门:6.深入解析Python中的序列
在 Python 中,**序列**是一种有序的数据结构,广泛应用于数据存储、操作和处理。序列的一个显著特点是支持通过**索引**访问数据。常见的序列类型包括字符串(`str`)、列表(`list`)和元组(`tuple`)。这些序列各有特点,既可以存储简单的字符,也可以存储复杂的对象。 为了帮助初学者掌握 Python 中的序列操作,本文将围绕**字符串**、**列表**和**元组**这三种序列类型,详细介绍其定义、常用方法和具体示例。
Python入门:6.深入解析Python中的序列
|
4月前
|
监控 Java 计算机视觉
Python图像处理中的内存泄漏问题:原因、检测与解决方案
在Python图像处理中,内存泄漏是常见问题,尤其在处理大图像时。本文探讨了内存泄漏的原因(如大图像数据、循环引用、外部库使用等),并介绍了检测工具(如memory_profiler、objgraph、tracemalloc)和解决方法(如显式释放资源、避免循环引用、选择良好内存管理的库)。通过具体代码示例,帮助开发者有效应对内存泄漏挑战。
161 1

推荐镜像

更多