Фильтрация данных Python для удаления выбросов на графике плотности

Ссылаясь на приведенный ниже график, я хотел бы удалить все выбросы за пределами области плотности, отмеченной овалом черного цвета. Я могу использовать простые горизонтальные фильтры, например, -4 < данные < 4. Но выбросы все равно остаются. Я ищу любой метод, который точно фиксирует образцы плотности, но исключает выбросы.

Образец данных:

x = array([1243. , 1261. ,  973. ,  842. ,  592. ,  499. , 1088. ,  739.5,
        567.5,  536.5,  854. ,  763. ,  671. ,  574. ,  498.5,  510.5,
        541.5,  544. ,  565.5,  482. ,  416. ,  412.5,  440. ,  540. ,
        652. ,  735. ,  878. , 1030. , 1022. , 1105. , 1034. , 1064. ,
       1089. , 1115. , 1145. , 1146. , 1111. , 1117. , 1140. , 1168. ,
        845. , 1173. ,  898. , 1091. ,  591. ,  570.5,  506. ,  592.5,
        682.5,  619.5,  663. ,  593. ,  470. ,  810. ,  694.5,  900. ,
        965. ,  954. ,  771. ,  608.5,  631. ,  593. ,  652. ,  428. ,
        486. ,  445. ,  395.5,  387.5,  383. ,  390. ,  408. ,  420. ,
        470. ,  543.5,  686. ,  550. ,  588. ,  556.5,  475.5,  606. ,
        617. ,  674. ,  571. ,  810. ,  913. ,  868. ,  621.5,  417. ,
        388. ,  428. ,  501. ,  586.5,  668. ,  739. ,  914. ,  829. ,
        966. ,  995. , 1008. ,  961. ])

