Мир за пределами Pandas: достойные альтернативы для работы с данными

f1cd323fe25640c60174efb0e3b3a1af.jpg

Хабр, привет! Это Леша Жиряков, техлид backend-команды витрины онлайн-кинотеатра KION. В мире дата-аналитики Pandas остается одной из самых популярных библиотек. Но это вовсе не значит, что нет других быстрых, удобных и производительных инструментов. Мой пост покажет альтернативы: от колоночной DuckDB и сверхскоростной Polars до мощного Modin и гибкого Vaex. В подборке я постарался передать главную суть — назначение и преимущества инструмента и его характеристики с GitHub.

Polars

9fc53b235a451de1ba1a2f92c1f93d5c.jpg

Polars — высокопроизводительная открытая библиотека для работы с данными, полностью написанная на языке Rust. Ее разработка началась в 2020 году. Цель — предоставить Python-программистам эффективный инструмент для работы с данными, который станет альтернативой популярной библиотеке Pandas.

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

Характеристики:

  • особенности: использует колоночный формат Apache Arrow для хранения данных;

  • количество звезд на GitHub: 31 тыс.;

  • открытых Issues: 2,1 тыс.;  

  • версия: 1.17.1;

  • Merge Requests (MRs): комьюнити.

Недавние тесты производительности показывают, что библиотека Polars превосходит Pandas в скорости выполнения различных операций с данными. Автор исследования выполнил операции фильтрации, агрегации, группировки и сортировки на наборе данных Covertype, содержащем 581 012 строк и 54 столбца.

Результаты тестов:

  • Фильтрация данных: Polars выполнил операцию за 0,0183 секунды, тогда как Pandas потребовалось 0,0741 секунды. Это делает Polars примерно в четыре раза быстрее.

  • Агрегация: Polars справился за 0,0083 секунды, в то время как Pandas занял 0,1863 секунды, показывая преимущество Polars более чем в 22 раза.

  • Группировка (GroupBy): Polars завершил задачу за 0,0106 секунды, а Pandas — за 0,0873 секунды, что делает Polars примерно в восемь раз быстрее.

  • Сортировка: Polars потребовалось 0,0656 секунды, тогда как Pandas — 0,2027 секунды. Polars быстрее примерно в три раза.

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

А вот еще тест. В этой статье автор провел сравнение DuckDB и Polars. Для тестирования использовался набор данных 2021 Yellow Taxi Trip объемом около 3 Гб, содержащий 30 миллионов строк и 18 столбцов. Тесты выполнялись на ноутбуке Apple M1 MAX MacBook Pro 2021 с 64 Гб ОЗУ и 10-ядерным CPU.

Провели такие тесты:

  • чтение CSV-файла: измерение времени, необходимого для загрузки данных из CSV;

  • простые агрегации: вычисление суммы, среднего, минимума и максимума для определенных столбцов;

  • групповые агрегации: выполнение с использованием операций группировки;

  • оконные функции: применение оконных функций к данным;

  • соединения (Joins): выполнение операций объединения данных из разных источников.

Оказалось, что Polars превосходит DuckDB во всех тестах, включая операции объединения.

Больше информации и новостей о проекте — на официальном сайте Polars.

DuckDB

1eba0272781e2549df16aa75bd990dd5.png

Аналитическая in-process SQL СУБД, оптимизирована для выполнения аналитических запросов. Создана Марком Раасвельдтом и Ханнесом Мюлейзеном в Центре математики и информатики (Centrum Wiskunde & Informatica, CWI) в Нидерландах. Первая версия выпущена в 2019 году. Цель разработки DuckDB — создание встроенной аналитической БД, способной эффективно выполнять сложные запросы к большим наборам данных, особенно для задач онлайн-аналитической обработки (OLAP).

В отличие от других встроенных баз данных, таких как SQLite, DuckDB ориентирована не на транзакционные приложения (OLTP), а именно на аналитические нагрузки.

Характеристики:

  • особенности: архитектура с колоночным хранением данных и векторизированной обработкой запросов обеспечивает высокую производительность при анализе;  

  • количество звезд на GitHub: 25,1 тыс.;

  • количество открытых Issues: 297;

  • последняя версия: 1.1.3;

  • Merge Requests (MRs): комьюнити.

Недавние тесты производительности показывают, что DuckDB значительно превосходит Pandas в скорости выполнения различных операций с данными. В одном из сравнений, проведенном в ноябре 2024 года, были протестированы операции фильтрации, агрегации, группировки и сортировки на наборе данных Covertype, содержащем 581 012 строк и 54 столбца.

Результаты тестов:

  • Вычисление скользящих средних: DuckDB продемонстрировал высокую производительность при вычислении скользящих средних на наборе данных с более чем 100 миллионами строк, завершив операцию примерно за 55 секунд. В то время как в случае с Pandas автор работы столкнулся с проблемами загрузки такого объема данных в память.

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

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

DuckDB выделяется универсальностью, SQL-поддержкой и простотой интеграции с различными системами. Выбор между Polars и DuckDB зависит от типа задач: для быстрой обработки данных в памяти лучше подходит Polars, а для SQL-анализа и комплексных запросов — DuckDB.

Больше информации — на официальном сайте DuckDB.

Vaex

1e6ce97b4455ee6181eccf67503d760a.jpg

