【问题标题】:Modify outliers caused by sensor-failures in timeseries data修改时间序列数据中由传感器故障引起的异常值
【发布时间】:2020-10-09 20:52:24
【问题描述】:

我正在处理每隔 5 分钟从传感器收集的时间序列数据。不幸的是,有时测量值(以瓦特为单位的光伏发电量)突然变为 0 或非常高前后的值是正确的

我的目标是识别这些“异常值”并(在第二步中)计算前一个值和下一个值的平均值以固定测量值。到目前为止,我已经尝试了两种方法,但是收到了许多不是测量误差的“异常值”。因此,我正在寻找更好的方法。

尝试 1:使用 IQR Source 进行经典异常值检测

def updateOutliersIQR(group):
  Q1 = group.yield.quantile(0.25)
  Q3 = group.yield.quantile(0.75)
  IQR = Q3 - Q1
  outliers = (group.yield < (Q1 - 1.5 * IQR)) | (group.yield > (Q3 + 1.5 * IQR))
  print(outliers[outliers == True]) 

# calling the function on a per-day level
df.groupby(df.index.date).apply(updateOutliers)

尝试2:核密度估计Source

def updateOutliersKDE(group):
  a = 0.9
  r = group.yield.rolling(3, min_periods=1, win_type='parzen').sum()
  n = r.max()
  outliers = (r > n*a)
  print(outliers[outliers == True]) 

# calling the function on a per-day level
df.groupby(df.index.date).apply(updateOutliers)

尝试 3:中值过滤器Source (正如 Jonnor 所建议的)

def median_filter(num_std=3):
  def _median_filter(x):
    _median = np.median(x)
    _std = np.std(x)
    s = x[-3]
    if (s >= _median - num_std * _std and s <= _median + num_std * _std):
      return s
    else:
      return _median
  return _median_filter

# calling the function
df.yield.rolling(5, center=True).apply(median_filter(2), raw=True)

编辑:使用 try 3 和 5 的窗口和 3 的标准,它最终会捕获大量异常值,但也会降低其他(非故障)传感器测量的准确性:

有没有更好的方法来检测所描述的“异常值”或对具有偶尔传感器测量问题的时间序列数据进行平滑处理?

【问题讨论】:

  • 你试过中值滤波器吗?如果只有几个时间步有错误,请尝试非常短的长度,例如 3 或 5。这可以通过 pandas.rolling_median pandas.pydata.org/pandas-docs/version/0.17.0/generated/… 完成
  • 另外,你能画出你的错误的例子吗?人们可能更容易看到在这种情况下有什么帮助
  • 你可以看看IsolationForest和这个paper。我在很多项目中都使用过它。如果您有多个功能,效果会更好
  • 感谢您将我指向中值滤波器。仅查看窗口为 5 且标准为 2 的中值实际上有助于消除大多数错误的传感器测量。我现在需要基本上使用 window-size 和 std 来找到最合适的,这是否正确?或者我可以做一些更系统的事情吗?我已经相应地更新了我的问题

标签: python pandas time-series outliers anomaly-detection


【解决方案1】:

你的异常值在某种意义上是异常的

  • 这些值与其周围的值有很大的偏差
  • 从一个时间步到另一个时间步的值变化非常快

因此,我们需要一个过滤器,它可以在短时间内过滤掉这些内容。

其中一个最简单、最有效的是median filter

filtered = pandas.rolling_median(df, window=5)

窗口越长,过滤器越强。

另一种选择是低通滤波器。虽然设置一个合适的截止频率可能比较困难,但它会给信号带来平滑度。

当然也可以创建更多的自定义过滤器。例如,计算一阶差分,并拒绝高于某个阈值的变化。您可以绘制差异的直方图以确定阈值。将这些标记为缺失 (NaN),然后使用中位数/平均值估算缺失。

如果您的目标是异常检测,您还可以使用自动编码器。我预计光伏输出将具有非常强劲的每日模式。因此,在日常序列上对其进行训练应该效果很好(前提是您有足够的数据)。这比简单的过滤器要复杂得多,但具有能够检测许多其他类型的异常的优势,而不仅仅是此处识别的模式。

【讨论】:

  • 我完全同意 jonnor 所说的话。关于检测,您可以简单地应用pandas.Series.diff() 函数。定制的卷积过滤器也很有帮助。两者都取决于决策的阈值并减少时间序列中的动态。
猜你喜欢
  • 1970-01-01
  • 2020-09-20
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-02
  • 2014-11-06
  • 1970-01-01
相关资源
最近更新 更多