Заменить выбросы моего набора данных средними значениями соседей - PullRequest
0 голосов
/ 21 мая 2019

Итак, я ранее задавал вопрос по этой проблеме сегодня, а также получил хороший рабочий ответ. К сожалению, я столкнулся с еще большей проблемой, используя решение, которое я получил здесь.

Мой предыдущий вопрос можно найти здесь Как я могу заменить выбросы средним значением предыдущего и следующего соседа? .

Так что, в принципе, проблема в том, что у меня огромный набор данных (который я также могу загрузить, если это желательно), который показывает много выбросов, некоторые из них на 15 порядков выше, чем данные, представляющие интерес.

Как правило, я бы просто отфильтровал или удалил их, но мне нужно выполнить отклонение Аллана с набором данных, что означает, что мне нужно точно моя исходная ось х (время) в моем наборе данных, чтобы получить правильные интервальные временные масштабирования.

Моя идея заключалась в том, чтобы использовать цикл замены, который заменяет каждый выброс 2sigma на среднее значение его соседа. Для этого я сначала разбил свой набор данных на интервалы, чтобы получить лучшие средние значения, которые действуют более локально.

Что происходит сейчас, так это то, что у меня слишком много и слишком большие выбросы, которые в основном делают невозможным получение хорошего среднего значения (выбросы при 1e + 25 по сравнению с 1e + 09 для моих данных).

Вот код, который я сейчас использую:


def stddev_beat(beatname1, nameadevevac):
    beatpath = os.path.abspath('...')


    y = np.loadtxt('...' + beatname1 + '.csv', delimiter = ",", skiprows = 1)


    n = 60


    ### split dataset into intervals ###
    def divide_chunks(l, n): 

        for i in range(0, len(l), n):  
            yield l[i:i + n] 

    empty = []


    x = list(divide_chunks(y,n))


    l=x


    for j in range(len(l)):
        std  = np.std(l[j][:,1])
        mean = np.mean(l[j][:,1])

        for i in range (len(l[j][:,1])):
            if((l[j][i,1]<1e+10)&(l[j][i,1]>1e+07)):
                pass
            else:
                if (i!=len(l[j][:,1])-1)&(i!=0):
                    l[j][i,1]=(l[j][i-1,1]+l[j][i+1,1])/2
                else:
                    l[j][i,1] = mean
        final = [[x,y] for x,y in l[j]]
        empty.extend(final)



    ready_x, ready_y = zip(*empty)

    x = np.array(list(ready_x))
    y = np.array(list(ready_y))


    ##############


    plt.plot(x/3600, y)
    plt.xlabel(r'time [h]')
    plt.ylabel(r'beat frequency [Hz]')
    plt.grid(True, which='both')
    plt.show()

Я знаю, что внутри много мусора, но я хотел получить исходный код, который я использую.

Я действительно не знаю, есть ли решение для этого, не заменяя мои выбросы или заменяя их некоторыми ручными значениями, но, возможно, кто-то столкнулся с некоторой похожей проблемой.

Так что, если у кого-то есть идея, как решить эту проблему, я был бы очень признателен.

Edit:

Данные можно найти по этой ссылке dropbox . Этот PNG показывает график данных, представляющих интерес, в то время как Этот PNG показывает максимумы точек выброса.

Итак, моя проблема с предыдущим заданным вопросом заключается в том, что код в основном работает, но мои выбросы настолько велики по сравнению с интересующими данными, что мое исключение из среднего + стандартного отклонения, которое я использую, не будет работать.

Я мог бы, вероятно, использовать дискретные значения в качестве верхнего / нижнего пределов после разбиения моего набора данных на интервалы, но я действительно был бы признателен за динамическое решение для этого.

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