y = array([[-10.6,   0.4,   0.1,  -0.1,  -0.5,   0. ],
       [-12.5,   1.5,   1.4,   0.9,   0.7,   0.7],
       [  4.5,   0.3,   0.2,   0. ,   0.6,   0.2],
       [  4.6,  -0.7,  -0.8,  -0.9,  -0.7,  -0.8],
       [  1.8,  -1.3,  -1.6,  -1.8,  -1.4,  -1.5],
       [ 10.4,  -1.4,  -1.5,  -1.1,  -1.2,  -1.1],
       [  1. ,  -0.6,  -0.5,  -0.3,  -0.2,  -0.2],
       [  0. ,   0.2,  -0.1,   0.1,  -0.1,  -0.1],
       [ -1.7,  -1.1,  -1. ,  -0.9,  -0.8,  -0.7],
       [  1.6,  -1. ,  -1.3,  -0.7,  -1. ,  -0.8],
       [  0.5,   0. ,   0. ,   0.3,   0.1,   0.3],
       [ -0.1,  -0.3,  -0.5,  -0.2,  -0.1,  -0.1],
       [  0.8,  -0.4,  -0.3,  -0.4,  -0.5,  -0.5],
       [ -1.3,  -0.8,  -1. ,  -1. ,  -1.3,  -1.1],
       [ -0.1,  -1.9,  -2.2,  -1.6,  -1.7,  -1.5],
       [ -0.9,  -1.3,  -1.5,  -1.9,  -1.7,  -2.1],
       [ -0.5,  -0.8,  -0.9,  -1.3,  -1.4,  -1.3],
       [ -0.2,  -0.6,  -0.5,  -0.8,  -1.6,  -0.9],
       [ -0.8,  -1.2,  -1. ,  -0.6,  -0.8,  -0.9],
       [ -1.2,  -0.6,  -1. ,  -0.4,  -1.3,  -0.4],
       [ -1.1,  -1. ,  -1.1,  -1.2,  -1. ,  -1.3],
       [ -0.8,  -0.9,  -1. ,  -1. ,  -2.7,  -1. ],
       [ -1.2,  -1.4,  -1.4,  -1.1,  -1.6,  -1.1],
       [ -0.4,  -0.6,  -0.7,  -0.5,   3.5,  -0.6],
       [  0.4,   0.1,   0. ,   0.1,   7.3,   0.1],
       [  0.2,  -0.1,   0. ,   0.5,   3.2,   0.6],
       [  0.3,   0.4,   0.2,   0.1, -16.7,   0.1],
       [  1.3,   1.1,   1.1,   1.4,  -2.1,   1.3],
       [  1.2,   1.4,   1.3,   1.3,  -1.7,   1.4],
       [  1.6,   1.2,   1.3,   1.5,   1.6,   1.6],
       [  0.8,   1.3,   1.3,   1.1,   1.1,   1.2],
       [  0.4,   1. ,   1.1,   0.6,   0.8,   0.7],
       [  1. ,   1.1,   1.3,   0.9,   1. ,   1.1],
       [  0. ,   0.3,   0.3,  -0.2,  -0.4,  -0.2],
       [  0.4,   0.6,   0.7,   0.1,  -0.1,   0.2],
       [  1.6,   1. ,   0.9,   0.6,   0.8,   0.6],
       [  0.3,   0.6,   0.6,   0.3,   0.4,   0.5],
       [  0.2,  -0.6,   0. ,   0.2,   0.1,   0.2],
       [ -0.3,   0.6,   0.2,  -0.1,  -0.2,  -0.2],
       [  0.4,   0.5,   0.6,   0.2,   0.2,   0.3],
       [ -0.1,   0.1,   0.1,  -0.2,   0. ,  -0.2],
       [ -0.3,  -0.6,  -0.5,  -0.3,  -0.4,  -0.2],
       [  0.2,   0.1,   0.3,   0.1,   0.1,   0. ],
       [ -0.3,  -0.5,  -0.5,  -0.7,  -0.7,  -0.6],
       [ -1.1,  -0.8,  -0.9,  -0.8,  -1. ,  -0.9],
       [ -2.9,  -1.9,  -2.2,  -2.3,  -2.3,  -2.4],
       [ -3. ,  -2.4,  -2.5,  -2.2,  -1.9,  -2.3],
       [ -0.4,  -1.5,  -1.4,  -0.8,  -0.6,  -0.9],
       [  0.4,   0.1,   0. ,   0.4,   0. ,   0.4],
       [ -0.1,  -0.8,  -0.7,   0. ,  -0.1,  -0.1],
       [ -0.3,  -0.6,  -0.3,  -0.2,  -0.2,  -0.2],
       [  0.4,   0.4,   0.2,  -0.1,  -0.1,  -0.1],
       [ -1.9,  -1.6,  -1.8,  -1.7,  -1.8,  -1.8],
       [ -0.5,  -0.8,  -0.8,  -0.6,  -0.1,  -0.6],
       [  0.8,   0.4,   0.5,   0.8,   0.7,   0.7],
       [  1.1,   1. ,   1. ,   0.7,   0.9,   0.8],
       [  0.7,   0.8,   0.9,   0.7,   0.6,   0.7],
       [  1. ,   1.1,   1. ,   0.8,   0.8,   0.8],
       [  0.2,   0.5,   0.4,   0.3,   0.1,   0.3],
       [ -0.3,  -1.2,  -1. ,  -0.7,  -0.5,  -0.8],
       [ -0.4,  -0.5,  -0.4,  -0.2,  -0.4,  -0.2],
       [  0. ,  -0.5,  -0.2,   0.3,   0.1,   0.2],
       [  0.2,   0. ,   0.1,   0.1,  -0.1,   0. ],
       [ -1.1,  -0.6,  -0.8,  -0.7,  -0.6,  -0.7],
       [ -0.8,  -0.9,  -0.9,  -0.6,  -0.7,  -0.6],
       [ -0.7,  -0.4,  -0.6,  -0.5,  -0.6,  -0.4],
       [ -1.6,  -1.2,  -1.4,  -1.1,  -1.2,  -1.3],
       [ -0.5,  -1.6,  -1.5,  -0.7,  -0.7,  -0.7],
       [ -1. ,  -1.2,  -1.3,  -0.6,  -0.9,  -0.8],
       [ -0.7,  -0.4,  -0.4,  -0.5,  -0.7,  -0.5],
       [ -0.1,  -0.2,  -0.3,   0. ,  -0.2,  -0.1],
       [ -0.5,  -0.4,  -0.4,  -0.3,  -0.3,  -0.2],
       [ -0.5,  -0.3,  -0.5,  -0.3,  -0.4,  -0.4],
       [  0.2,   0. ,   0. ,   0.1,   0. ,   0.1],
       [  0.9,   0.7,   0.8,   0.5,   0.6,   0.6],
       [  0.5,   0.6,   0.5,   0.6,   0.5,   0.5],
       [ -0.1,   0.2,   0.2,   0.4,   0.4,   0.4],
       [  0. ,   0.2,   0.1,   0.2,   0.2,   0.2],
       [ -0.4,  -0.2,  -0.4,  -0.2,  -0.3,  -0.2],
       [ -0.1,  -0.1,  -0.1,  -0.3,  -0.2,  -0.2],
       [  0.1,   0.4,   0.3,   0.1,   0.1,   0.1],
       [  0. ,   0. ,  -0.1,   0.2,   0.2,   0.3],
       [  0.7,   0.8,   0.9,   0.6,   0.6,   0.5],
       [  0.4,   0.2,   0.4,  -0.1,   0. ,   0.1],
       [  1.7,   1.4,   1.4,   1.2,   1.3,   1.2],
       [  0.9,   1. ,   1. ,   0.8,   1. ,   0.8],
       [  0.3,   0.5,   0.6,   0.4,   0.3,   0.3],
       [ -1.4,  -1. ,  -1.2,  -0.9,  -0.7,  -0.8],
       [ -1. ,  -1. ,  -1. ,  -1. ,  -1.2,  -1.1],
       [ -0.6,  -0.7,  -0.8,  -0.9,  -0.9,  -0.8],
       [ -0.5,  -0.8,  -0.7,  -0.3,  -0.4,  -0.4],
       [  0. ,  -0.2,  -0.1,  -0.3,  -0.5,  -0.3],
       [ -0.3,   0.2,   0. ,   0.1,   0. ,   0. ],
       [  0.8,   0.3,   0.4,   0.4,   0.5,   0.5],
       [  1.2,   1. ,   1.2,   0.8,   0.8,   0.6],
       [  1.7,   1.3,   1.4,   1.8,   1.8,   1.7],
       [  1.2,   1.1,   1.2,   1.1,   1.3,   1.3],
       [  1.5,   1.6,   1.6,   1.4,   1.7,   1.4],
       [  1.7,   1.8,   2. ,   1.5,   1.8,   1.5],
       [  0.6,   0.8,   1. ,   0.8,   1.3,   1. ]])

