【问题标题】:Fix wrong data points coming from a sensor修复来自传感器的错误数据点
【发布时间】:2019-12-22 19:52:13
【问题描述】:

我有来自我存储在时间序列中的传感器的数据。

当我绘制它们时,我得到:

这些数据应该是“连续的”,比如温度,不会上升和下降这么快。

在网上搜索了类似的问题后 - 我认为“平滑曲线”给了我更相关的结果 - 我将“卷积”应用于数据,使用 this answer 中提供的代码。

我得到:

这并不令人满意,因为我猜有些数据点只是“错误”,应该被删除,而不是平均。

用手来做很容易,因为我们可以猜到曲线:

这里是the data 和生成第二张图表的代码:

def smooth(y, box_pts):
    import numpy as np
    box = np.ones(box_pts)/box_pts
    return np.convolve(y, box, mode='same')


def load_data(f):
    from datetime import datetime as dt
    with open(f, "rt") as fd:
        X = []
        Y = []
        for line in fd.readlines():
            (x,y)=line.strip().split(" ")
            X.append(dt.fromtimestamp(int(x)))
            Y.append(float(y))
        return (X, Y)


import sys
(X,Y) = load_data(sys.argv[1])

from matplotlib.pyplot import plot, show
plot(X, Y,'b-')
plot(X, smooth(Y,19), 'g-', lw=2)
show()

我正在寻找一种可以删除“坏”值的算法,知道吗?

【问题讨论】:

  • 不幸的是,我认为这是题外话。尝试统计堆栈交换?您也没有分享太多关于数据本身的信息,这当然很重要。
  • @AMC,我修复了指向数据的链接,以便可以复制图表。我交叉发布到“交叉验证”;看看它是否会带来答案......

标签: python charts time-series data-processing timeserieschart


【解决方案1】:

警告这是一种快速而肮脏的方法,而不是基于统计数据。查看您的数据,与其他数据相比,“坏”点变化很大。因此,如果您查看 10 个数据点块中的数据并获取它们的标准偏差,则“坏”数据的标准应该比好数据高得多,从而将其标记为删除。 numpy 提供了一种快速计算 std here 的方法。


for i in range(len(Y)):
    std = np.std([ Y[i+j] for j in range(-5,5,1) if i+j >=0 and i+j <len(Y)])
    if std > 5:
        #mark for removal (don't remove here or it will screw up loop)

【讨论】:

    猜你喜欢
    • 2011-06-04
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 2019-07-06
    • 2014-04-03
    相关资源
    最近更新 更多