使用 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进行英文单词分割

Python读取文件,使用split进行分割时,出现ufeff

Python + OpenCV:OCR 图像分割

使用 AugmentedManifest 在 SageMaker 中进行语义分割失败

如何使用 Python/Opencv 分割二进制图像中的附近元素

python中numpy合并和分割