@ParmanM.Alizadeh предоставил примеры данных.

Mainland 17.05.2024 08:11
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В приведенном ниже коде используется IsolationForest для отделения выбросов от внутренних. Основной параметр для настройки — contamination=.

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

import numpy as np
from matplotlib import pyplot as plt

#x, y from OP

x_flat = np.repeat(x, y.shape[1])
y_flat = y.ravel()
xy = np.column_stack([x_flat, y_flat])

#Outlier modelling
from sklearn.ensemble import IsolationForest

contamination_fraction = 5 / 100 #5%
model = IsolationForest(contamination=contamination_fraction * 0.5)
pred = model.fit_predict(xy)

cmap = 'PiYG'
plt.scatter(xy[:, 0], xy[:, 1], c=pred, edgecolor='none', cmap=cmap)
plt.scatter(xy[:, 0], xy[:, 1], marker='.', s=5, color='white')
plt.gcf().set_size_inches(7, 4)
plt.xlabel('x')
plt.ylabel('y')
plt.gca().spines[:].set_visible(False)

#Legend
plt.scatter([], [], color=plt.get_cmap(cmap, 2)(0.), label='outlier')
plt.scatter([], [], color=plt.get_cmap(cmap, 2)(1.), label='inlier')
plt.scatter([], [], edgecolor='gray', color='white', label='data')
plt.legend()

Кажется, это делает довольно хорошую работу. Но как применить то же самое к данным временных рядов?

Mainland 26.05.2024 06:40

Думаю, это стоит задать как новый вопрос, возможно, больше подходящий для DataScience, где можно было бы изложить детали задачи. Возможно, вы могли бы применить .predict к каждому временному шагу после того, как вы вписали его в значения серии поездов y.

MuhammedYunus 26.05.2024 11:55

Другие вопросы по теме