如何在python中创建一个滚动窗口函数来检测时间序列数据集中的峰值?



我正在处理一个大型时间序列数据集,其中包括来自传感器的读数,测量热电厂的各种指标,如温度,功率,压力等。这些数据以5-25秒的不同基频收集,自2019年初开始收集。一些传感器数据集携带超过1200万个点。

我的目标是检测数据集中由传感器给出错误读数引起的错误。在这个项目中需要注意的一件重要的事情是,我不是在寻找设备的高价值(即温度以有关的速度上升)。我在数据集中寻找不正确的读数,这些读数出现在看似随机发生的分布之外的单点方式。

我尝试了一些机器学习技术,如One-class SVM, UMAP,一些Pyod技术,但当数据集没有标记表明一个点是否错误时,很难训练和评估模型。在大多数这些技术中,它检测到温度上升和传感器正常工作的异常情况,这不是我们想要的。

这个数据集的另一个问题是,植物在整个时间序列数据集中经历了许多不同的状态。有时工厂将被关闭,所有的值都将为0,这是预期的。任何建模技术都会将这些0点作为错误,这不是我们想要的。

我决定使用大小为n的滚动窗口创建一个函数。对于该窗口,计算平均值,中位数和标准差。如果下一个进入的点离窗口平均值有2个标准差,那么就认为这是一个错误。使用此滚动窗口将消除设备不同运行状态的影响,并有望避免检测到预期的。异常。

谁有什么建议来创建这个滚动窗检测功能?或者其他可能的技术?这是一个单变量问题,我们将在每个传感器上分别运行它。

如果您的时间序列传感器数据在pandas数据框架中,则可以使用内置的滚动窗口计算,例如平均值和std,您可以使用这些计算来查找异常值。

我想是这样的:

import pandas as pd
window = 3
df = pd.DataFrame({'Data' : [5, 5, 6, 7, 5, 5, 5]})
std = df.rolling(window).std()
mean = df.rolling(window).mean()

你可以使用z-score作为分类"异常值"的方法。即数据点减去平均值,全部除以std。

z = (x - mean) / std

离0越远,离群值越大。

最新更新