๐Ÿจ

่ถ…้ซ˜้€ŸDataFrameใƒฉใ‚คใƒ–ใƒฉใƒชใƒผใ€ŒPolarsใ€ใซใคใ„ใฆ

ใซๅ…ฌ้–‹
2023/01/28

ใฏใ˜ใ‚ใซ

ใ“ใ“ๆœ€่ฟ‘ใ€Polarsใซใคใ„ใฆ่ชฟในใ‚‹ไธญใง่‰ฒใ€…ใจ้ข็™ฝใใ†ใ ใจๆ€ใ„็พๅœจๅ‹‰ๅผทไธญใงใ™ใ€‚ไปŠๅ›žใฎ่จ˜ไบ‹ใงใฏๅ‹‰ๅผทๅ†…ๅฎนใฎๆ•ด็†ใ‚‚ๅ…ผใญใฆใ€Polarsใฎ็‰น่‰ฒใ‚’็ดนไป‹ใงใใ‚Œใฐใจๆ€ใฃใฆใ„ใพใ™ใ€‚

Polarsใจใฏ

https://www.pola.rs/
https://github.com/pola-rs/polars/

RustใจPythonใงไฝฟใˆใ‚‹[1]่ถ…้ซ˜้€Ÿ("Blazingly fast")DataFrameใƒฉใ‚คใƒ–ใƒฉใƒชใƒผใ€ใคใพใ‚Šใƒ‡ใƒผใ‚ฟ่งฃๆžใซไฝฟใˆใ‚‹ใƒฉใ‚คใƒ–ใƒฉใƒชใƒผใจใชใ‚Šใพใ™ใ€‚pandasใซๅฏพใ™ใ‚‹Polars(ใ—ใ‚ใใพ)ใงใ‚ใ‚Šๆด’่ฝใฆใ„ใ‚‹ใชใจๆ€ใ„ใพใ™ใ€‚
Core้ƒจๅˆ†ใฏRustใงๅฎŸ่ฃ…ใ•ใ‚ŒใฆใŠใ‚Šใ€ใ‚คใƒณใ‚ฟใƒผใƒ•ใ‚งใƒผใ‚นใจใ—ใฆPythonใ‹ใ‚‰ใ‚‚ๅ‘ผใณๅ‡บใ›ใ‚‹ใ‚ˆใ†ใซใชใฃใฆใ„ใพใ™ใ€‚Rustใ‹ใ‚‰Pythonใƒ‘ใƒƒใ‚ฑใƒผใ‚ธใธใฎใƒ“ใƒซใƒ‰ใฏmaturin(PyO3)ใ‚’ไฝฟใฃใฆใ„ใพใ™ใ€‚

็’ฐๅขƒ

่จ˜ไบ‹ไฝœๆˆๆ™‚ใฎOSใ‚„่จ€่ชžใ€ใƒฉใ‚คใƒ–ใƒฉใƒชใƒผใฎใƒใƒผใ‚ธใƒงใƒณใฏไปฅไธ‹ใซใชใ‚Šใพใ™ใ€‚้–ข้€ฃใŒๅผทใใ†ใชใ‚‚ใฎใฎใฟๆŠœ็ฒ‹ใ—ใฆใ„ใพใ™ใ€‚

Ubntu 22.04
Python 3.10.6 (main, Nov  2 2022, 18:53:38) [GCC 11.3.0] on linux
 maturin                       0.13.7
 pandas                        1.5.2
 polars                        0.15.2
 pyarrow                       11.0.0.dev141
cargo 1.67.0-nightly (eb5d35917 2022-11-17)
rustc 1.67.0-nightly (ff8c8dfbe 2022-11-22)

ใชใŠใ€Polars่‡ชไฝ“ใฏใพใ ใพใ ้–‹็™บไธญใงใ‚ใ‚Šๆ—ฅใ€…ๆ›ดๆ–ฐใ•ใ‚Œใฆใ„ใพใ™ใ€‚(ใ“ใฎ่จ˜ไบ‹ใ‚’ๆ›ธใ„ใฆใ„ใ‚‹้–“ใซใ‚‚ใƒใƒผใ‚ธใƒงใƒณใŒ0.15.6ใพใงๆ›ดๆ–ฐใ•ใ‚Œใฆใ„ใพใ™๏ผ)

้ซ˜้€ŸๅŒ–ใฎ่ƒŒๆ™ฏ

ใƒ‡ใƒผใ‚ฟใƒ•ใ‚ฉใƒผใƒžใƒƒใƒˆ

