使用 Python 进行时间序列分割
Posted
技术标签:
【中文标题】使用 Python 进行时间序列分割【英文标题】:Time Series Segmentation using Python 【发布时间】:2021-10-28 15:32:08 【问题描述】:我有一个 TimeSeries 数据集,其中包含如下所示的图。我正在尝试找到对时间序列进行分割的最佳方法。我需要将时间序列分为三个区域 - 'RampUp'、'Plateua' 和 'CoolDown' 分别用于初始斜坡上升部分、近似恒定部分和最终冷却部分。
对我将获得的未来系列进行此细分的最佳方法是什么?例如,如果我的模型被赋予这样的时间序列作为输入,它应该能够输出区域边界的索引吗?另外,这可以在无人监督的情况下进行吗?
感谢您的宝贵时间。非常感谢任何建议。
【问题讨论】:
你试过什么?对我来说听起来是采样信号(时间序列数据)并将它们分为 3 类。这项工作可以以无监督的形式完成,例如将实例聚类为 3 个集群。另一个想法是使用集群/ML 方法生成时间间隔[a, b]
作为所需的段,或者我们称之为集群/类,具体取决于任务。
这些帖子中有很多可用的讨论:post1 和 post2,我发现了这个answer
【参考方案1】:
正如@mdgorgan 提供的那样,除了其他方法(基于机器学习的方法/黑客)之外,您还可以使用这种基于信号处理的方法来执行分割任务。我根据这个document尝试过:
#install library
#!python -m pip install ruptures
#import libraries
import matplotlib.pyplot as plt
import ruptures as rpt
#genearte sample data in form of a signal
n_samples, n_dims, sigma = 1000, 1, 1
n_bkps = 2 # number of breakpoints
signal, bkps = rpt.pw_constant(n_samples, n_dims, n_bkps, noise_std=sigma)
print(bkps) #[340, 671, 1000]
# detection
algo = rpt.Dynp(model="l2").fit(signal)
result = algo.predict(n_bkps=2)
print(result)
#[340, 670, 1000]
# display segmentation
rpt.display(signal, bkps, result)
plt.show()
它根据变化点检测进行分割工作。
【讨论】:
您好,谢谢您的建议!我已经尝试过使用它,这是一个很好的起点。但它不能准确预测我在问题中显示的曲线的边界指数。我可以做些什么来提高准确性?【参考方案2】:这听起来像是一个可以通过变更点检测来解决的问题。
ruptures
库是开始离线方法的好地方:https://pypi.org/project/ruptures/
您将找到已知和未知数量的变更点的方法。
【讨论】:
以上是关于使用 Python 进行时间序列分割的主要内容,如果未能解决你的问题,请参考以下文章
Python读取文件,使用split进行分割时,出现ufeff
使用 AugmentedManifest 在 SageMaker 中进行语义分割失败