首页 > 解决方案 > 如何创建滚动窗口函数来检测python中时间序列数据集中的峰值?

问题描述

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

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

我尝试了一些机器学习技术,例如 One-class SVM、UMAP、一些 Pyod 技术,但是当数据集没有指示某个点是否错误的标签时,很难训练和评估模型。使用这些技术中的大多数,它可以检测到温度上升且传感器正常工作的那些异常,这不是我们想要的。

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

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

有没有人有任何建议来创建这个滚动窗口检测功能?或者也许其他一些可能的技术?这是一个单变量问题,我们将在每个传感器上单独运行它。

标签: pythonerror-handlingtime-seriesmoving-averagestandard-deviation

解决方案


如果您的时间序列传感器数据位于 pandas 数据框中,则内置滚动窗口计算,例如均值和标准差,您可以在查找异常值时使用它们。

我认为是这样的:

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 分数作为对“异常值”进行分类的方式。即数据点减去平均值,全部除以标准差。

z = (x - mean) / std

离 0 越远,离群值越多。


推荐阅读