Высокопроизводительная библиотека для Python, предназначенная для обработки и визуализации больших наборов данных. Разработана в 2014 году Маартеном Брейманом (Maarten Breddels). Цель — предоставить инструмент, который сможет эффективно работать с данными, превышающими объем ОЗУ, без необходимости загружать их полностью.

Характеристики:

  • особенности: Vaex — библиотека для обработки больших объемов данных вне оперативной памяти (out-of-core), позволяющая выполнять операции, не загружая все полностью в память. Использует гибридный формат Apache Arrow/NumPy;

  • количество звезд на GitHub: 8,3 тыс.;

  • количество открытых Issues: 437;

  • последняя версия: 4.18.1;

  • Merge Requests (MRs): комьюнити.

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

  • Чтение данных из CSV-файла: Vaex загрузил файл объемом около 200 Мб за 15,8 миллисекунды, тогда как Pandas потребовалось 2,19 секунды, что делает Vaex примерно в 138 раз быстрее.

  • Чтение данных с использованием chunk_size: Vaex обработал данные за 28,6 микросекунды (0,0286 миллисекунды), тогда как Pandas выполнил ту же операцию за 4,41 миллисекунды. Получается, Vaex примерно в 154 раза быстрее.

Vaex показывает себя особенно эффективно при выполнении операций группировки и агрегации. Особенно с данными, превышающими объем оперативной памяти. 

Официальный сайт Vaex.

Modin

e97bd37b78893231e8e7f0ebef3b0e69.jpg

Библиотека для Python. Цель — предоставить пользователям возможность масштабировать свои рабочие процессы, основанные на Pandas, без необходимости вносить значительные изменения в код. Основная идея Modin заключается в том, чтобы быть drop-in-заменой для Pandas, позволяя использовать все доступные ядра процессора для ускорения вычислений. Это особенно полезно при работе с большими наборами данных, где стандартный Pandas может быть медленным или потреблять слишком много памяти.

Характеристики:

  • особенности: Modin поддерживает различные движки для распределенных вычислений, такие как Ray и Dask, что позволяет эффективно распределять нагрузку и ускорять обработку данных;

  • количество звезд на GitHub: 9,9 тыс.;

  • количество открытых Issues: 638;

  • последняя версия: 0.32.0;

  • Merge Requests (MRs): комьюнити.

Modin показывает улучшенную производительность по сравнению с Pandas при обработке больших данных:

  • Чтение данных из CSV-файла: для небольших файлов (около 1,69 Мб) Pandas выполняет чтение быстрее, чем Modin, из-за накладных расходов на параллелизацию. Но для более крупных файлов (около 169 Мб) Modin превосходит Pandas, демонстрируя ускорение примерно в 1,71 раза.

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

Тут Ченг Жи Чжао рассмотрел четыре высокопроизводительные библиотеки для анализа данных в Python: Polars, DuckDB, Vaex и Modin. Автор провел сравнительный анализ этих инструментов, используя набор данных NYC Parking Tickets с 10,8 миллионами строк и 51 столбцом. Тесты включали операции фильтрации, агрегации, объединения и оконных функций. Оказалось, что Modin превосходит Pandas по скорости выполнения задач, но в некоторых случаях уступает Polars и DuckDB.

Больше информации — на официальном сайте Modin.

Dask

ac89487cbd7fb563b9b73964a8162c79.jpg

Библиотека с открытым исходным кодом для параллельных и распределенных вычислений в Python. Она создана Мэтью Роклином (Matthew Rocklin) в декабре 2014 года в компании Continuum Analytics (позднее ставшей Anaconda, Inc.) в рамках проекта Blaze, финансируемого DARPA.

Характеристики:

  • особенности: Dask — это библиотека, позволяющая распределять задачи на кластере. Обеспечивает масштабируемость и может работать с массивами данных, превышающими объем оперативной памяти;

  • количество звезд на GitHub: 12,7 тыс.;

  • количество открытых Issues: 917;

  • последняя версия: 2024.12.1;

  • Merge Requests (MRs): комьюнити.

Что касается производительности, то наилучшие результаты библиотека показывает в следующих случаях:

  • Чтение данных из CSV-файла: Pandas — при попытке загрузить файл размером 3,6 Гб возникает ошибка памяти, что делает невозможным обработку такого объема данных. Dask успешно загружает и обрабатывает файл размером 3,6 Гб, демонстрируя способность работать с большими наборами данных, превышающими объем оперативной памяти.

  • Группировка и агрегация данных: Pandas при работе с файлом размером 3,6 Гб не может выполнить операцию из-за ограничений памяти. Dask успешно выполняет операцию группировки и агрегации на том же файле, показывая эффективность при обработке больших данных.

Чтобы получить больше информации, смотрите официальный сайт Dask.

(py)Datatable

026627713ff321dc6b744261467ddf7f.jpg

Высокопроизводительная многопоточная библиотека для обработки двумерных табличных данных в Python. Ориентирована на поддержку BigData и обеспечивает эффективную работу как с информацией в памяти, так и с данными, хранящимися на диске. Библиотека вдохновлена R’s data.table и стремится воспроизвести ее основные алгоритмы и API.

Характеристики:

  • количество звезд на GitHub: 1,8 тыс.;

  • количество открытых Issues: 170;

  • последняя версия: 1.1.0;

  • Merge Requests (MRs): комьюнити.

Официальный сайт Datatable.

На этом все. А что больше нравится вам? Поделитесь опытом, где встречали проблемы.

© Habrahabr.ru