Как удалить выбросы в Python? - PullRequest
0 голосов
/ 28 января 2019

Я хочу удалить выбросы из своего "поезда" набора данных, для чего я решил использовать z-Score или IQR.

Я использую записную книжку Jupyter на клиенте Microsoft Python для SQL Server.

Я пробовал для z-счета:

from scipy import stats
train[(np.abs(stats.zscore(train)) < 3).all(axis=1)]

для IQR:

Q1 = train.quantile(0.02)
Q3 = train.quantile(0.98)
IQR = Q3 - Q1
train = train[~((train < (Q1 - 1.5 * IQR)) |(train > (Q3 + 1.5 * 
IQR))).any(axis=1)]

... который возвращает ...

дляz-оценка:

Ошибка типа: неподдерживаемые типы операндов для /: 'str' и 'int'

для IQR:

TypeError: неупорядоченные типы: str ()

Мой набор данных поезда выглядит следующим образом:

# Number of each type of column
print('Training data shape: ', train.shape)
train.dtypes.value_counts()

Форма данных обучения: (300000, 111)int32 66 float64 30 объект 15 dtype: int64

Помощь будет принята.

1 Ответ

0 голосов
/ 28 января 2019

У вас проблемы с кодом, потому что вы пытаетесь вычислить zscore для категориальных столбцов.

Чтобы избежать этого, вы должны сначала разделить ваш поезд на части с числовыми и категориальными характеристиками:

num_train = train.select_dtypes(include=["number"])
cat_train = train.select_dtypes(exclude=["number"])

и только после этого вычислить индекс сохраняемых строк:

idx = np.all(stats.zscore(num_train) < 3, axis=1)

и, наконец, сложить две части вместе:

train_cleaned = pd.concat([num_train.loc[idx], cat_train.loc[idx]], axis=1)

Для части IQR:

Q1 = num_train.quantile(0.02)
Q3 = num_train.quantile(0.98)
IQR = Q3 - Q1
idx = ~((num_train < (Q1 - 1.5 * IQR)) | (num_train > (Q3 + 1.5 * IQR))).any(axis=1)
train_cleaned = pd.concat([num_train.loc[idx], cat_train.loc[idx]], axis=1)

Пожалуйста, дайте нам знать, если у вас есть какие-либо дополнительные вопросы.

PS

Кроме того, вы можете рассмотреть еще один подход для работы с выбросами с пандами.DataFrame.clip , который будет обрезать выбросы в каждом конкретном случае, а не отбрасывать строку целиком.

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