Перейти к содержанию

Выбор движка хранения данных

Необходимость выбора движка

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

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

Всего рассматривалось 6 датафрейм-библиотек в Python: pandas, polars, dask.dataframe, modin.pandas, vaex, datatable.

Анализ по общим критериям

Критерий pandas polars dask modin vaex datatable
Скорость работы (CPU) Средняя Очень высокая Средняя+ Высокая (на 2+ ядрах) Очень высокая Очень высокая
Lazy вычисления Нет Полностью Частично Ограничено Полностью Нет
Работа с вычисляемыми колонками Да Да Да Да Да Да
Чистка, отбор признаков Полный API Ограничено Через pandas-like Да Ограничено Ограничено
Поддержка sklearn моделей Прямая Только через .to_numpy() Через .compute() Прямая Сложно Сложно
Масштабируемость До 1-2 млн строк До 100+ млн строк До миллиардов Хорошо Отлично Отлично
Многопоточность / многопроцессность Ограниченно Встроено Через Dask Через Ray/Dask Да Да
Out-of-core (работа с диска) Нет В планах (частично есть) Да Через Dask Да Да
Поддержка форматов (Parquet/Arrow) Частично Отлично Отлично Да Да Да
Интеграция с ML/Pipeline Отлично Только при конвертации Частично Да Плохо Плохо
Поддержка feature selection, OOF и т.д. Полностью Только вручную Через API Да Нет Нет
API совместимость с pandas Да Нет Частично Да Нет Нет

Детальный анализ

pandas

Тип данных: pandas.DataFrame

Общая информация

  • Стандарт для Data Science
  • Средняя скорость работы
  • Нет поддержки lazy вычислений
  • Ограниченная поддержка многопоточности / многопроцессности
  • Нет Out-of-core
  • Частичная поддержка форматов (Parquet/Arrow)
  • Не масштабируется хорошо на больших объемах.

Моделирование ML/DS

  • Полный API для чистки и отбора признаков
  • Прямая поддержка sklearn моделей
  • Полная поддержка feature selection, OOF и т.д.
  • Отлично для Feature engineering. Богатейший API
  • Всё, от sklearn до XGBoost, CatBoost и LightGBM, ожидает pandas или numpy
  • Поддерживаются: работа с пропусками, базовая статистика датасета, работа с ts, работа с текстом, работа с Feature selection
  • лёгкий импорт и экспорт в csv и excel

AI

  • Совместим через .values → numpy → torch.Tensor или tf.convert_to_tensor().
  • Для torch.utils.data.Dataset обычно данные подготавливаются как ndarray.

Вывод

Считается лучшим выбором по совместимости. В настоящий момент самый популярный инструмент работы с данными, стандарт для Data Science. Ограничения — масштабируемость и производительность.

polars

Тип данных: polars.DataFrame

Общая информация

  • Высокопроизводительный, многопоточный
  • Очень высокая скорость работы
  • Полностью поддерживает lazy вычисления
  • Встроенная многопоточности / многопроцессности
  • Развивается Out-of-core
  • Отличная поддержка форматов (Parquet/Arrow)
  • Очень хорош в препроцессинге, агрегациях, трансформациях.

Моделирование ML/DS

  • Нужно to_numpy() перед передачей в модели, однако преобразование очень быстрое ("дешевая" операция)
  • Мощный инструмент, но не такой гибкий как у pandas
  • В качестве источников данных можно использовать Parquet, CSV, JSON, Arrow
  • Ограниченна работа с Time series
  • Ограниченна работа с пропусками
  • Нет API совместимость с pandas
  • Поддержка feature selection, OOF только вручную
  • Нет напрямую поддержки для GLM, ARIMA, OLS

AI

  • Отлично подаётся в PyTorch и TF после .to_numpy().
  • Высокая скорость выгрузки массива (в отличие от Dask/Modin).

Вывод

Хорош для работы на больших данных. Требует "мостов" к ML/stat.

dask.dataframe

Тип данных: dask.dataframe.DataFrame

Общая информация

  • Параллельная обработка, разделение на чанки
  • Средняя скорость работы
  • Частично поддерживает lazy вычисления
  • Через Dask поддержка многопоточности / многопроцессности
  • Есть Out-of-core
  • Отличная поддержка форматов (Parquet/Arrow)
  • Модель обработки в чанках — хорош для RAM-ограниченных систем.
  • Хорош для пайплайнов и распределенных вычислений.

Моделирование ML/DS

-Feature engineering, как в pandas, но с ограничениями - Требует .compute() для sklearn - Поддерживает многие источники данных - Поддержка ts, missing data, базовых статистик датасета

