เอกสารประกอบ : Python - Rust - Node.js - R | StackOverflow : Python - Rust - Node.js - R | คู่มือผู้ใช้ | ความไม่ลงรอยกัน
Polars เป็นอินเทอร์เฟซ DataFrame ที่อยู่ด้านบนของ OLAP Query Engine ที่ใช้งานใน Rust โดยใช้ Apache Arrow Columnar Format เป็นโมเดลหน่วยความจำ
หากต้องการเรียนรู้เพิ่มเติม โปรดอ่านคู่มือผู้ใช้
>> > 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 CLI:
# 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 สามารถประมวลผลการสืบค้นของคุณ (หรือบางส่วนของการสืบค้นของคุณ) ในรูปแบบสตรีมมิ่ง ซึ่งจะช่วยลดความต้องการหน่วยความจำลงอย่างมาก ดังนั้นคุณอาจสามารถประมวลผลชุดข้อมูล 250GB บนแล็ปท็อปของคุณได้ รวบรวมด้วย 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
ของ repo นี้
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 แต่ไม่มีสัญลักษณ์ debug ใด ๆ คอมไพล์เร็วขึ้นเล็กน้อยmake build-debug-release
เหมือนกับ build-release แต่มีสัญลักษณ์ debug แบบเต็ม คอมไพล์ช้ากว่าเล็กน้อยmake build-dist-release
ไบนารีที่เร็วที่สุด เวลาคอมไพล์มาก ตามค่าเริ่มต้น ไบนารีจะถูกคอมไพล์โดยเปิดการปรับให้เหมาะสมที่สุดสำหรับ CPU สมัยใหม่ ระบุ LTS_CPU=1
ด้วยคำสั่งหาก CPU ของคุณเก่ากว่าและไม่รองรับ เช่น AVX2
โปรดทราบว่า Rust crate ที่ใช้การผูก Python เรียกว่า py-polars
เพื่อแยกความแตกต่างจาก polars
crate ของ 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 ทำงานบน CPU เก่า (เช่น ย้อนกลับไปก่อนปี 2011) หรือบน Python เวอร์ชัน x86-64
บน Apple Silicon ภายใต้ Rosetta หรือไม่ ติดตั้ง pip install polars-lts-cpu
Polars เวอร์ชันนี้คอมไพล์โดยไม่มีฟีเจอร์เป้าหมาย AVX