Dokumentation : Python – Rust – Node.js – R | StackOverflow : Python – Rust – Node.js – R | Benutzerhandbuch | Zwietracht
Polars ist eine DataFrame-Schnittstelle auf einer in Rust implementierten OLAP-Abfrage-Engine, die das Apache Arrow Columnar Format als Speichermodell verwendet.
Um mehr zu erfahren, lesen Sie die Bedienungsanleitung.
>> > 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-Befehle können mit der Polars-CLI auch direkt von Ihrem Terminal aus ausgeführt werden:
# 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 ;
Weitere Informationen finden Sie im Polars CLI-Repository.
Polars ist sehr schnell. Tatsächlich ist es eine der leistungsstärksten verfügbaren Lösungen. Sehen Sie sich die Ergebnisse der PDS-H-Benchmarks an.
Polars ist außerdem sehr leicht. Es sind keine Abhängigkeiten erforderlich, was sich in den Importzeiten zeigt:
Wenn Sie über Daten verfügen, die nicht in den Speicher passen, kann die Abfrage-Engine von Polars Ihre Abfrage (oder Teile Ihrer Abfrage) im Streaming-Verfahren verarbeiten. Dadurch wird der Speicherbedarf drastisch reduziert, sodass Sie Ihren 250-GB-Datensatz möglicherweise auf Ihrem Laptop verarbeiten können. Sammeln Sie mit collect(streaming=True)
um das Abfrage-Streaming auszuführen. (Das ist vielleicht etwas langsamer, aber immer noch sehr schnell!)
Installieren Sie die neueste Polars-Version mit:
pip install polars
Wir haben auch ein Conda-Paket ( conda install -c conda-forge polars
), allerdings ist pip die bevorzugte Methode zur Installation von Polars.
Installieren Sie Polars mit allen optionalen Abhängigkeiten.
pip install ' polars[all] '
Sie können auch eine Teilmenge aller optionalen Abhängigkeiten installieren.
pip install ' polars[numpy,pandas,pyarrow] '
Weitere Einzelheiten zu optionalen Abhängigkeiten finden Sie im Benutzerhandbuch
Führen Sie Folgendes aus, um die aktuelle Polars-Version und eine vollständige Liste der optionalen Abhängigkeiten anzuzeigen:
pl . show_versions ()
Veröffentlichungen erfolgen derzeit recht häufig (wöchentlich/alle paar Tage), daher ist es möglicherweise keine schlechte Idee, Polars regelmäßig zu aktualisieren, um die neuesten Bugfixes/Funktionen zu erhalten.
Sie können die neueste Version von crates.io
herunterladen oder, wenn Sie die neuesten Funktionen/Leistungsverbesserungen nutzen möchten, auf den main
dieses Repos verweisen.
polars = { git = " https://github.com/pola-rs/polars " , rev = " <optional git tag> " }
Erfordert Rust-Version >=1.80
.
Möchten Sie einen Beitrag leisten? Lesen Sie unseren Beitragsleitfaden.
Wenn Sie eine aktuelle Version oder maximale Leistung wünschen, sollten Sie Polars aus dem Quellcode kompilieren.
Dies kann erreicht werden, indem die folgenden Schritte nacheinander ausgeführt werden:
pip install maturin
cd py-polars
und wählen Sie eine der folgenden Optionen:make build
, langsame Binärdatei mit Debug-Zusicherungen und -Symbolen, schnelle Kompilierungszeitenmake build-release
, schnelle Binärdatei ohne Debug-Assertionen, minimale Debug-Symbole, lange Kompilierungszeitenmake build-nodebug-release
, das gleiche wie build-release, aber ohne Debug-Symbole, etwas schneller zu kompilierenmake build-debug-release
, das gleiche wie build-release, aber mit vollständigen Debug-Symbolen, etwas langsamer zum Kompilierenmake build-dist-release
, schnellste Binärdatei, extreme Kompilierzeiten Standardmäßig wird die Binärdatei mit aktivierten Optimierungen für eine moderne CPU kompiliert. Geben Sie LTS_CPU=1
mit dem Befehl an, wenn Ihre CPU älter ist und z. B. AVX2 nicht unterstützt.
Beachten Sie, dass die Rust-Kiste, die die Python-Bindungen implementiert, py-polars
genannt wird, um sie von den verpackten Rust-Kisten polars
selbst zu unterscheiden. Allerdings heißen sowohl das Python-Paket als auch das Python-Modul polars
, sodass Sie pip install polars
und import polars
können.
Das Erweitern von Polars mit in Rust kompilierten UDFs ist einfach. Wir stellen PyO3-Erweiterungen für DataFrame
und Series
Datenstrukturen bereit. Weitere Informationen finden Sie unter https://github.com/pola-rs/pyo3-polars.
Erwarten Sie mehr als 2^32 (~4,2 Milliarden) Zeilen? Kompilieren Sie Polars mit dem Feature-Flag bigidx
oder installieren Sie für Python-Benutzer pip install polars-u64-idx
.
Verwenden Sie dies nicht, es sei denn, Sie erreichen die Zeilengrenze, da der Standard-Build von Polars schneller ist und weniger Speicher verbraucht.
Möchten Sie, dass Polars auf einer alten CPU (z. B. aus der Zeit vor 2011) oder auf einem x86-64
Build von Python auf Apple Silicon unter Rosetta läuft? Installieren Sie pip install polars-lts-cpu
. Diese Version von Polars wurde ohne AVX-Zielfunktionen kompiliert.