AI

  • Подходит, но compute() обязателен перед загрузкой в torch.Tensor.

Вывод

Из-за .compute() появляется сильная задержка по времени при работе с ML. Лучше использовать для предпроцессинга (работы с данными), но не для самого ML.

modin.pandas

Тип данных: modin.pandas.DataFrame

Общая информация

  • Pandas API поверх Ray/Dask, ускоренный
  • Высокая (на 2+ ядрах) скорость работы (CPU)
  • Ограниченная поддержка lazy вычислений
  • Поддержка многопоточности / многопроцессности через Ray/Dask
  • Через Dask поддерживает Out-of-core
  • Есть поддержка форматов (Parquet/Arrow)
  • Хорошо на больших объемах.

Моделирование ML/DS

  • API совместимость с pandas. Всё как у pandas, но иногда могут быть сложности при совместимости

AI

Лучше использовать .values

Вывод

Если нужен быстрый pandas, а не polars, и хочется не менять привычный API.

vaex

Тип данных: vaex.DataFrame

Общая информация

  • Очень быстрый, колоночный, out-of-core
  • Очень высокая скорость работы на CPU
  • Полная поддержка lazy вычислений
  • Есть поддержка многопоточности / многопроцессности
  • Есть поддержка Out-of-core
  • Есть поддержка форматов (Parquet/Arrow)
  • Отлично работает на больших объемах.

Моделирование ML/DS

  • Нет встроенной поддержки ML, требует .to_pandas().
  • Ограниченная работа с ts
  • Нет интерции в ml/pipline
  • Хорошая базовая аналитика по датасету
  • Быстр в анализе на миллионах строк.
  • Не рассчитан на интеграцию с scipy, statsmodels
  • Ограничен в работе с ts и missing data
  • Нет поддержки работы с текстами

AI

Отлично экспортируется в numpy, можно напрямую в torch.

Вывод

EDA на 100M+ строк — да. Для моделирования — нет.

datatable

Тип данных: datatable.Frame

Общая информация

  • Быстрая C++-библиотека от H2O
  • Очень высокая скорость работы на CPU
  • Нет поддержки lazy вычислений
  • Есть поддержка многопоточности / многопроцессности
  • Есть поддержка Out-of-core
  • Есть поддержка форматов (Parquet/Arrow)
  • Отлично работает на больших объемах. Скорость высокая, даже на больших объёмах.

Моделирование ML/DS

  • Затачивался под ML, похож на R'овский data.table.
  • API нетипичный для ML.
  • Быстрый, но мало используется в новых проектах, так как разработан локально для H2O
  • Есть поддержка Feature engineering через .f[] выражений — удобно, но нестандартно
  • Нет нативной поддержки statsmodels и т.п.
  • Нет таблиц сопряжённости, нет нормального .describe()
  • Только базовая обработка пропусков
  • Почти нет работы с временными рядами
  • В основном для H2O, XGBoost, но не sklearn

AI

Экспорт только через .to_numpy() — но работает стабильно

Вывод

Можно использовать как промежуточный шаг в подготовке к H2O или XGBoost. Не больше.

Активность разработки и поддержки

Библиотека Open Source Лицензия Прямая работа с БД Активность GitHub Звёзды GitHub Развитие/будущее
Pandas Да BSD-3-Clause license Через sqlalchemy, read_sql Очень активная 45.8k Зрелая и стабильная
Polars Да Copyright (c) 2025 Ritchie Vink Есть поддержка через connector (PostgreSQL) Очень активная 34.1k Бурный рост, часто обновляется
Dask Да BSD-3-Clause license Отлично работает через read_sql_table, read_parquet и др. Активная 13.3k Стабильная, активно развивается
Modin Да Apache-2.0 license Через pandas.read_sql() Активная 10.2k Быстрая, но сложности со стабильностью. Разрабатывается
Vaex Да MIT license Только через CSV/Parquet/Arrow, SQL нет Средняя активность 8.4k Упала активность в 2024–2025
datatable Да Mozilla Public License Нет SQL API Практически не обновляется 7.4k Поддержка замерла 3 года назад

Сравнение технических особенностей

Техническая сложность

Критерий Pandas Polars
API (синтаксис) Классический, привычный, много документации, огромное количество примеров Новый, лаконичный, иногда отличается от Pandas; документация активно развивается
Порог входа Очень низкий (стандарт Data Science в Python) Средний; сложнее для новичков, чуть больше “явности”
Работа с метаданными Через .attrs или обёртки (сложно, но возможно) Через .meta (Pl 0.19+) — мало используется
Интеграция с экосистемой Максимальная: работает со всем ML/DS-стеком Python Ограничена; для большинства ML/stat-пакетов нужна конвертация через .to_pandas()
Интеграция со статистикой Прямая, удобно использовать с scipy, statsmodels, pingouin и др. Только через конвертацию в Pandas/NumPy
Гибкость API Очень высокая, много вариантов решений, гибкая типизация Меньше “магии”, больше явности, строгая типизация

