Стратегии управления большими объемами данных

Pandas, пожалуй, самый популярный модуль, когда дело доходит до манипулирования данными с помощью Python. Он обладает огромной полезностью, содержит широкий спектр функций и может похвастаться значительной поддержкой сообщества.

При этом у Pandas есть один вопиющий недостаток: его уровень производительности падает с большими наборами данных.

Вычислительная потребность в обработке больших наборов данных с помощью Pandas может потребовать длительного времени выполнения и даже привести к ошибкам из-за нехватки памяти.

Хотя может показаться заманчивым использовать другие инструменты, более подходящие для работы с большими наборами данных, стоит сначала изучить меры, которые можно предпринять для обработки огромных объемов данных с помощью Pandas.

Здесь мы рассмотрим стратегии, которые пользователи могут реализовать для экономии памяти и обработки огромных объемов данных с помощью Pandas.

Примечание. Каждая стратегия будет продемонстрирована с поддельным набором данных, сгенерированным Mockaroo.

1. Загружайте меньше данных

Удаление столбцов из фрейма данных — распространенный этап предварительной обработки данных.

Часто столбцы опускаются после загрузки данных.

Например, следующий код загружает фиктивный набор данных, а затем опускает все столбцы, кроме 5.

Хотя в большинстве случаев это осуществимый подход, он является расточительным, поскольку вы используете много памяти для загрузки данных, которые даже не требуются. Мы можем измерить использование памяти фиктивным набором данных с помощью функции memory_usage.

Предпочтительным решением было бы пропустить ненужные столбцы во время загрузки данных. Это гарантирует, что память используется только для соответствующей информации.

Этого можно добиться с помощью параметра usecols, который позволяет пользователям выбирать столбцы для включения при загрузке набора данных.

Включение только этого параметра значительно снижает потребление памяти.

2. Используйте типы данных с эффективным использованием памяти

Можно сэкономить много памяти, просто выбрав соответствующие типы данных для рассматриваемых переменных.

Если пользователь явно не выбирает тип данных для каждой переменной, модуль Pandas назначит его по умолчанию.

Хотя это может быть удобной функцией, типы данных, назначенные каждому столбцу, могут быть не идеальными с точки зрения эффективности использования памяти.

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

Типы данных для числовых переменных

Модуль Pandas использует типы данных int64 и float64 для числовых переменных.

Типы данных int64 и float64 вмещают значения с наибольшей величиной и точностью. Однако, в свою очередь, эти типы данных требуют наибольшего объема памяти.

Вот общее потребление памяти фиктивным набором данных.

К счастью, переменные, работающие с числами меньшей величины или точности, не нуждаются в таких типах данных, занимающих много памяти.

Например, в фиктивном наборе данных меньших типов данных будет достаточно для таких переменных, как age, weight, income и height. Посмотрим, как изменится память числовых данных при назначении новых типов данных для этих переменных.

Простое преобразование типов данных может значительно сократить использование памяти.

Внимание. Использование типа данных, который не соответствует значениям переменных, приведет к потере информации. Будьте осторожны при назначении типов данных вручную.

Обратите внимание, что столбцу income был назначен тип данных int32 вместо типа данных int8, поскольку переменная содержит большие значения.

Чтобы подчеркнуть важность выбора правильного типа данных, давайте сравним исходные значения дохода в наборе данных со значениями дохода с типами данных int32 и int8.

Как видно из вывода, выбор неправильного типа данных (в данном случае int8) изменит значения и затруднит результаты любых последующих манипуляций с данными.

Четкое понимание ваших данных и диапазона значений, предоставляемых доступными типами данных (например, int8, int16, int32 и т. д.), важно при назначении типов данных для интересующих переменных.

Для эффективного использования памяти рекомендуется указывать типы данных при загрузке набора данных с параметром dtype.

Типы данных для категориальных переменных

Память также можно сэкономить, назначив категориальным переменным тип данных «категория».

В качестве примера посмотрим, как изменится потребление памяти после присвоения столбцу gender типа данных «категория».

Очевидно, что преобразование приводит к значительному сокращению использования памяти.

Однако в этом подходе есть оговорка. Столбцы с типом данных «категория» потребляют больше памяти, когда содержат большее количество уникальных значений. Таким образом, это преобразование применимо не для каждой переменной.

Чтобы подчеркнуть это, мы можем изучить влияние этого преобразования на все категориальные переменные во фрейме данных.

Как видно из выходных данных, хотя столбцы gender и job потребляют меньше памяти после преобразования, столбцы first_name и last_name потребляют больше памяти. Это можно объяснить большим количеством уникальных имен и фамилий, присутствующих в наборе данных.

По этой причине будьте осторожны при назначении столбцов с типом данных «категория», если хотите сохранить память.

3. Загружайте данные порциями

Для наборов данных, которые слишком велики для размещения в памяти, Pandas предлагает параметр chunk_size, который позволяет пользователям решать, сколько строк следует импортировать на каждой итерации.

При присвоении значения этому параметру функция read_csv вернет объект итератора вместо фактического фрейма данных.

Получение данных потребует итерации по этому объекту. Сегментируя большой набор данных на более мелкие части, можно выполнять манипуляции с данными, не выходя за пределы ограничений памяти.

Здесь мы перебираем каждое подмножество набора данных, фильтруем данные, а затем добавляем их в список.

После этого мы объединяем все элементы в списке вместе с функцией concat, чтобы получить один всеобъемлющий набор данных.

Ограничения панд

Панды могут иметь функции, которые учитывают большие объемы данных, но их недостаточно перед лицом «больших данных», которые могут включать многие гигабайты или терабайты данных.

Модуль выполняет свои операции в одном ядре ЦП. К сожалению, выполнение задач с помощью одного процессора просто невозможно, когда использование памяти и требования к вычислительным ресурсам достигают определенного уровня.

В таких случаях необходимо реализовать такие методы, как параллельная обработка, которая влечет за собой выполнение задачи на нескольких ядрах машины.

Python предоставляет такие библиотеки, как Dask и PySpark, которые включают параллельную обработку и позволяют пользователям выполнять операции с гораздо большей скоростью.

При этом эти инструменты в основном специализируются на выполнении задач с интенсивным использованием данных и могут не предлагать те же функции, что и Pandas. Поэтому лучше не полагаться на них, если в этом нет необходимости.

Заключение

Хотя Pandas в основном используется для данных малого и среднего размера, его не следует избегать для задач, которые используют незначительно большие наборы данных. Модуль обладает функциями, которые помогают обрабатывать большие объемы данных, хотя и в ограниченном объеме.

Библиотека Pandas выдержала испытание временем и остается популярной библиотекой для манипулирования данными, поэтому не спешите переходить к другим решениям, если в этом нет крайней необходимости.

Желаю вам удачи в ваших начинаниях в области науки о данных!