https://arrow.apache.org/overview/
Apache Arrowใจใ„ใ†ๅˆ—ๆŒ‡ๅ‘ใฎใ‚คใƒณใƒกใƒขใƒชๅž‹ใƒ‡ใƒผใ‚ฟใƒ•ใ‚ฉใƒผใƒžใƒƒใƒˆใ‚’ใƒ™ใƒผใ‚นใซใ—ใฆใƒฉใ‚คใƒ–ใƒฉใƒชใƒผใŒๅฎŸ่ฃ…ใ•ใ‚Œใฆใ„ใพใ™ใ€‚ใ‚ˆใ‚Šๆญฃ็ขบใซ่จ€ใ†ใจใ€Arrow2ใจใ„ใ†Apach Arrowๅฝขๅผใฎcrateใ‚’ไฝฟใฃใฆๅฎŸ่ฃ…ใ—ใฆใ„ใพใ™ใ€‚็ตๆžœใ€ใใ‚‚ใใ‚‚ใฎใƒ‡ใƒผใ‚ฟๅ‡ฆ็†ใŒ้€Ÿใ„ใงใ™ใ€‚ๅฎŸ้š›ใซๅฎš็พฉใ•ใ‚Œใฆใ„ใ‚‹ใƒ‡ใƒผใ‚ฟๅž‹ใซใคใ„ใฆใฏใƒฆใƒผใ‚ถใƒผใ‚ฌใ‚คใƒ‰ใซ่ชฌๆ˜ŽใŒใ‚ใ‚Šใพใ™ใ€‚

Lazy API

PolarsใงใฏDataFrameใ‚’ๆ“ไฝœใ™ใ‚‹ใ‚ฏใ‚จใƒชใƒผใซใคใ„ใฆใ€่ฉ•ไพกใ™ใ‚‹ใ‚ฟใ‚คใƒŸใƒณใ‚ฐใ‚’"Lazy"(้…ๅปถ็š„)ใ‹"Eager"(้€ๆฌก็š„)ใ‹ๅˆ†ใ‘ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚Lazyใซใ—ใŸๅ ดๅˆใ€Polarsใงใฏใ‚ฏใ‚จใƒชใƒผ้–“ใฎไธฆๅˆ—ๅŒ–ใจๆœ€้ฉๅŒ–ใ‚’ใƒ—ใƒฉใƒณใƒ‹ใƒณใ‚ฐใ™ใ‚‹ใŸใ‚ใ€ใ•ใ‚‰ใชใ‚‹้ซ˜้€ŸๅŒ–ใ‚’ๅฎŸ็พใงใใพใ™ใ€‚
ใ„ใใคใ‹ไพ‹[2]ใ‚’ๆ็คบใ—ใฆใฟใพใ™ใ€‚

read_csvใจscan_csv
>>> import polars as pl
>>> pl.Config.set_tbl_rows(2)  # ่กŒใฎ่กจ็คบ็œ็•ฅใฎใŸใ‚
<class 'polars.cfg.Config'>
>>> pl.read_csv("PS.csv", skip_rows=290)
shape: (33796, 287)
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ rowid โ”† pl_name  โ”† hostname โ”† pl_letter โ”† ... โ”† st_nrvc โ”† st_nspec โ”† pl_nespec โ”† pl_ntranspec โ”‚
โ”‚ ---   โ”† ---      โ”† ---      โ”† ---       โ”†     โ”† ---     โ”† ---      โ”† ---       โ”† ---          โ”‚
โ”‚ i64   โ”† str      โ”† str      โ”† str       โ”†     โ”† i64     โ”† i64      โ”† i64       โ”† i64          โ”‚
โ•žโ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ก
โ”‚ 1     โ”† 11 Com b โ”† 11 Com   โ”† b         โ”† ... โ”† 2       โ”† 0        โ”† 0         โ”† 0            โ”‚
โ”œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ค
โ”‚ ...   โ”† ...      โ”† ...      โ”† ...       โ”† ... โ”† ...     โ”† ...      โ”† ...       โ”† ...          โ”‚
โ”œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ค
โ”‚ 33796 โ”† xi Aql b โ”† xi Aql   โ”† b         โ”† ... โ”† 1       โ”† 0        โ”† 0         โ”† 0            โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜


>>> (df := pl.scan_csv("PS.csv", skip_rows=290))
<polars.LazyFrame object at 0x7F99301331C0>
>>> df.collect()
shape: (33796, 287)
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ rowid โ”† pl_name  โ”† hostname โ”† pl_letter โ”† ... โ”† st_nrvc โ”† st_nspec โ”† pl_nespec โ”† pl_ntranspec โ”‚
โ”‚ ---   โ”† ---      โ”† ---      โ”† ---       โ”†     โ”† ---     โ”† ---      โ”† ---       โ”† ---          โ”‚
โ”‚ i64   โ”† str      โ”† str      โ”† str       โ”†     โ”† i64     โ”† i64      โ”† i64       โ”† i64          โ”‚
โ•žโ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ก
โ”‚ 1     โ”† 11 Com b โ”† 11 Com   โ”† b         โ”† ... โ”† 2       โ”† 0        โ”† 0         โ”† 0            โ”‚
โ”œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ค
โ”‚ ...   โ”† ...      โ”† ...      โ”† ...       โ”† ... โ”† ...     โ”† ...      โ”† ...       โ”† ...          โ”‚
โ”œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ค
โ”‚ 33796 โ”† xi Aql b โ”† xi Aql   โ”† b         โ”† ... โ”† 1       โ”† 0        โ”† 0         โ”† 0            โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

