Найти тему
Машинное обучение

Будете ли вы использовать Pandas для обработки больших данных в 2021 году? Вот два лучших варианта

Оглавление

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

Фото NASA на Unsplash
Фото NASA на Unsplash

Недавно я написал две вводные статьи об обработке больших данных с помощью Dask и Vaex - библиотек для обработки больших, чем наборы данных памяти. Пока писал, у меня в голове возник вопрос:

Могут ли эти библиотеки действительно обрабатывать данные, превышающие объемы памяти, или это всего лишь рекламный слоган?

Это заинтриговало меня провести практический эксперимент с Dask и Vaex и попытаться обработать набор данных, превышающий объем памяти. Набор данных был настолько большим, что вы даже не можете открыть его с помощью pandas.

Что я имею в виду под большими данными?

Фото ev на Unsplash
Фото ev на Unsplash

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

Определение из Википедии:

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

Что такое Dask и Vaex ?

Фото JESHOOTS.COM на Unsplash
Фото JESHOOTS.COM на Unsplash

Dask обеспечивает расширенный параллелизм для аналитики, обеспечивая масштабируемую производительность для ваших любимых инструментов. Сюда входят numpy, pandas и sklearn. Это открытый исходный код и бесплатный доступ. Он использует существующие API-интерфейсы Python и структуры данных, чтобы упростить переключение между эквивалентами на базе Dask.

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

Dask и Vaex Dataframes не полностью совместимы с Pandas Dataframes, но некоторые наиболее распространенные операции «обработки данных» поддерживаются обоими инструментами. Dask больше ориентирован на масштабирование кода для вычисления кластеров, в то время как Vaex упрощает работу с большими наборами данных на одной машине.

Эксперимент

Фото Луи Рида на Unsplash
Фото Луи Рида на Unsplash

Я создал два файла CSV с 1 миллионом строк и 1000 столбцов. Размер файла составлял 18,18 ГБ, что в совокупности составляет 36,36 ГБ. Файлы имеют случайные числа из равномерного распределения от 0 до 100.

Два файла CSV со случайными данными. Фотография сделана автором.
Два файла CSV со случайными данными. Фотография сделана автором.
-6
Заголовок файла. Фотография сделана автором
Заголовок файла. Фотография сделана автором

Эксперимент проводился на MacBook Pro с 32 ГБ оперативной памяти - настоящий зверь. При тестировании пределов фрейма данных pandas я неожиданно обнаружил, что достижение ошибки памяти на такой машине является довольно сложной задачей!

macOS начинает выгружать данные из основной памяти на твердотельный накопитель, когда память работает почти на полную мощность. Верхний предел для pandas Dataframe составлял 100 ГБ свободного дискового пространства на машине.

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

Я потратил некоторое время на размышления о том, как мне решить эту проблему, чтобы эксперимент был честным. Первая идея, которая пришла мне в голову, заключалась в том, чтобы отключить подкачку, чтобы в каждой библиотеке была доступна только основная память - удачи в этом на macOS. Проведя несколько часов, я не смог отключить подкачку.

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

Ваш диск почти заполнен уведомлением во время эксперимента. Фотография сделана автором.
Ваш диск почти заполнен уведомлением во время эксперимента. Фотография сделана автором.

Это сработало! pandas не смог прочитать два файла размером 18 ГБ, и ядро Jupyter разбилось.

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

Могут ли Dask или Vaex помочь нам в обработке этих больших файлов? Какой из них быстрее? Давай выясним.

Vaex против Dask

Фото Фриды Бредесен на Unsplash
Фото Фриды Бредесен на Unsplash

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

  • расчет 10-го квантиля столбца,
  • добавление нового столбца,
  • фильтрация по столбцу,
  • группировка по столбцу и агрегирование,
  • визуализация столбца.

Все вышеперечисленные операции выполняют вычисления с использованием одного столбца, например:

-10

Поэтому я был заинтригован попыткой выполнить операцию, которая требует обработки всех данных:

  • вычислить сумму всех столбцов.

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

Vaex

Автор фото Фото Ланти на Unsplash
Автор фото Фото Ланти на Unsplash

Начнем с Vaex. Эксперимент был разработан в соответствии с лучшими практиками для каждого инструмента - это использование двоичного формата HDF5 для Vaex. Поэтому нам нужно преобразовать файлы CSV в формат HDF5 (формат иерархических данных версии 5).

-12

Vaex потребовалось 405 секунд, чтобы преобразовать два файла CSV (36,36 ГБ) в два файла HDF5, которые вместе составляют 16 ГБ. Преобразование текста в двоичный формат уменьшило размер файла.

Откройте набор данных HDF5 с помощью Vaex:

-13

Vaex потребовалось 1218 секунд для чтения файлов HDF5. Я ожидал, что это будет быстрее, поскольку Vaex утверждает, что файлы в двоичном формате открываются практически мгновенно.

