📘 Polars: быстрый DataFrame нового поколения

📘 Polars: быстрый DataFrame нового поколения

Работа с большими данными в Python традиционно ассоциируется с pandas. Но реальные ограничения pandas известны всем: низкая скорость на больших наборах данных, высокая нагрузка на RAM, отсутствие оптимизации вычислений.

В 2023–2025 годах появился новый лидер — Polars, написанный на Rust и спроектированный с нуля для производительности. Он приносит в Python то, чего давно не хватало: быстроту вычислений, ленивое выполнение, эффективное управление памятью и интуитивный API.

Эта статья — максимально подробное руководство: что такое Polars, как он работает, как его установить, и главное — как применять его в реальных задачах.

🚀 Что такое Polars?

Polars — это библиотека DataFrame нового поколения, созданная на языке Rust. Её ключевые особенности:

  • от 5 до 20 раз быстрее pandas
  • низкое потребление RAM благодаря колоночному формату Arrow
  • поддержка LazyFrame — оптимизатор вычислений, как у SQL-движков
  • удобный API, который напоминает pandas, но работает быстрее
  • нативная работа с Parquet, CSV, Arrow, JSON

Polars вдохновлен архитектурой больших систем (Spark, ClickHouse, DuckDB), но работает локально, без тяжелых кластеров.

🔧 Установка Polars

Обычная установка:

pip install polars

Поддержка Excel:

pip install "polars[xlsx]"

Установка с поддержкой PyArrow:

pip install pyarrow polars

📊 Основы работы с Polars

Чтение CSV

import polars as pl df = pl.read_csv("data.csv") print(df.head())

Поддерживаются все популярные форматы: CSV, JSON, Parquet, IPC, Excel.

🔍 Фильтрация данных

df.filter( (pl.col("price") > 1000) & (pl.col("category") == "electronics") )

Polars использует выражения (pl.col()), что позволяет оптимизировать операции.

📈 Группировка и агрегации

result = ( df.groupby("category") .agg([ pl.mean("price").alias("avg_price"), pl.sum("price").alias("total"), pl.count().alias("items") ]) ) print(result)

Группировки работают значительно быстрее pandas благодаря колоночному формату.

🔥 LazyFrame — главный секрет скорости Polars

Lazy API позволяет строить цепочки операций без немедленного выполнения:

lazy_df = ( pl.scan_csv("orders.csv") .filter(pl.col("amount") > 500) .groupby("customer_id") .agg([ pl.sum("amount").alias("total"), pl.count().alias("orders") ]) ) # Выполнение result = lazy_df.collect() print(result)

Что делает Lazy API?

  • оптимизирует порядок операций
  • устраняет лишние шаги (например, фильтры до join)
  • использует predicate pushdown
  • объединяет маленькие операции в большие

Это похоже на SQL-оптимизаторы, но внутри Python.

🔗 Join-операции (быстрее pandas в разы)

customers = pl.read_csv("customers.csv") orders = pl.read_csv("orders.csv") merged = customers.join( orders, on="customer_id", how="inner" ) print(merged)

В отличие от pandas, Polars строит join на движке Arrow — быстро и эффективно.

🌀 Работа с датами и временем

df = df.with_columns([ pl.col("date").str.strptime(pl.Date, "%Y-%m-%d"), pl.col("date").dt.year().alias("year"), ])

Поддерживаются:

  • dt.hour
  • dt.minute
  • dt.week
  • dt.set_time_zone()
  • dt.timedelta

🧠 Функции map() и выражения

Polars не любит Python-функции (медленно), но можно использовать выражения:

df = df.with_columns([ (pl.col("price") * 1.2).alias("price_with_tax") ])

Если всё же нужен map:

df.with_columns([ pl.col("name").map_elements(lambda x: x.upper()) ])

🧑‍💻 Пример полноценного ETL-пайплайна

import polars as pl df = ( pl.scan_csv("sales_2024.csv") .filter(pl.col("amount") > 100) .with_columns([ pl.col("date").str.strptime(pl.Date, "%Y-%m-%d"), (pl.col("amount") * 1.15).alias("amount_usd") ]) .groupby(pl.col("date").dt.month()) .agg([ pl.sum("amount_usd").alias("total"), pl.mean("amount_usd").alias("avg"), ]) .sort("date") .collect() ) print(df)

Это коротко, быстро и эффективно.

🎯 Итог

Polars — библиотека, которая меняет правила игры в Python-аналитике. Она быстрее pandas, потребляет меньше памяти, работает как SQL-система и идеально подходит для больших данных.

Если вы работаете с таблицами, логами, аналитикой — Polars обязателен к освоению.

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

1
Начать дискуссию