Возможности

Критерий Pandas Polars
Базовые статистические функции Полный набор: mean, std, quantile, corr, describe, skew, kurt и др. Основные реализованы; нет ряда сложных функций
Сложная статистика/ML Поддержка всех популярных ML/stat-пайплайнов Только простая статистика; сложные задачи — через Pandas/NumPy
Временные ряды Сильная поддержка: resample, rolling, shift, timezones, dt и др. Базовая поддержка; меньше функций
Работа с NaN Гибко: fillna, dropna, interpolate, mask, и др. Есть fill_null, drop_null и аналоги, но меньше опций
Группировки/join/pivot Мощно, поддержка multiindex, любые pivot Очень быстрые groupby/join/pivot, multiindex — ограниченно
Объем данных До 10 млн строк (на стандартном ПК), большие объёмы — проблемы с памятью Десятки и сотни млн строк (ограничено только RAM); columnar storage
Ленивые вычисления (Lazy) Нет (только через Dask/Modin и др.) Встроенный ленивый режим
Многопоточность Нет (только через внешние фреймворки) Да, встроена
Работа с big data Только через внешние фреймворки (Dask, Spark, Modin и др.) Частично нативно, плюс интеграция с Dask, Ray
Вложенные структуры Слабо (object dtype) Есть поддержка list/struct dtypes

Скорость работы

Критерий Pandas Polars
Фильтрация/агрегации Быстро на малых/средних данных, медленно на больших Очень быстро на любых объёмах, особенно на больших данных
Join/pivot/groupby Быстро на малых/средних данных Очень быстро, многопоточно
Big data Тормозит на больших объёмах, активно потребляет память Обрабатывает большие данные, эффективно использует память
Стартовая загрузка Быстро Быстро, особенно при ленивых вычислениях
Интеграция с ML/stat-библиотеками Мгновенно, поддержка всего стека Быстро для простых операций, сложнее при интеграции, требуется промежуточная конвертация

Сравнение скорости работы

По сравнению с реализацией типа "Ряды данных" в платформе ЦП УвП.

Простой набор данных (без сохранения в БД)

10 элементов

Тип данных SQL-ряды Обрезка ряда Преобразование ряда Соединение ряда
Ряды данных 64 5 13 0
DataFrame 91 6 16 6

100 элементов

Тип данных SQL-ряды Обрезка ряда Преобразование ряда Соединение ряда
Ряды данных 97 6 15 6
DataFrame 63 21 6 12

1000 элементов

Тип данных SQL-ряды Обрезка ряда Преобразование ряда Соединение ряда
Ряды данных 205 52 28 25
DataFrame 69 7 16 6

10000 элементов

Тип данных SQL-ряды Обрезка ряда Преобразование ряда Соединение ряда
Ряды данных 1827 371 161 23
DataFrame 134 71 16 7

100000 элементов

Тип данных SQL-ряды Обрезка ряда Преобразование ряда Соединение ряда
Ряды данных 1 минута 3599 1618 2631
DataFrame 985 295 42 83

1000000 элементов

Тип данных SQL-ряды Обрезка ряда Преобразование ряда Соединение ряда
Ряды данных > 5 минут не оценивалось не оценивалось не оценивалось
DataFrame 8106 2655 373 773

Временные ряды (без сохранения в БД)

10 элементов

Тип данных SQL-ряды Удаление пропусков Деление выборки Регрессия
Ряды данных 126 169 460 165
DataFrame 100 155 161 186

100 элементов

Тип данных SQL-ряды Удаление пропусков Деление выборки Регрессия
Ряды данных 127 166 469 291
DataFrame 106 175 145 171

1000 элементов

Тип данных SQL-ряды Удаление пропусков Деление выборки Регрессия
Ряды данных 560 281 501 498
DataFrame 142 172 142 268

10000 элементов

Тип данных SQL-ряды Удаление пропусков Деление выборки Регрессия
Ряды данных 8 секунд 555 869 12 секунд
DataFrame 300 167 156 1 секунда

100000 элементов

Тип данных SQL-ряды Удаление пропусков Деление выборки Регрессия
Ряды данных Более 3 минут не оценивалось не оценивалось не оценивалось
DataFrame 330 169 161 1 минута

Вывод

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