【问题标题】:How to detect outlier peaks in a water flow time series?如何检测水流时间序列中的异常峰值?
【发布时间】:2020-09-26 00:21:01
【问题描述】:

TL;DR:有需要处理的水流时间序列,无法找出去除异常峰值的方法。

我目前在一个项目中工作,我收到一个包含两列的 .csv 数据集:

  • 日期,datetime 时间戳
  • value,一个水流值

该数据集通常是对具有自动灌溉系统的管理实体的水流量传感器进行一年的测量,包含大约 402 000 个原始值。有时它可能有一些与浇水期不对应的峰值,因为它是正常值之间的准时值,例如image

到目前为止,我已经尝试计算两点之间的百分比差异和间距,并计算中值绝对偏差 (MAD),但两者都出现误报。

这里的问题是我需要一种算法来识别持续 1 或 2 次测量的自发峰值,因为在 2 分钟内流量增加 300% 在物理上是不可能的。

另一个问题是编码。需要一种动态的方法来检测这些峰值,因为根据整个dataset,我们清楚地看到了原因:在夏天,流量增加了一倍以上,不可能达到 0.95 个百分点。

我已经使用上述技术和 1 天的数据集准备了一个 github 存储库,这是我目前正在使用的数据集(大约 1000 个值)。

【问题讨论】:

    标签: python time-series detection


    【解决方案1】:

    不是一个真正的答案,但评论太长了:

    也许您可以使用峰的prominence。您可以将 find_peaksprominencewidth 参数一起使用,并尝试调整其他参数,例如用于突出计算的窗口大小 (wlen)。

    以下快速示例仅说明用法。它只是找到最小突出任意 3 倍中位数的峰值:

    from scipy.signal import find_peaks
    df = pd.read_csv('https://raw.githubusercontent.com/MigasTigas/peak_removal/master/dataset_simple_example.csv')
    peaks,_ = find_peaks(df.value, prominence=df.value.median()*3, width=(1,2))
    ax = df.plot()
    df.iloc[peaks.tolist()].plot(style=['x'], ax=ax)
    

    【讨论】:

    • 这是一个很好的解决方案,但是它会以另一种方式工作吗?有时也会发生具有高值和低峰值的情况。编辑:我意识到我可以重复高峰并降低突出度
    • 是的,您也可以将数组作为突出参数传递,而不是单个值。
    猜你喜欢
    • 2020-06-16
    • 2012-08-28
    • 2015-07-23
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 2018-12-03
    • 2020-04-20
    相关资源
    最近更新 更多