logo

Исключение выбросов в DataFrame pandas по колонке 'Vol'

Быстрый ответ

Для скорейшего исключения выбросов из DataFrame воспользуйтесь методом межквартильного размаха (IQR).

Python
Скопировать код
# Вычисление границ 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-отклонение. Оно показывает, насколько далеко каждая единица данных находится от среднего, определённого в стандартных отклонениях.

Python
Скопировать код
from scipy import stats
import numpy as np

# Вычисление Z-отклонения
z_отклонения = np.abs(stats.zscore(df))

# Исключение выбросов
df_очищенный_z = df[(z_отклонения < 3).all(axis=1)]

Анализ временных рядов с помощью скользящего окна

Для коррелированных временных рядов метод скользящего окна подходит как нельзя лучше.

Python
Скопировать код
# Определение размера скользящего окна
размер_окна = 5

# Применение функции со скользящим окном для отсеивания выбросов
очищающая_функция = lambda x: x[np.abs(stats.zscore(x)) < 3]
df_очищенный_скользящим = df.rolling(window=размер_окна).apply(очищающая_функция)

Обработка асимметричных данных с применением надёжных мер

Асимметричные данные можно корректировать с помощью медианы и IQR.

Python
Скопировать код
# Расчёт медианы и 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 аккуратность и снижаем "шум", улучшая качество данных:

Python
Скопировать код
df = df[(df['value'] >= нижняя_граница) & (df['value'] <= верхняя_граница)]

Боремся с оговорками, поскольку 'Данные бывают разные'

Условная замена и задача 'Сохранить объём данных'

Если удаление выбросов нежелательно из-за уменьшения объёма данных, можно заменять их на центральные значения или на NaN.

Python
Скопировать код
# Замена выбросов на NaN
df_условно_очищенный = df.where((df >= нижняя_граница) & (df <= верхняя_граница), np.nan)

# Удаление NaN при необходимости
df_условно_очищенный_без_NaN = df_условно_очищенный.dropna()

Масштабирование выбросов в многомерных данных

В многомерных данных выбросы не всегда заметны. Примените масштабирование и PCA для обнаружения скрытых выбросов.

Выбросы в категориальных данных

Для корректировки выбросов в категориальных данных используйте методы one-hot encoding, label encoding или более продвинутые, как embedding.

Полезные материалы

  1. scipy.stats.zscore — Руководство SciPy v1.12.0 — дополнительные способы работы с Z-отклонением.
  2. numpy.percentile — Руководство NumPy v1.18 — подробнее о влиянии процентилей на обнаружение выбросов.
  3. Обнаружение и исключение выбросов в DataFrame pandas – Stack Overflow — набор методов для выявления выбросов.
  4. 5 способов обнаружения выбросов, которые должен знать каждый специалист по данным — обзор техник обнаружения выбросов в Python.
  5. outlier-utils · PyPI — библиотека Python для упрощения процесса обнаружения выбросов.