微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

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

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

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

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

解决方法

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

我认为:

int

您可以使用 z 分数作为对“异常值”进行分类的方法。 即数据点减去均值,全部除以标准差。

import pandas as pd

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

离 0 越远,离群值越多。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。