Документация : Python-Rust-Node.js-R | StackOverflow : Python — Rust — Node.js — R | Руководство пользователя | Раздор
Polars — это интерфейс DataFrame поверх механизма запросов OLAP, реализованный на Rust с использованием формата столбцов Apache Arrow в качестве модели памяти.
Чтобы узнать больше, прочтите руководство пользователя.
>> > import polars as pl
>> > df = pl . DataFrame (
... {
... "A" : [ 1 , 2 , 3 , 4 , 5 ],
... "fruits" : [ "banana" , "banana" , "apple" , "apple" , "banana" ],
... "B" : [ 5 , 4 , 3 , 2 , 1 ],
... "cars" : [ "beetle" , "audi" , "beetle" , "beetle" , "beetle" ],
... }
... )
# embarrassingly parallel execution & very expressive query language
>> > df . sort ( "fruits" ). select (
... "fruits" ,
... "cars" ,
... pl . lit ( "fruits" ). alias ( "literal_string_fruits" ),
... pl . col ( "B" ). filter ( pl . col ( "cars" ) == "beetle" ). sum (),
... pl . col ( "A" ). filter ( pl . col ( "B" ) > 2 ). sum (). over ( "cars" ). alias ( "sum_A_by_cars" ),
... pl . col ( "A" ). sum (). over ( "fruits" ). alias ( "sum_A_by_fruits" ),
... pl . col ( "A" ). reverse (). over ( "fruits" ). alias ( "rev_A_by_fruits" ),
... pl . col ( "A" ). sort_by ( "B" ). over ( "fruits" ). alias ( "sort_A_by_B_by_fruits" ),
... )
shape : ( 5 , 8 )
┌──────────┬──────────┬──────────────┬─────┬─────────────┬─────────────┬─────────────┬─────────────┐
│ fruits ┆ cars ┆ literal_stri ┆ B ┆ sum_A_by_ca ┆ sum_A_by_fr ┆ rev_A_by_fr ┆ sort_A_by_B │
│ - - - ┆ - - - ┆ ng_fruits ┆ - - - ┆ rs ┆ uits ┆ uits ┆ _by_fruits │
│ str ┆ str ┆ - - - ┆ i64 ┆ - - - ┆ - - - ┆ - - - ┆ - - - │
│ ┆ ┆ str ┆ ┆ i64 ┆ i64 ┆ i64 ┆ i64 │
╞══════════╪══════════╪══════════════╪═════╪═════════════╪═════════════╪═════════════╪═════════════╡
│ "apple" ┆ "beetle" ┆ "fruits" ┆ 11 ┆ 4 ┆ 7 ┆ 4 ┆ 4 │
│ "apple" ┆ "beetle" ┆ "fruits" ┆ 11 ┆ 4 ┆ 7 ┆ 3 ┆ 3 │
│ "banana" ┆ "beetle" ┆ "fruits" ┆ 11 ┆ 4 ┆ 8 ┆ 5 ┆ 5 │
│ "banana" ┆ "audi" ┆ "fruits" ┆ 11 ┆ 2 ┆ 8 ┆ 2 ┆ 2 │
│ "banana" ┆ "beetle" ┆ "fruits" ┆ 11 ┆ 4 ┆ 8 ┆ 1 ┆ 1 │
└──────────┴──────────┴──────────────┴─────┴─────────────┴─────────────┴─────────────┴─────────────┘
>> > df = pl . scan_csv ( "docs/assets/data/iris.csv" )
>> > ## OPTION 1
>> > # run SQL queries on frame-level
>> > df . sql ( """
... SELECT species,
... AVG(sepal_length) AS avg_sepal_length
... FROM self
... GROUP BY species
... """ ). collect ()
shape : ( 3 , 2 )
┌────────────┬──────────────────┐
│ species ┆ avg_sepal_length │
│ - - - ┆ - - - │
│ str ┆ f64 │
╞════════════╪══════════════════╡
│ Virginica ┆ 6.588 │
│ Versicolor ┆ 5.936 │
│ Setosa ┆ 5.006 │
└────────────┴──────────────────┘
>> > ## OPTION 2
>> > # use pl.sql() to operate on the global context
>> > df2 = pl . LazyFrame ({
... "species" : [ "Setosa" , "Versicolor" , "Virginica" ],
... "blooming_season" : [ "Spring" , "Summer" , "Fall" ]
...})
>> > pl . sql ( """
... SELECT df.species,
... AVG(df.sepal_length) AS avg_sepal_length,
... df2.blooming_season
... FROM df
... LEFT JOIN df2 ON df.species = df2.species
... GROUP BY df.species, df2.blooming_season
... """ ). collect ()
Команды SQL также можно запускать непосредственно с вашего терминала с помощью интерфейса командной строки Polars:
# run an inline SQL query
> polars -c " SELECT species, AVG(sepal_length) AS avg_sepal_length, AVG(sepal_width) AS avg_sepal_width FROM read_csv('docs/assets/data/iris.csv') GROUP BY species; "
# run interactively
> polars
Polars CLI v0.3.0
Type .help for help.
> SELECT species, AVG(sepal_length) AS avg_sepal_length, AVG(sepal_width) AS avg_sepal_width FROM read_csv( ' docs/assets/data/iris.csv ' ) GROUP BY species ;
Дополнительную информацию можно найти в репозитории Polars CLI.
Поларс очень быстрый. Фактически, это одно из самых эффективных доступных решений. См. результаты тестов PDS-H.
Polars также очень легкий. Он поставляется с нулевыми необходимыми зависимостями, и это видно по времени импорта:
Если у вас есть данные, которые не помещаются в память, механизм запросов Polars может обработать ваш запрос (или части вашего запроса) в потоковом режиме. Это радикально снижает требования к памяти, поэтому вы сможете обрабатывать набор данных объемом 250 ГБ на своем ноутбуке. Соберите с помощью collect(streaming=True)
для запуска потоковой передачи запроса. (Это может быть немного медленнее, но все равно очень быстро!)
Установите последнюю версию Polars с помощью:
pip install polars
У нас также есть пакет conda ( conda install -c conda-forge polars
), однако pip является предпочтительным способом установки Polars.
Установите Polars со всеми дополнительными зависимостями.
pip install ' polars[all] '
Вы также можете установить подмножество всех дополнительных зависимостей.
pip install ' polars[numpy,pandas,pyarrow] '
Дополнительную информацию о дополнительных зависимостях см. в руководстве пользователя.
Чтобы увидеть текущую версию Polars и полный список ее дополнительных зависимостей, запустите:
pl . show_versions ()
В настоящее время выпуски происходят довольно часто (еженедельно/каждые несколько дней), поэтому регулярное обновление Polars для получения последних исправлений ошибок/функций может быть неплохой идеей.
Вы можете взять последнюю версию с crates.io
или, если хотите использовать новейшие функции/улучшения производительности, перейдите в main
ветку этого репозитория.
polars = { git = " https://github.com/pola-rs/polars " , rev = " <optional git tag> " }
Требуется версия Rust >=1.80
.
Хотите внести свой вклад? Прочтите наше руководство по участию.
Если вам нужен новейший выпуск или максимальная производительность, вам следует скомпилировать Polars из исходного кода.
Это можно сделать, выполнив последовательно следующие шаги:
pip install maturin
cd py-polars
и выберите один из следующих вариантов:make build
, медленный двоичный файл с отладочными утверждениями и символами, быстрое время компиляцииmake build-release
, быстрый двоичный файл без утверждений отладки, минимальное количество символов отладки, длительное время компиляцииmake build-nodebug-release
, то же самое, что и build-release, но без каких-либо символов отладки, немного быстрее компилируетсяmake build-debug-release
, то же самое, что и build-release, но с полными символами отладки, компилируется немного медленнееmake build-dist-release
, самый быстрый двоичный файл, чрезвычайное время компиляции По умолчанию двоичный файл компилируется с включенной оптимизацией для современного процессора. Укажите LTS_CPU=1
с помощью команды, если ваш процессор старше и не поддерживает, например, AVX2.
Обратите внимание, что крейт Rust, реализующий привязки Python, называется py-polars
чтобы отличить его от самих polars
обернутого крейта Rust. Однако и пакет Python, и модуль Python называются polars
, поэтому вы можете pip install polars
и import polars
.
Расширить Polars с помощью UDF, скомпилированных в Rust, легко. Мы предоставляем расширения PyO3 для структур данных DataFrame
и Series
. Дополнительную информацию см. на https://github.com/pola-rs/pyo3-polars.
Ожидаете ли вы более 2 ^ 32 (~ 4,2 миллиарда) строк? Скомпилируйте Polars с флагом функции bigidx
или, для пользователей Python, установите pip install polars-u64-idx
.
Не используйте это, пока не достигнете границы строки, поскольку сборка Polars по умолчанию работает быстрее и потребляет меньше памяти.
Хотите ли вы, чтобы Polars работал на старом процессоре (например, выпущенном до 2011 года) или на сборке Python x86-64
на Apple Silicon под управлением Rosetta? Установите pip install polars-lts-cpu
. Эта версия Polars скомпилирована без целевых функций AVX.