Python: Numpy
Теория: Фильтрация значений и вырезание
При работе с данными часто возникает необходимость найти элементы по определенному условию. С точки зрения поиска ошибок в данных критерии поиска могут быть разными, например:
- Отрицательные значения в графе «Количество продаж»
- Буквы вместо цифр в графе «Номер телефона»
- Нереалистично большие числа в графе «Сумма сделки»
В стандартном Python искать и фильтровать значения можно с помощью функции filter(). В Numpy есть схожая функциональность, которую мы рассмотрим в этом уроке. Вы узнаете, как получить элементы по заданному условию при работе с массивами numpy.ndarray.
Как создать булеву маску
Для фильтрации значений массива numpy.ndarray по определенному условию используют булевы маски — массивы значений True и False. Каждый элемент проходит фильтрацию через булеву маску и распределяется в зависимости от значения маски:
- Если на той же позиции в маске стоит значение
True, элемент добавляется в итоговый массив - Если на позиции стоит значение
False, то элемент не будет включен в итоговый массив
Существует три способа работы с булевой маской:
- Создать массив значений
TrueиFalseвручную - Использовать операторы сравнения над элементами исходного массива
- Применить логическое отрицание к текущей маске — поменять
TrueнаFalseи наоборот
Так все три способа выглядят в коде:
Первый способ на практике встречается редко, потому что на ручное создание маски уходит слишком много времени, особенно при большом размере массива:
Как применять маску
Чтобы применить булеву маску к исходному массиву, достаточно подставить ее в качестве индекса:
Как мы говорили выше, в Python реализована функция filter(), которая применяется для итеративной фильтрации значений списка по условию:
Для итеративной фильтрации элементов массива numpy.ndarray используется другой способ — метод numpy.fromiter():
На практике часто требуется не только убирать значения из исходного массива, но и заменять их. Для этого используется метод numpy.where():
Если для фильтрации мы используем составное условие, лучше инициализировать маску отдельно. Это упрощает поддержку и делает код более читабельным:
В реальных данных регулярно возникают пропущенные значения. Это может происходить из-за человеческого фактора, сбоя в работе сервисов или ошибки при записи в базу данных. Для таких случаев в Numpy существует отдельный тип данных numpy.nan (not a number):
Для корректной работы программ необходимо обнаруживать пропуски, чистить данные от них или заменять на значение по умолчанию.
Рассмотрим на примере. Сначала нужно обнаружить пропуски:
Затем чистим данные от пропусков:
Теперь заменяем пропуски на некоторое значение:
Как применять маску с двумерными массивами
Выше мы рассмотрели фильтрацию значений на примере одномерного массива. Те же принципы применимы и в работе с двумерными массивами. Рассмотрим пример задачи — подготовим сырые данные продаж магазина ноутбуков по следующим шагам:
- Сначала обнаружим выбросы двух типов — значения выше 200 и отрицательные значения. Число 200 выбрано потому, что именно столько ноутбуков хранится на складе. Менеджер магазина знает, что в день не бывает более 200 продаж
- Затем заменим выбросы и пропуски на среднее значение продаж
Мы проводим эти операции, чтобы подготовить сырые данные к более глубокому анализу с применением методов статистики и машинного обучения:
Чтобы отфильтровать значения, нужно создать маски:
Чтобы найти средние значения, нужно оставить только стандартные значения продаж. Сделать это можно маской, объединяющей логические отрицания сформированных масок:
Далее остается только заменить нестандартные значения на величину среднего:
Выводы
В этом уроке мы разобрали методы поиска и отбора значений по определенному условию, которые часто применяются при работе с данными. Мы узнали, как искать элементы, неудовлетворяющие некоторому условию, а также отсутствующие элементы и пропуски. Это самые частые случаи при работе с реальными данными, поэтому важно знать, как с ним работать.
Все рассмотренные методы применимы к массивам различной размерности. На примере матрицы заказов мы продемонстрировали подходы по поиску и исправлению некорректных значений в данных.