read_csvใŒcsvใฎ่ชญใฟ่พผใฟ็ตๆžœใ‚’้€ๆฌก็š„ใซ่ฟ”ใ—ใฆใ„ใ‚‹ใฎใซๅฏพใ—ใ€scan_csvใฏใ‚ณใƒผใƒซๆ™‚็‚นใงใฏLazyFrameใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใ‚’่ฟ”ใ—ใฆใ„ใพใ™ใ€‚ใใฎๅพŒใฎcollectใซใ‚ˆใฃใฆ่ชญใฟ่พผใฟๅ‡ฆ็†ใŒ้…ๅปถ่ฉ•ไพกใ•ใ‚Œใฆใ„ใพใ™ใ€‚
ใ‚‚ใ†ๅฐ‘ใ—ๅ‡ฆ็†ใ‚’่ฟฝๅŠ ใ—ใฆๆœ€้ฉๅŒ–ใ‚„ไธฆๅˆ—ๅŒ–ใฎๅŠนๆžœใซใคใ„ใฆ็ขบ่ชใ—ใพใ™ใ€‚

lazy_example.py
import polars as pl


def main() -> None:
    radius_by_method = (
        pl.scan_csv("PS.csv", skip_rows=290)
        .groupby("discoverymethod")
        .agg([
            pl.count(),
            pl.col("pl_rade").mean().alias("Planet Radius [Earth Radius]"),
            pl.col("pl_rade").max().alias("Max. Planet Radius"),
            pl.col("pl_rade").min().alias("Min. Planet Radius"),
        ])
        .sort("count", reverse=True)
        .limit(4)
    )
    print(radius_by_method.collect())


if __name__ == "__main__":
    main()

็ณปๅค–ๆƒ‘ๆ˜Ÿใฎ่ฆณๆธฌๆ‰‹ๆณ•ใ”ใจใซใ‚ฐใƒซใƒผใƒ—ๅˆ†ใ‘ใ—ใ€ๆƒ‘ๆ˜ŸๅŠๅพ„ใฎๅนณๅ‡ๅ€คใจๆœ€ๅคงๅ€คใ€ๆœ€ๅฐๅ€คใ‚’็ฎ—ๅ‡บใ—ใพใ™[3]ใ€‚

Eagerใชๅ ดๅˆ

scan_csvใŒread_csvใซๅค‰ใ‚ใฃใŸใ ใ‘ใงใ™ใ€‚

eager_example.py
import polars as pl


def main() -> None:
    radius_by_method = (
        pl.read_csv("PS.csv", skip_rows=290)
        .groupby("discoverymethod")
        .agg([
            pl.count(),
            pl.col("pl_rade").mean().alias("Planet Radius [Earth Radius]"),
            pl.col("pl_rade").max().alias("Max. Planet Radius"),
            pl.col("pl_rade").min().alias("Min. Planet Radius"),
        ])
        .sort("count", reverse=True)
        .limit(4)
    )
    print(radius_by_method)


if __name__ == "__main__":
    main()
ๅฎŸ่กŒ็ตๆžœใจๅฎŸ่กŒๆ™‚้–“(lazy)
$ time python lazy_example.py 
shape: (4, 5)
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ discoverymethod           โ”† count โ”† Planet Radius [Earth Radius] โ”† Max. Planet Radius โ”† Min. Planet Radius โ”‚
โ”‚ ---                       โ”† ---   โ”† ---                          โ”† ---                โ”† ---                โ”‚
โ”‚ str                       โ”† u32   โ”† f64                          โ”† f64                โ”† f64                โ”‚
โ•žโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ก
โ”‚ Transit                   โ”† 30802 โ”† 5.111434                     โ”† 3791.05            โ”† 0.27               โ”‚
โ”œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ค
โ”‚ Radial Velocity           โ”† 2270  โ”† 7.211939                     โ”† 16.264             โ”† 1.211              โ”‚
โ”œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ค
โ”‚ Microlensing              โ”† 430   โ”† null                         โ”† null               โ”† null               โ”‚
โ”œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ค
โ”‚ Transit Timing Variations โ”† 120   โ”† 2.206051                     โ”† 3.01               โ”† 0.37               โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

real	0m0.793s
user	0m0.784s
sys	0m0.040s
ๅฎŸ่กŒ็ตๆžœใจๅฎŸ่กŒๆ™‚้–“(eager)
$ time python eager_example.py 
shape: (4, 5)
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ discoverymethod           โ”† count โ”† Planet Radius [Earth Radius] โ”† Max. Planet Radius โ”† Min. Planet Radius โ”‚
โ”‚ ---                       โ”† ---   โ”† ---                          โ”† ---                โ”† ---                โ”‚
โ”‚ str                       โ”† u32   โ”† f64                          โ”† f64                โ”† f64                โ”‚
โ•žโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ก
โ”‚ Transit                   โ”† 30802 โ”† 5.111434                     โ”† 3791.05            โ”† 0.27               โ”‚
โ”œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ค
โ”‚ Radial Velocity           โ”† 2270  โ”† 7.211939                     โ”† 16.264             โ”† 1.211              โ”‚
โ”œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ค
โ”‚ Microlensing              โ”† 430   โ”† null                         โ”† null               โ”† null               โ”‚
โ”œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ค
โ”‚ Transit Timing Variations โ”† 120   โ”† 2.206051                     โ”† 3.01               โ”† 0.37               โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

