Итак, я ранее задавал вопрос по этой проблеме сегодня, а также получил хороший рабочий ответ. К сожалению, я столкнулся с еще большей проблемой, используя решение, которое я получил здесь.
Мой предыдущий вопрос можно найти здесь Как я могу заменить выбросы средним значением предыдущего и следующего соседа? .
Так что, в принципе, проблема в том, что у меня огромный набор данных (который я также могу загрузить, если это желательно), который показывает много выбросов, некоторые из них на 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 показывает максимумы точек выброса.
Итак, моя проблема с предыдущим заданным вопросом заключается в том, что код в основном работает, но мои выбросы настолько велики по сравнению с интересующими данными, что мое исключение из среднего + стандартного отклонения, которое я использую, не будет работать.
Я мог бы, вероятно, использовать дискретные значения в качестве верхнего / нижнего пределов после разбиения моего набора данных на интервалы, но я действительно был бы признателен за динамическое решение для этого.