문서 : Python - Rust - Node.js - R | StackOverflow : Python - Rust - Node.js - R | 이용안내 | 불화
Polars는 Apache Arrow Columnar 형식을 메모리 모델로 사용하여 Rust에서 구현된 OLAP 쿼리 엔진 위에 있는 DataFrame 인터페이스입니다.
자세한 내용은 사용자 가이드를 읽어보세요.
>> > 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 ()
Polars CLI를 사용하여 터미널에서 SQL 명령을 직접 실행할 수도 있습니다.
# 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 리포지토리를 참조하세요.
Polars는 매우 빠릅니다. 실제로 이는 사용 가능한 최고 성능의 솔루션 중 하나입니다. PDS-H 벤치마크 결과를 확인하세요.
Polars는 또한 매우 가볍습니다. 필수 종속성이 전혀 없으며 이는 가져오기 시간에 표시됩니다.
메모리에 맞지 않는 데이터가 있는 경우 Polars의 쿼리 엔진은 스트리밍 방식으로 쿼리(또는 쿼리의 일부)를 처리할 수 있습니다. 이렇게 하면 메모리 요구 사항이 크게 줄어들므로 노트북에서 250GB 데이터 세트를 처리할 수 있습니다. 쿼리 스트리밍을 실행하려면 collect(streaming=True)
로 수집하세요. (조금 느려질 수도 있지만 여전히 매우 빠릅니다!)
다음을 사용하여 최신 Polars 버전을 설치하세요.
pip install polars
conda 패키지( conda install -c conda-forge polars
)도 있지만 Polars를 설치하는 데 pip가 선호되는 방법입니다.
모든 선택적 종속성과 함께 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
만 디버그 기호가 없어 컴파일 속도가 약간 더 빨라집니다.make build-debug-release
. build-release와 동일하지만 전체 디버그 기호가 포함되어 있어 컴파일 속도가 약간 느립니다.make build-dist-release
, 가장 빠른 바이너리, 극단적인 컴파일 시간 기본적으로 바이너리는 최신 CPU에 최적화된 상태로 컴파일됩니다. CPU가 오래되었고 AVX2 등을 지원하지 않는 경우 명령에 LTS_CPU=1
지정합니다.
Python 바인딩을 구현하는 Rust 크레이트는 래핑된 Rust polars
자체와 구별하기 위해 py-polars
라고 합니다. 그러나 Python 패키지와 Python 모듈의 이름은 모두 polars
이므로 pip install polars
및 import polars
가 가능합니다.
Rust로 컴파일된 UDF로 Polar를 확장하는 것은 쉽습니다. DataFrame
및 Series
데이터 구조에 대한 PyO3 확장을 공개합니다. https://github.com/pola-rs/pyo3-pols에서 자세한 내용을 확인하세요.
2^32(~42억)개 이상의 행을 예상하시나요? bigidx
기능 플래그를 사용하여 Polars를 컴파일하거나 Python 사용자의 경우 pip install polars-u64-idx
설치하십시오.
Polars의 기본 빌드가 더 빠르고 메모리를 덜 소비하므로 행 경계에 도달하지 않는 한 이것을 사용하지 마십시오.
Polars를 오래된 CPU(예: 2011년 이전)에서 실행하시겠습니까, 아니면 Rosetta의 Apple Silicon 기반 Python의 x86-64
빌드에서 실행하시겠습니까? pip install polars-lts-cpu
설치합니다. 이 버전의 Polars는 AVX 대상 기능 없이 컴파일됩니다.