Неверные значения и выбросы
«Неверные данные» — это значения, которые формально влезают в столбец, но не
имеют физического смысла: -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.