real	0m0.916s
user	0m9.997s
sys	0m0.184s

ใใ‚‚ใใ‚‚ใฎไธฆๅˆ—ๅŒ–ๆ€ง่ƒฝใŒ่‰ฏใใฆๅฎŸๆ™‚้–“ใซใปใผๅทฎใฏใ‚ใ‚Šใพใ›ใ‚“ใŒใ€user timeใซๅคงใใชๅทฎใŒ่ฆ‹ใ‚‰ใ‚Œใพใ™ใ€‚ใ“ใ‚ŒใฏLazyๆ™‚ใฎๆœ€้ฉๅŒ–ใซใ‚ˆใ‚‹ๅŠนๆžœใ ใจ่ช่ญ˜ใ—ใฆใ„ใพใ™ใ€‚
show_graphใƒกใ‚ฝใƒƒใƒ‰ใ‚’ไฝฟใ†ใจLazyFrameใฎใ‚ฏใ‚จใƒชใƒผใƒ—ใƒฉใƒณใ‚’ๅฏ่ฆ–ๅŒ–ใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚

radius_by_method.show_graph(optimized=True, show=False, output_path="optimized.png")
radius_by_method.show_graph(optimized=False, show=False, output_path="no_optimized.png")

ๆœ€้ฉๅŒ–ใ‚ใ‚Š
ๆœ€้ฉๅŒ–ใ‚ใ‚Š

ๆœ€้ฉๅŒ–ใชใ—
ๆœ€้ฉๅŒ–ใชใ—
ไธŠใŒๆœ€้ฉๅŒ–ใ‚ใ‚Šใ€ไธ‹ใŒๆœ€้ฉๅŒ–ใชใ—ใฎใ‚ฏใ‚จใƒชใƒผใƒ—ใƒฉใƒณใงใ™ใ€‚CSV SCANใฎ้•ใ„ใฏใ‚ใ‹ใ‚Šใ‚„ใ™ใ„ใ‹ใจๆ€ใ„ใพใ™ใ€‚ๆœ€้ฉๅŒ–ใ‚ใ‚Šใงใฏ\pi\ 2/287;ใจใชใฃใฆใ„ใพใ™ใŒใ€ใ“ใ‚Œใฏ287ๅˆ—ใฎไธญใ‹ใ‚‰ไปŠๅ›žๅฟ…่ฆใช2ๅˆ—ใ ใ‘่ชญใฟ่พผใ‚€ใ“ใจใ‚’ๆ„ๅ‘ณใ—ใฆใ„ใพใ™ใ€‚ๆœ€้ฉๅŒ–ใชใ—ใงใฏ\pi\ */287;ใงใ‚ใ‚Šๅ…จ287ๅˆ—ใ‚’่ชญใฟ่พผใ‚“ใงใ„ใพใ™ใ€‚

ๅ‚่€ƒ: Eagerใ‹ใ‚‰Lazyใธใฎๅค‰ๆ›

lazyใƒกใ‚ฝใƒƒใƒ‰ใ‚’ไฝฟใ†ใ“ใจใงEagerใ‹ใ‚‰Lazyใธๅˆ‡ใ‚Šๆ›ฟใˆใ‚‹ใ“ใจใŒๅฏ่ƒฝใงใ™ใ€‚

@@ -6,2 +6,3 @@
         pl.read_csv("PS.csv", skip_rows=290)
+        .lazy()
         .groupby("discoverymethod")
@@ -16,3 +17,3 @@
     )
-    print(radius_by_method)
+    print(radius_by_method.collect())

ๆœ€้ฉๅŒ–ใซใคใ„ใฆ่ฃœ่ถณ

https://github.com/pola-rs/polars/blob/e172db7ace210f03740297ec1480042d9daa4719/polars/polars-lazy/polars-plan/src/logical_plan/optimizer/mod.rs#L52
optimizeๅ†…ใ‚’่ฆ‹ใ‚‹ใจใ€ใ‚ฏใ‚จใƒชใƒผใƒ—ใƒฉใƒณใซๅฏพใ™ใ‚‹ๅ„็จฎๆœ€้ฉๅŒ–ใ‚’่ฟฝใ†ใ“ใจใŒใงใใพใ™ใ€‚ๅ„ๆœ€้ฉๅŒ–ใƒซใƒผใƒซใฎๆฆ‚่ฆใ‚’็พๅœจ็†่งฃใงใใฆใ„ใ‚‹็ฏ„ๅ›ฒใง่จ˜่ผ‰ใ—ใพใ™ใ€‚

  • PredicatePushDown
    ่ค‡ๆ•ฐใฎfilterๅ‡ฆ็†ใŒใ‚ใฃใŸๅ ดๅˆใซใ€ใใ‚Œใ‚‰ใ‚’็ตๅˆใ—ใƒ‡ใƒผใ‚ฟ่ชญใฟ่พผใฟๆ™‚ใซๅˆใ‚ใ›ใฆ่กŒใ†ใ‚ˆใ†ใซใ—ใพใ™ใ€‚ไปฅไธ‹ใซไพ‹ใ‚’็คบใ—ใพใ™ใ€‚
