修复来自传感器的错误数据点

时间:2019-12-22 19:52:13

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

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

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

raw data chart

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

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

我获得:

with convolution chart

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

手工操作非常容易,因为我们可以猜测曲线:

by hand fixed chart

这里是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()

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

1 个答案:

答案 0 :(得分:0)

警告这是一种快速而肮脏的方法,而不是基于统计数据。查看您的数据,“坏”点与其余数据相比有很大不同。因此,如果您查看10个数据点数据块中的数据并获取其标准偏差,则“不良”数据的std应当比良好数据的std高得多,从而将其标记为要删除。 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)