Из документации Vaex:

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

Показать голову с Vaex:

-14

Vaex потребовалось 1189 секунд, чтобы отобразить голову. Я не уверен, почему отображение первых 5 строк каждого столбца заняло так много времени.

Рассчитайте 10-й квантиль с помощью Vaex:

Обратите внимание, что у Vaex есть функция percentile_approx, которая вычисляет аппроксимацию квантиля.

-15

Vaex потребовалось 0 секунд, чтобы вычислить приближение 10-го квантиля для столбца col1.

Добавьте новый столбец с Vaex:

-16

В Vaex есть концепция виртуальных столбцов, в которых выражение хранится в виде столбца. Он не занимает никакой памяти и вычисляется на лету, когда это необходимо. Виртуальный столбец обрабатывается так же, как обычный столбец. Как и ожидалось, Vaex потребовалось 0 секунд для выполнения приведенной выше команды.

Отфильтруйте данные с помощью Vaex:

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

-17

Vaex потребовалось 0 секунд для выполнения указанного выше фильтра.

Группировка и агрегирование данных с Vaex:

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

-18
Расчет среднего с помощью Vaex. Фотография сделана автором.
Расчет среднего с помощью Vaex. Фотография сделана автором.

Vaex потребовалось 0 секунд для выполнения приведенной выше команды.

Визуализируйте гистограмму:

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

-20
Визуализация данных с помощью Vaex. Фотография сделана автором.
Визуализация данных с помощью Vaex. Фотография сделана автором.

Vaex потребовалось 0 секунд, чтобы отобразить график, что было на удивление быстро.

Подсчитайте сумму всех столбцов

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

-22

Vaex потребовалось 40 секунд, чтобы вычислить сумму всех столбцов.

Dask

Фото Келли Сиккема на Unsplash
Фото Келли Сиккема на Unsplash

Теперь давайте повторим описанные выше операции, но с Dask. Ядро Jupyter было перезапущено перед запуском команд Dask.

Вместо того, чтобы читать CSV-файлы напрямую с помощью функции Dask read_csv, мы конвертируем CSV-файлы в HDF5, чтобы эксперимент был честным.

-24

Dask потребовалось 763 секунды для конвертации. Сообщите мне в комментариях, есть ли более быстрый способ конвертировать данные с помощью Dask. Я безуспешно пытался прочитать файлы HDF5, конвертированные с помощью Vaex.

Лучшие практики с Dask:

HDF5 - популярный выбор для пользователей Pandas, которым требуется высокая производительность. Мы рекомендуем пользователям Dask DataFrame вместо этого хранить и загружать данные с помощью Parquet.

Откройте набор данных HDF5 с помощью Dask:

-25

Даску потребовалось 0 секунд, чтобы открыть файл HDF5. Это потому, что я явно не запускал команду compute, которая фактически считывала бы файл.

Показать голову с Dask:

-26

Dask потребовалось 9 секунд, чтобы вывести первые 5 строк файла.

Рассчитайте 10-й квантиль с помощью Dask :

В Dask есть функция квантиля, которая вычисляет фактический квантиль, а не приближение.

-27

Dask не удалось вычислить квантиль из-за сбоя ядра Juptyter.

Определите новый столбец с помощью Dask:

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

-28

Отфильтруйте данные с помощью Dask:

-29

Для выполнения приведенной выше команды требуется 0 секунд, поскольку Dask использует парадигму отложенного выполнения.

Группировка и агрегирование данных с помощью Dask:

-30

Dask не удалось сгруппировать и агрегировать данные.

Визуализируйте гистограмму col3:

-31

Dask не удалось визуализировать данные.

Подсчитайте сумму всех столбцов:

-32

Dask не удалось суммировать все данные.

Полученные результаты

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

Сводка времени выполнения в эксперименте. Фотография сделана автором
Сводка времени выполнения в эксперименте. Фотография сделана автором

Заключение

Фото Джошуа Голда на Unsplash
Фото Джошуа Голда на Unsplash

Vaex требует преобразования CSV в формат HDF5, что меня не беспокоит, так как вы можете пойти на обед, вернуться, и данные будут преобразованы. Я также понимаю, что в суровых условиях (например, в эксперименте) при небольшом количестве или отсутствии данных в основной памяти чтение займет больше времени.

Я не понимаю, сколько времени понадобилось Vaex для отображения заголовка файла (1189 секунд для первых 5 строк!). Другие операции в Vaex сильно оптимизированы, что позволяет нам проводить интерактивный анализ данных на наборах данных, больших, чем основная память.

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

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

Оригинал https://towardsdatascience.com/are-you-still-using-pandas-to-process-big-data-in-2021-850ab26ad919. Размещено с разрешения.