>>> import polars as pl
>>> qp = (
...     pl.scan_csv("PS.csv", skip_rows=290)
...     .filter(pl.col("pl_rade") > 10)
...     .filter(pl.col("pl_masse") < 10)
...     .select([
...             "rowid", "pl_name", "hostname", "discoverymethod", "pl_rade", "pl_masse"
...     ])
... )
>>> qp.collect()
shape: (1, 6)
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ rowid โ”† pl_name     โ”† hostname  โ”† discoverymethod โ”† pl_rade โ”† pl_masse โ”‚
โ”‚ ---   โ”† ---         โ”† ---       โ”† ---             โ”† ---     โ”† ---      โ”‚
โ”‚ i64   โ”† str         โ”† str       โ”† str             โ”† f64     โ”† f64      โ”‚
โ•žโ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ก
โ”‚ 25028 โ”† Kepler-51 d โ”† Kepler-51 โ”† Transit         โ”† 11.8    โ”† 6.2      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
>>> qp.show_graph(optimized=False, show=False, output_path="no_optimized.png")
>>> qp.show_graph(optimized=True, show=False, output_path="optimized.png")

ๆœ€้ฉๅŒ–ใชใ—
ๆœ€้ฉๅŒ–ใชใ—
ๆœ€้ฉๅŒ–ใ‚ใ‚Š
ๆœ€้ฉๅŒ–ใ‚ใ‚Š

  • ProjectionPushdown
    ใƒ‡ใƒผใ‚ฟใ‚นใ‚ญใƒฃใƒณๆ™‚ใชใฉๅˆ—ใฎ่ชญใฟ่พผใฟใ‚’ๆœ€้ฉๅŒ–ใ€ใคใพใ‚Šใ‚ฏใ‚จใƒชใƒผใƒ—ใƒฉใƒณใงๅฟ…่ฆใจใชใ‚‹ๅˆ—ใฎใฟใ‚’่ชญใฟ่พผใฟใพใ™ใ€‚Lazy APIใงๆŒ™ใ’ใŸไพ‹ใ‚‚ใ“ใกใ‚‰ใซ่ฉฒๅฝ“ใ™ใ‚‹่ช่ญ˜ใงใ™ใ€‚
  • TypeCoercionRule
    ็•ฐใชใ‚‹ใƒ‡ใƒผใ‚ฟๅž‹ใ‚’ๆŒใคๅˆ—ใŒๆฏ”่ผƒใ•ใ‚Œใ‚‹้š›ใฎๅž‹ใ‚ญใƒฃใ‚นใƒˆใฎใƒซใƒผใƒซใ‚’ๅฎš็พฉใ—ใฆใ„ใพใ™ใ€‚
  • SimplifyBooleanRule
    x and falseใ‚„x and trueใชใฉ็ตๆžœใŒ่‡ชๆ˜Žใชbooleanๆผ”็ฎ—ใ‚’ๅฎŸ้š›ใฎๆผ”็ฎ—ๅ‰ใซๅ˜็ด”ๅŒ–ใ—ใพใ™ใ€‚
  • SimplifyExprRule
    ๅฏๆ›ๆ€งใฎใ‚ใ‚‹ๆผ”็ฎ—ใ‚„nullๆผ”็ฎ—ใชใฉๅฎŸ้š›ใฎๆผ”็ฎ—ๅ‰ใซใ‚ฏใ‚จใƒชใƒผๆ“ไฝœๅดใ‚’ๅ˜็ด”ๅŒ–ใ—ใพใ™ใ€‚

Out of Core

ๆœ€้ฉๅŒ–ใซใ‚ˆใ‚Šใƒกใƒขใƒชใ‚‚็ฏ€็ด„ใ•ใ‚Œใ‚‹ใฎใงใ™ใŒใ€ใใ‚Œใงใ‚‚ๆ‰ฑใ†ใƒ‡ใƒผใ‚ฟใŒRAMใซๅŽใพใ‚‰ใชใ„ๅ ดๅˆใฏcollect(streaming=True)ใจstreamingใ‚ชใƒ—ใ‚ทใƒงใƒณใ‚’ๆŒ‡ๅฎšใ™ใ‚Œใฐ่‰ฏใ„ใจissueใซใฏใ‚ใ‚Šใพใ™ใ€‚ใŸใ ใ—ใ€ใ“ใกใ‚‰ใฏใพใ ใ‚ขใƒซใƒ•ใ‚ก็‰ˆใฎๆฉŸ่ƒฝใจใชใ‚‹ใ‚ˆใ†ใงใ™ใ€‚(API referenceใ‚ˆใ‚Š)

ใใฎไป–

ไธฆๅˆ—ๅŒ–ใ‚„ใƒกใƒขใƒชๅŠน็އใซใคใ„ใฆใฏPolarsใฎAuthorใงใ‚ใ‚‹RitchieๆฐใŒๆ›ธใ„ใŸๆŠ€่ก“่จ˜ไบ‹ใ‚‚ๅ‚่€ƒใซใชใ‚Šใพใ™ใ€‚(่จผๆ˜Žๆ›ธใฎๆœŸ้™ๅˆ‡ใ‚Œใ‹ใ‚‚ใชใฎใง้–ฒ่ฆงใฏ่‡ชๅทฑ่ฒฌไปปใงใŠ้ก˜ใ„ใ—ใพใ™โ€ฆ)
https://www.ritchievink.com/blog/2021/02/28/i-wrote-one-of-the-fastest-dataframe-libraries/

