Выбор движка хранения данных
Необходимость выбора движка
Необходимость выбора движка обработки данных возникла при рассмотрении подходов к созданию пайпланов моделирования. При формировании набора блоков, позволяющих конструировать цепочки моделей стало очевидно, что собственная структура хранения данных накладывает большое количество ограничений: скорость работы, оптимизация по памяти и т.д.
Было решено провести анализ фреймворков работы с данными в части скорости их работы, возможностей, удобства для пользователей и функционала, который нужен для решения задач Платформы.
Всего рассматривалось 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, как самый полный и повсеместно используемый. Несмотря на то, что он не очень быстро может работать с очень большими данными, средние значения по скорости являются удовлетворительными.