Неверные значения и выбросы

«Неверные данные» — это значения, которые формально влезают в столбец, но не имеют физического смысла: -999 в температуре, 1e9 в напряжении батареи, отрицательная влажность. Их нужно либо отфильтровать, либо заменить, либо обрезать (clip).

Когда использовать

  • Датчик «зашкалил» и выдал нерабочее значение.

  • Парсинг лог-файла поймал заголовки как данные.

  • Нужно ограничить значения для модели (нормализация).

Пример 1. Замена «магических» значений

import pandas as pd
import numpy as np

df = pd.DataFrame({"temp": [22, -999, 24, -999, 25]})
df["temp"] = df["temp"].replace(-999, np.nan)
print(df)

Output:

   temp
0  22.0
1   NaN
2  24.0
3   NaN
4  25.0

Пример 2. clip (обрезка по диапазону)

import pandas as pd

df = pd.DataFrame({"v": [10, 200, 25, -5, 30]})
print(df["v"].clip(0, 100))

Output:

0     10
1    100
2     25
3      0
4     30
Name: v, dtype: int64

Пример 3. Фильтрация по границам

import pandas as pd

df = pd.DataFrame({"temp": [22, -50, 35, 200, 28]})
ok = df[(df["temp"] > -40) & (df["temp"] < 80)]
print(ok)

Output:

   temp
0    22
2    35
4    28

Пример 4. Выбросы по правилу 3σ

import pandas as pd

df = pd.DataFrame({"v": [10, 11, 9, 12, 10, 100]})
mean, std = df["v"].mean(), df["v"].std()
ok = df[(df["v"] > mean - 3*std) & (df["v"] < mean + 3*std)]
print(ok)

Output:

    v
0  10
1  11
2   9
3  12
4  10

Значение 100 — выброс.

Пример 5. IQR (межквартильный размах)

import pandas as pd

df = pd.DataFrame({"v": [10, 11, 9, 12, 10, 100]})
q1, q3 = df["v"].quantile([0.25, 0.75])
iqr = q3 - q1
low, high = q1 - 1.5*iqr, q3 + 1.5*iqr
print(df[(df["v"] >= low) & (df["v"] <= high)])

Output:

    v
0  10
1  11
2   9
3  12
4  10

Пример 6. where — замена «не подходящих»

import pandas as pd

df = pd.DataFrame({"v": [10, 200, 25, 30]})
df["v"] = df["v"].where(df["v"] < 100, other=0)
print(df)

Output:

    v
0  10
1   0
2  25
3  30

Пример 7. mask — обратная логика

import pandas as pd

df = pd.DataFrame({"v": [10, 200, 25, 30]})
df["v"] = df["v"].mask(df["v"] > 100, 0)
print(df)

Output:

    v
0  10
1   0
2  25
3  30

Подводные камни

  • Никогда не удаляйте выбросы вслепую — иногда «выброс» означает реальное событие (короткое замыкание, удар по сенсору).

  • Правило 3σ предполагает нормальное распределение — для перекошенных используйте IQR.

  • clip ломает статистику (mean/std) — указывайте диапазон осознанно.

См. также

Примечание

Лицензия и источники

Техническое описание адаптировано из официальной документации Pandas (https://pandas.pydata.org/docs/), BSD-3-Clause License. Перевод на русский, примеры и пояснения — © AlashEd Wiki.