pandasใจใฎ้•ใ„

ใƒฆใƒผใ‚ถใƒผใ‚ฌใ‚คใƒ‰ใซใ‚‚pandasใ‹ใ‚‰ๆฅใŸไบบๅ‘ใ‘[4]ใซ้•ใ„ใ‚’่จ˜่ผ‰ใ—ใŸใƒšใƒผใ‚ธใŒใ‚ใ‚‹ใฎใงใ€ใ“ใ“ใพใงใซ่ชฌๆ˜Žใ—ใฆใใŸไธฆๅˆ—ๅŒ–ใ‚„ๆœ€้ฉๅŒ–ไปฅๅค–ใฎ้ƒจๅˆ†ใ‚’ๆŠœ็ฒ‹ใ—ใฆ็ดนไป‹ใ—ใพใ™ใ€‚

https://pola-rs.github.io/polars-book/user-guide/coming_from_pandas.html

indexใซใคใ„ใฆ

PolarsใงใฏDataFrameใซindexใŒใ‚ใ‚Šใพใ›ใ‚“ใ€‚Lazy APIใŒๅŸบๆœฌใชใฎใงใ€indexใฎไฟๆŒใ‚„ๅญ˜ๅœจใฏไธฆๅˆ—ๅŒ–ใ‚’้˜ปๅฎณใ™ใ‚‹่ช่ญ˜ใงใ™ใ€‚ไป˜้šใ—ใฆpandasใฎilocใ‚„locใซ็›ธๅฝ“ใ™ใ‚‹ใƒกใ‚ฝใƒƒใƒ‰ใ‚‚ใ‚ใ‚Šใพใ›ใ‚“ใ€‚(ๆญฃ็ขบใซ่จ€ใ†ใจใ€้žๆŽจๅฅจใงใ™ใŒEagerใƒขใƒผใƒ‰ใฎใฟใซๅฎŸ่ฃ…ใฏใ•ใ‚Œใฆใ„ใ‚‹ใ‚ˆใ†ใงใ™ใ€‚ๅ‚่€ƒ
โ†’ ใƒฆใƒผใ‚ถใƒผใซๆททไนฑใ‚’ไธŽใˆใ‚‹ๅฏ่ƒฝๆ€งใŒใ‚ใ‚‹ใจใ—ใฆใ€2023ๅนด1ๆœˆๆœซ้ ƒใซใƒฆใƒผใ‚ถใƒผใ‚ฌใ‚คใƒ‰ใซใ‚ใฃใŸ่จ˜่ผ‰ใŒไฟฎๆญฃใ•ใ‚Œใพใ—ใŸใ€‚indexใซใคใ„ใฆใฏ้žๆŽจๅฅจใงใชใใ€ใ„ใใคใ‹ใฎใ‚ฑใƒผใ‚นใงใฏๆœ‰ๅŠนใชๅ ดๅˆใŒใ‚ใ‚‹ใจใ„ใ†่จ˜่ผ‰ใซใชใฃใฆใ„ใพใ™ใ€‚ๅ‚่€ƒ
ใŸใ ใ—ใ€้…ๅปถ่ฉ•ไพกใฎๆฉๆตใฏๅ—ใ‘ใ‚‰ใ‚Œใชใ„ใŸใ‚ใ€ๆœ€้ฉๅŒ–ใ‚„ไธฆๅˆ—ๅŒ–ใจใฎใƒˆใƒฌใƒผใƒ‰ใ‚ชใƒ•ใซใชใ‚Šใพใ™ใ€‚)
ๅฎŸ้š›ใฎใƒ‡ใƒผใ‚ฟ้ธๆŠžใซใฏselectใ‚„filterใƒกใ‚ฝใƒƒใƒ‰ใ‚’ไฝฟ็”จใ—ใพใ™ใ€‚

selectใ‚„filterใฎไพ‹
>>> df.select(["discoverymethod"]).first().collect()
shape: (1, 1)
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ discoverymethod โ”‚
โ”‚ ---             โ”‚
โ”‚ str             โ”‚
โ•žโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ก
โ”‚ Radial Velocity โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
>>> df.filter(pl.col("pl_rade") > 100.0).first().collect()
shape: (1, 287)
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ rowid โ”† pl_name       โ”† hostname    โ”† pl_letter โ”† ... โ”† st_nrvc โ”† st_nspec โ”† pl_nespec โ”† pl_ntranspec โ”‚
โ”‚ ---   โ”† ---           โ”† ---         โ”† ---       โ”†     โ”† ---     โ”† ---      โ”† ---       โ”† ---          โ”‚
โ”‚ i64   โ”† str           โ”† str         โ”† str       โ”†     โ”† i64     โ”† i64      โ”† i64       โ”† i64          โ”‚
โ•žโ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ก
โ”‚ 14325 โ”† Kepler-1698 b โ”† Kepler-1698 โ”† b         โ”† ... โ”† 0       โ”† 0        โ”† 0         โ”† 0            โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ€ปrowidใฏๅ…ƒใฎcsvใซๅซใพใ‚Œใ‚‹ใƒ‡ใƒผใ‚ฟๅˆ—ใซใชใ‚Šใพใ™ใ€‚

