Исправить неверные данные, поступающие от датчика - PullRequest
0 голосов
/ 22 декабря 2019

У меня есть данные, поступающие от датчика, который я храню во временной серии.

Когда я их отображаю, я получаю:

raw data chart

Предполагается, что эти данные являются "непрерывными", например, температуры, не так быстро растут и падают.

После поиска похожих вопросов в Интернете - я думаю, что "сглаженная кривая" дала мне более релевантную информацию. результаты - я применяю «свертку» к данным, используя код, предоставленный в этом ответе .

Я получаю:

with convolution chart

Это неудовлетворительно, так как я предполагаю, что некоторые точки данных просто "неправильные" и должны быть удалены, а не усреднены.

Сделать это вручную довольно легко, так как мы можем угадать кривую:

by hand fixed chart

Вот данные и код для создания второго графика:

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 голосов
/ 23 декабря 2019

предупреждение, что это быстрый и грязный подход, а не основанный на статистике. Глядя на ваши данные, «плохие» моменты сильно различаются по сравнению с остальными данными. Поэтому, если вы посмотрите на данные, скажем, на 10 блоков данных и возьмете их стандартное отклонение, «плохие» данные должны иметь намного более высокий стандарт, чем хорошие данные, помечая их для удаления. Numpy обеспечивает быстрый способ вычисления стандартного ввода здесь .


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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...