Очистка и трансформация данных: фильтрация, сортировка, агрегация
Данный материал носит информационно-обучающий характер и не является юридической или финансовой консультацией. Применение полученных знаний на практике требует соблюдения законодательства и этических норм. Ответственность за любые действия, предпринятые на основе информации из курса, лежит на вас.
Мы загрузили данные из внешних источников и изучили структуру DataFrame. Теперь переходим к подготовке данных. В антифроде это критический этап: если в модель или отчет попадут «грязные» данные, выводы будут ошибочными.
Почему «грязные» данные опасны
Для исследователя очистка данных — это поиск аномалий. Мошенники маскируют активность, создавая технический шум или оставляя подозрительные пустоты в логах.
Трансформация данных превращает сырые логи в полезные признаки (фичи). Например, из точного времени транзакции можно выделить час совершения покупки. Это поможет обнаружить ночные всплески активности, нехарактерные для обычных клиентов.
Обработка пропущенных значений
Пропуски в данных (NaN — Not a Number) часто служат уликой. Например, отсутствие device_id может означать, что злоумышленник использует скрипт, который не передает параметры железа.
Обработка пропущенных значений в Pandas выполняется тремя основными способами:
- Поиск: определить масштаб проблемы.
- Заполнение: подставить нейтральное значение.
- Удаление: исключить записи (используйте осторожно).
# Считаем количество пропусков в каждом столбце
print(df.isnull().sum())
# Заполняем пропуски в device_id значением 'unknown'
df['device_id'] = df['device_id'].fillna('unknown')
# Удаляем строки только там, где нет критически важного user_id
df = df.dropna(subset=['user_id'])Фильтрация и поиск аномалий
Чтобы выделить подозрительные сегменты, мы используем фильтрацию. В Pandas вместо SQL-оператора WHERE применяется логическая индексация или метод query().
Как показано в Сравнении 1, правильная фильтрация позволяет отсечь легитимный трафик и сфокусироваться на зоне риска.
Ищем «бонус-хантеров» — тех, кто покупает только при 100% скидке по промокоду.
# Вариант 1: Логическая индексация
bonus_hunters = df[(df['payment_amount'] == 0) & (df['promo_applied'] == True)]
# Вариант 2: Метод query (код читается как предложение)
suspicious_ips = df.query('failed_logins > 5 and country == "RU"')Агрегация: выявление серийных атак
Мошенничество редко бывает единичным. Обычно это серия действий с одного устройства или на один адрес. Чтобы увидеть закономерность, используйте группировку groupby.
При анализе сумм транзакций лучше использовать медиану (median), а не среднее арифметическое (mean). Среднее значение легко искажается единичными экстремально крупными операциями, а медиана показывает реальную картину.
Выявляем «фермы аккаунтов» — устройства, с которых заходили в разные учетные записи.
# Группируем по ID устройства и считаем уникальных пользователей
device_stats = df.groupby('device_id')['user_id'].nunique().reset_index()
# Переименовываем столбцы и сортируем по убыванию
device_stats.columns = ['device_id', 'unique_users_count']
top_fraud_devices = device_stats.sort_values(by='unique_users_count', ascending=False)Особенности работы с методами Pandas
Помните: большинство методов (dropna, fillna, sort_values) по умолчанию возвращают копию данных, а не меняют исходный объект.
Ошибка: Ожидать, что данные отсортируются в текущей переменной.
df.sort_values(by='timestamp') # Изменения не сохранятся в dfПравильно: Перезаписать переменную.
df = df.sort_values(by='timestamp')Практическое упражнение
Используйте датафрейм df_orders и выполните задачи:
- Найдите строки, где отсутствует
ip_address, и заполните их значением127.0.0.1. - Отфильтруйте транзакции, совершенные ночью (столбец
is_nightравенTrue), где сумма превышает 50 000 рублей. - Сгруппируйте данные по
card_hash, посчитайте количество транзакций для каждой карты и выведите топ-5 самых активных.
Мы научились очищать данные и находить признаки групповых атак. В следующей теме мы разберем, как из разрозненных параметров устройства собирается цифровой отпечаток (fingerprint). Это позволит идентифицировать мошенника, даже если он сменил аккаунт и IP.
Понравился урок?
Сохраните прогресс и получите персональный курс по любой теме — без форм и паролей
Продолжить в Telegram