ๆฌ ๆๅ€คใซใคใ„ใฆ

Polarsใงใฏใƒ‡ใƒผใ‚ฟๅž‹ใŒApach ArrowๅฝขๅผใซๅŸบใฅใใŸใ‚ๆฌ ๆๅ€คใฏnullๅ€คใง่กจ็พใ•ใ‚Œใพใ™ใ€‚

>>> df = pl.DataFrame({"value": [1, None, 3]})
>>> df
shape: (3, 1)
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ value โ”‚
โ”‚ ---   โ”‚
โ”‚ i64   โ”‚
โ•žโ•โ•โ•โ•โ•โ•โ•โ•ก
โ”‚ 1     โ”‚
โ”œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ค
โ”‚ null  โ”‚
โ”œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ค
โ”‚ 3     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
>>> df.mean()
shape: (1, 1)
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ value โ”‚
โ”‚ ---   โ”‚
โ”‚ f64   โ”‚
โ•žโ•โ•โ•โ•โ•โ•โ•โ•ก
โ”‚ 2.0   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๆ„ๅ›ณ็š„ใซNaNใ‚’ไฝฟใ†ใ“ใจใ‚‚ใงใใพใ™ใŒใ€NaNใฏๆฌ ๆๅ€คใจใฟใชใ•ใ‚Œใชใ„ใŸใ‚ๅนณๅ‡ๅ€คใ‚’ๅ–ใ‚‹้š›ใชใฉๆณจๆ„ใŒๅฟ…่ฆใงใ™ใ€‚(np.nanใฏfloatๅž‹ใงใ‚ใ‚‹ใ“ใจใ‚‚ๆณจๆ„ใ™ในใ็‚นใงใ™)

>>> import numpy as np
>>> df = pl.DataFrame({"value": [1, np.nan, 3]})
>>> df
shape: (3, 1)
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ value โ”‚
โ”‚ ---   โ”‚
โ”‚ f64   โ”‚
โ•žโ•โ•โ•โ•โ•โ•โ•โ•ก
โ”‚ 1.0   โ”‚
โ”œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ค
โ”‚ NaN   โ”‚
โ”œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ค
โ”‚ 3.0   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
>>> df.mean()
shape: (1, 1)
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ value โ”‚
โ”‚ ---   โ”‚
โ”‚ f64   โ”‚
โ•žโ•โ•โ•โ•โ•โ•โ•โ•ก
โ”‚ NaN   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
>>> df.fill_nan(None).mean()
shape: (1, 1)
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ value โ”‚
โ”‚ ---   โ”‚
โ”‚ f64   โ”‚
โ•žโ•โ•โ•โ•โ•โ•โ•โ•ก
โ”‚ 2.0   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ไป˜้Œฒ: ใƒฉใ‚คใƒ–ใƒฉใƒชใƒผใฎๆง‹ๆˆ

https://github.com/pola-rs/polars/
ๆ”นใ‚ใฆpolarsใƒชใƒใ‚ธใƒˆใƒชใซใคใ„ใฆใงใ™ใŒใ€RustใงๅฎŸ่ฃ…ใ•ใ‚ŒใŸCore้ƒจๅˆ†ใจPythonใงๅฎŸ่ฃ…ใ•ใ‚ŒใŸใ‚คใƒณใ‚ฟใƒผใƒ•ใ‚งใƒผใ‚น้ƒจๅˆ†ใซๅคงๅˆฅใ™ใ‚‹ใ“ใจใŒๅฏ่ƒฝใงใ™ใ€‚ๅ‰่€…ใฏpolarsใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชไปฅไธ‹ใ€ๅพŒ่€…ใฏpy-polarsใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชไปฅไธ‹ใซใ‚ณใƒผใƒ‰ใŒๅญ˜ๅœจใ—ใฆใ„ใพใ™ใ€‚ๅ„ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒช็›ดไธ‹ใซMakefileใŒใ‚ใ‚‹ใฎใงmake testใงใ‚‚ๅฎŸ่กŒใ™ใ‚Œใฐใ€ใƒ“ใƒซใƒ‰ใ‹ใ‚‰ใƒ†ใ‚นใƒˆใพใง้€šใ—ใงๅฎŸ่กŒใ—ใฆใใ‚Œใพใ™ใ€‚Python้–ข้€ฃใฏvenvใง็’ฐๅขƒๆง‹็ฏ‰ใ—ใฆใ„ใ‚‹ใฎใงใ€ใƒ“ใƒซใƒ‰ๅพŒใฏpy-polarsใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใงsource venv/bin/activateใ‚’ๅฎŸ่กŒใ™ใ‚Œใฐ็ฐกๅ˜ใซใƒ‡ใƒใƒƒใ‚ฐใชใฉใŒใงใใพใ™ใ€‚

