Как я могу заменить выбросы средним значением предыдущего и следующего соседа? - PullRequest
0 голосов
/ 21 мая 2019

У меня действительно большой набор данных от биения двух лазерных частот и считывания частоты биений с частотой. счетчик.

Проблема в том, что у меня много выбросов в моем наборе данных.

Фильтрация не возможна, так как фильтрация / удаление выбросов убивает ценную информацию для моего отклонения от аллана, которое я использую для анализа своей частоты биений.

Проблема с удалением выбросов состоит в том, что я хочу сравнить все отклонения трех разных частот биений. Если я сейчас удалю некоторые точки, у меня будет более короткая ось X, чем раньше, и моя ось X отклонения Аллана будет изменяться по-другому. (По сути, adev создает новую ось X, начиная с интервалов моей частоты дискретизации и заканчивая моим самым длинным временем измерения -> которое является моим самым высоким значением оси X частоты биений.)

Извините, если это сбивает с толку, я хотел предоставить как можно больше информации.

Так или иначе, до сих пор я получал все свое отклонение от Аллана и успешно удалял выбросы, разбивая мой список на интервалы и сравнивая все значения y каждого интервала со стандартным отклонением интервала.

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

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

Ошибка указана как «объект numpy.int32 не имеет атрибута« где »». Нужно ли преобразовывать мой набор данных в структуру панды?

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


l = np.array([[0,4],[1,3],[2,25],[3,4],[4,28],[5,4],[6,3],[7,4],[8,4]])

print(*l)

sd = np.std(l[:,1])

print(sd)

for i in l[:,1]:

    if l[i,1] > sd:
        print(l[i,1])
        l[i,1].where(l[i,1].replace(to_replace = l[i,1], value = np.nan),
                other = (l[i,1].fillna(method='ffill')+l[i,1].fillna(method='bfill'))/2)

так что я хочу, чтобы список / массив с выбросами был заменен средствами предыдущих / следующих соседей

сообщение об ошибке: объект 'numpy.int32' не имеет атрибута 'где'

1 Ответ

0 голосов
/ 21 мая 2019

Одна опция действительно преобразует всю работу в панд только с помощью

import pandas as pd
dataset = pd.DataFrame({'Column1':data[:,0],'Column2':data[:,1]})

, что решит ошибку, поскольку объект pandas dataframe имеет команду where.Тем не менее, это не обязательно, и мы все еще можем работать только с numpy

Например, самый простой способ обнаружить выбросы - это посмотреть, не находятся ли они в диапазоне средних значений + -3std.Пример кода ниже, используя вашу настройку

import numpy as np
l = np.array([[0,4],[1,3],[2,25],[3,4],[4,28],[5,4],[6,3],[7,4],[8,4]])
std = np.std(l[:,1])
mean=np.mean(l[:,1])
for i in range (len(l[:,1])):
    if((l[i,1]<=mean+2*std)&(l[i,1]>=mean-2*std)):
        pass
    else:
        if (i!=len(l[:,1])-1)&(i!=0):
              l[i,1]=(l[i-1,1]+l[i+1,1])/2
        else:
              l[i,1]=mean

Сначала мы проверили, что значение находится в строке

if((l[i,1]<=mean+2*std)&(l[i,1]>=mean-2*std)):
        pass

Затем проверьте, не является ли он первым или последним элементом

if (i!=len(l[:,1])-1)&(i!=1):

Если это так, просто введите среднее значение в поле:

else:
     l[i,1]=mean     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...