Обнаружение выбросов в дискретных сигналах - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть дискретный сигнал значения 0,1,2,3, который в идеальном случае должен выглядеть так:

enter image description here

но это реальность в большинстве случаев это выглядит так:

enter image description here

, поэтому для обнаружения этих выбросов я использовал скользящую медиану в pandas, в кадре данных dfResult содержится 511 значений равняется 0,1,2,3 в прогнозируемых столбцах.

from pandas.core.window import Rolling
threshold = 1
dfResult['median'] = dfResult['predicted'].rolling(10).median()
difference = np.abs(dfResult['predicted'] - dfResult['median'])
outlier_idx = difference > threshold

Теперь, когда он обнаруживает неправильные выбросы наряду с правильными, как показано ниже: enter image description here

Теперь, как я могу удалить эти неправильные выбросы, которые показаны после 300 тиков. Любое перенаправление / блоги для проверки выбросов в дискретных сигналах будет высоко ценится. Мне не нужно обнаруживать выбросы в режиме реального времени, мне нужно только выполнить постобработку.

пример данных:

dfResult['predicted'].values
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3,
       3, 3, 3, 3, 3, 3, 3, 3, 1, 2, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
       3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
       3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
       3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
       3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0])

1 Ответ

0 голосов
/ 26 февраля 2020

Вот как я буду go об этом: window может использоваться для выбора ширины выброса.

window = 2

#Indices of change
diff_ind = df.data.diff()[df.data.diff()!=0].index
diff_ind = pd.DataFrame({'diff_ind':diff_ind})
outlier_ind = df_diff_ind.diff_ind[df_diff_ind.diff_ind.diff() < window]

outlier_ind.values будет иметь array([ 26, 251, 252], dtype=int64), которые являются индексами значений Вы называете выбросы.

Вы можете делать с ними все, что считаете нужным:)

Надеюсь, это поможет.

...