ใ‚ฝใƒผใ‚นใ‚ณใƒผใƒ‰ใฎใƒˆใƒฌใƒผใ‚นไพ‹

show_graph()ๅ†…ใงๅ‘ผใ‚“ใงใ„ใ‚‹to_dot()ใ‚’ไพ‹ใซใ‚ฝใƒผใ‚นใ‚ณใƒผใƒ‰ใ‚’ใƒˆใƒฌใƒผใ‚นใ™ใ‚‹ใจไปฅไธ‹ๆตใ‚Œใซใชใ‚Šใพใ™ใ€‚

PythonๅดใฎLazyFrameใ‚ฏใƒฉใ‚นใจRustๅดใฎLazyFrameใ‚ฏใƒฉใ‚นใ‚’็ตใถPyLazyFrameใ‚ฏใƒฉใ‚นใŒๅญ˜ๅœจใ™ใ‚‹ใ“ใจใซๆณจๆ„ใ—ใฆใใ ใ•ใ„ใ€‚

ๅฎŸ้š›ใซใ‚ณใƒŸใƒƒใƒˆใ‚’็›ฎๆŒ‡ใ™ๅ ดๅˆใฏCONTRIBUTING.mdใซใ‚‚็›ฎใ‚’้€šใ—ใฆใใ ใ•ใ„ใ€‚

่„šๆณจ
  1. Node.jsใงใ‚‚ไธ€ๅฟœไฝฟใˆใ‚‹ใฟใŸใ„ใชใฎใงใ™ใŒใ€ใƒชใƒใ‚ธใƒˆใƒชใฎๆ›ดๆ–ฐ้ ปๅบฆใ‚„issueใ‚’่ฆ‹ใ‚‹้™ใ‚Šใ€ใƒกใ‚คใƒณใฎใƒกใƒณใƒ†ใƒŠใƒผใฏTS/JSใŒๅฐ‚้–€ๅค–ใงใ‚ใ‚Šใ€ใ“ใฎ้ ˜ๅŸŸใฏใ‚ณใƒŸใƒฅใƒ‹ใƒ†ใ‚ฃใ‹ใ‚‰ใฎใ‚ณใƒณใƒˆใƒชใƒ“ใƒฅใƒผใƒˆใซๅง”ใญใฆใ„ใ‚‹ๅฐ่ฑกใŒๅผทใ„ใงใ™ใ€‚ โ†ฉ๏ธŽ

  2. ไพ‹ใงไฝฟ็”จใ—ใฆใ„ใ‚‹csvใƒ‡ใƒผใ‚ฟใฏNASA Exoplanet ArchiveใŒๆไพ›ใ—ใฆใ„ใ‚‹็ณปๅค–ๆƒ‘ๆ˜Ÿใฎใƒ‡ใƒผใ‚ฟใ‚ซใ‚ฟใƒญใ‚ฐใงใ™ใ€‚(61.3MB) โ†ฉ๏ธŽ

  3. ใ‚ซใ‚ฟใƒญใ‚ฐใงใฏ่ซ–ๆ–‡ใ”ใจใฎๆธฌๅฎšใƒ‡ใƒผใ‚ฟใ‚’1่กŒใจใ—ใฆใ„ใ‚‹ใŸใ‚ใ€ๅŒใ˜ๆƒ‘ๆ˜Ÿใซๅฏพใ™ใ‚‹ใƒ‡ใƒผใ‚ฟใŒ่ค‡ๆ•ฐ่กŒๅญ˜ๅœจใ—ใŸใ‚Šใ€ไธ€้ƒจๅˆ—ใŒnullใชๅ ดๅˆใŒใ‚ใ‚Šใพใ™ใ€‚ๅพ“ใฃใฆใ€ใ“ใ“ใงใฏ็ตๆžœใฎ็‰ฉ็†็š„ใชๆญฃใ—ใ•ใฏไฟ่จผใ—ใพใ›ใ‚“ใ€‚Polarsใฎๆ“ไฝœไพ‹ใจใ—ใฆๆ็คบใ—ใฆใ„ใพใ™ใ€‚ โ†ฉ๏ธŽ

  4. ๅ€‹ไบบ็š„ใซใฏpandasใจPolarsใงไฝฟ็”จใ‚ฑใƒผใ‚นใŒ็ซถๅˆใ™ใ‚‹ใจใฏใใ‚“ใชใซๆ€ใฃใฆใ„ใพใ›ใ‚“ใ€‚ๅ…ฌๅผใฎใƒฆใƒผใ‚ถใƒผใ‚ฌใ‚คใƒ‰ใ‚‚pandasใฎ็Ÿฅๅๅบฆใซใ‚ใ‚„ใ‹ใฃใฆใ€้–“ๅฃใ‚’ๅบƒใ’ใ‚‹ๆ„ๅ›ณใงใƒšใƒผใ‚ธใ‚’ไฝœๆˆใ—ใฆใ„ใ‚‹่ช่ญ˜ใงใ™ใ€‚ โ†ฉ๏ธŽ

Discussion