Исключение выбросов в DataFrame pandas по колонке 'Vol'
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для скорейшего исключения выбросов из DataFrame воспользуйтесь методом межквартильного размаха (IQR).
# Вычисление границ IQR
Q1, Q3 = df['Data'].quantile([0\.25, 0.75])
IQR = Q3 – Q1
нижняя_граница, верхняя_граница = Q1 – 1.5 * IQR, Q3 + 1.5 * IQR
# Отсеивание выбросов
df_очищенный = df[(df['Data'] >= нижняя_граница) & (df['Data'] <= верхняя_граница)]
df_очищенный
теперь не содержит выбросов благодаря использованию границ IQR.
Продвинутые приёмы для разных типов данных
Предварительная настройка обработки выбросов может потребоваться в зависимости от ваших данных. Рассмотрим несколько передовых стратегий для различных случаев:
Z-отклонение: научный подход к нормальным данным
Для данных с нормальным распределением применяйте Z-отклонение. Оно показывает, насколько далеко каждая единица данных находится от среднего, определённого в стандартных отклонениях.
from scipy import stats
import numpy as np
# Вычисление Z-отклонения
z_отклонения = np.abs(stats.zscore(df))
# Исключение выбросов
df_очищенный_z = df[(z_отклонения < 3).all(axis=1)]
Анализ временных рядов с помощью скользящего окна
Для коррелированных временных рядов метод скользящего окна подходит как нельзя лучше.
# Определение размера скользящего окна
размер_окна = 5
# Применение функции со скользящим окном для отсеивания выбросов
очищающая_функция = lambda x: x[np.abs(stats.zscore(x)) < 3]
df_очищенный_скользящим = df.rolling(window=размер_окна).apply(очищающая_функция)
Обработка асимметричных данных с применением надёжных мер
Асимметричные данные можно корректировать с помощью медианы и IQR.
# Расчёт медианы и IQR
медиана = df['Data'].median()
Q1, Q3 = df['Data'].quantile([0\.25, 0.75])
IQR = Q3 – Q1
# Задание надёжных границ с использованием IQR
нижняя_граница, верхняя_граница = медиана – 1.5 * IQR, медиана + 1.5 * IQR
# Отсеивание на основе заданных границ
df_надежный = df[(df['Data'] >= нижняя_граница) & (df['Data'] <= верхняя_граница)]
Искусство обработки выбросов
Удаляя выбросы, мы придаём DataFrame аккуратность и снижаем "шум", улучшая качество данных:
df = df[(df['value'] >= нижняя_граница) & (df['value'] <= верхняя_граница)]
Боремся с оговорками, поскольку 'Данные бывают разные'
Условная замена и задача 'Сохранить объём данных'
Если удаление выбросов нежелательно из-за уменьшения объёма данных, можно заменять их на центральные значения или на NaN.
# Замена выбросов на NaN
df_условно_очищенный = df.where((df >= нижняя_граница) & (df <= верхняя_граница), np.nan)
# Удаление NaN при необходимости
df_условно_очищенный_без_NaN = df_условно_очищенный.dropna()
Масштабирование выбросов в многомерных данных
В многомерных данных выбросы не всегда заметны. Примените масштабирование и PCA для обнаружения скрытых выбросов.
Выбросы в категориальных данных
Для корректировки выбросов в категориальных данных используйте методы one-hot encoding, label encoding или более продвинутые, как embedding.
Полезные материалы
- scipy.stats.zscore — Руководство SciPy v1.12.0 — дополнительные способы работы с Z-отклонением.
- numpy.percentile — Руководство NumPy v1.18 — подробнее о влиянии процентилей на обнаружение выбросов.
- Обнаружение и исключение выбросов в DataFrame pandas – Stack Overflow — набор методов для выявления выбросов.
- 5 способов обнаружения выбросов, которые должен знать каждый специалист по данным — обзор техник обнаружения выбросов в Python.
- outlier-utils · PyPI — библиотека Python для упрощения процесса обнаружения выбросов.