Polars 是一個使用 Apache Arrow 列格式作為內存模型,用Rust實現的,在Rust, Python以及Node.js中均可使用的速度極快的數據幀庫。
它有以下幾個特點:
懶|立即執行
多線程
SIMD
查詢優化
強大的表達式API
支持多種語言:Rust、Python 等
了解更多內容可以點擊這個用戶指南[1]。
>>> 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"), # groups by "cars"
... pl.col("A").sum().over("fruits").alias("sum_A_by_fruits"), # groups by "fruits"
... pl.col("A").reverse().over("fruits").alias("rev_A_by_fruits"), # groups by "fruits
... pl.col("A").sort_by("B").over("fruits").alias("sort_A_by_B_by_fruits"), # groups 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 │
└──────────┴──────────┴──────────────┴─────┴─────────────┴─────────────┴─────────────┴─────────────┘
Polars速度非常快,事實上,它是目前性能最好的解決方案之一。具體可參見h2oai’s db基准測試結果[2]。
此處我們自己用一些示例代碼來對比python中pandas和polars處理數據的速度差距。
import pandas as pd
import polars as pl
import timeit
# 讀取時間對比
start_df = timeit.default_timer()
df = pd.read_csv("/Users/lenskit/Desktop/aa.csv")
df = df.sort_values("company_name", ascending=False).head()
stop_df = timeit.default_timer()
print('time: ', stop_df - start_df)
start_pl = timeit.default_timer()
data = pl.read_csv("/Users/lenskit/Desktop/aa.csv")
data.sort(by="company_name", reverse=True).head()
stop_pl = timeit.default_timer()
print('time1: ', stop_pl - start_pl)
# 縱向拼接時間對比
start_df1 = timeit.default_timer()
df_1 = pd.read_csv('/Users/lenskit/Desktop/aa.csv')
df_2 = pd.read_csv('/Users/lenskit/Desktop/bb.csv')
df_1.append(df_2, ignore_index=True)
stop_df1 = timeit.default_timer()
print('time2: ', stop_df1 - start_df1)
start_pl1 = timeit.default_timer()
pl_1 = pl.read_csv('/Users/lenskit/Desktop/aa.csv')
pl_2 = pl.read_csv('/Users/lenskit/Desktop/bb.csv')
pl_1.vstack(pl_2)
stop_pl1 = timeit.default_timer()
print('time3: ', stop_pl1 - start_pl1)
time: 5.088931238
time1: 0.8967700230000002
time2: 4.707102063
time3: 0.639797883
可以看到在讀取文件上,polars比pandas速度快了5倍多,在數據縱向拼接上,polars比pandas快了有7倍多。
用如下語句安裝最新的polars版本:
$ pip3 install -U polars[pyarrow]
目前polars的更新頻率很高(每周/每隔幾天),所以最好定期更新一下polars來獲得最新的錯誤修復/功能。
您可以從crates.io獲取最新版本,或者如果你想使用最新的功能/性能改進,可以用如下命令指向版本的master分支。
polars = {
git = "https://github.com/pola-rs/polars", rev = "<optional git tag>" }
注意需要Rust version >=1.58
想知道Polars支持的所有功能嗎?閱讀文檔!
Python
安裝指南:$ pip3 install polars
Python文檔[3]
用戶指南[4]
Rust
Rust文件(主分支)[5]
用戶指南[6]
Node
安裝指南:yarn install nodejs-polars
Node文檔[7]
用戶指南[8]
如果你想要獲取最前沿的版本或最大的性能,你應該從源代碼編譯Polar。
這可以通過按順序執行以下步驟來完成:
1、安裝最新的Rust編譯器[9]
2、安裝maturin[10]: $ pip3 install maturin
3、選擇以下任一:
最快的二進制文件,非常長的編譯時間:
$ cd py-polars && maturin develop --rustc-extra-args="-C target-cpu=native" --release
較快的二進制文件,短一些的編譯時間:
$ cd py-polars && maturin develop --rustc-extra-args="-C codegen-units=16 -C lto=
需要注意的是,Python實現的Rust crate被稱為py-polars
,以區別於Rust crate包polars
本身。然而,Python包和Python模塊都被命名為polars
,所以你可以pip install polars
和import polars
。
Polars已經轉移到arrow2[11]。Arrow2是Apache Arrow Columnar Format[12]更快、更安全的實現。Arrow2還具有更細粒度的代碼庫,有助於減少編譯器膨脹。
[1]用戶指南: https://pola-rs.github.io/polars-book/
[2]h2oai’s db基准測試結果: https://h2oai.github.io/db-benchmark/
[3]Python文檔: https://pola-rs.github.io/polars/py-polars/html/reference/index.html
[4]用戶指南: https://pola-rs.github.io/polars-book/user-guide/index.html
[5]Rust文件(主分支): https://pola-rs.github.io/polars/polars/index.html
[6]用戶指南: https://pola-rs.github.io/polars-book/user-guide/index.html
[7]Node文檔: https://pola-rs.github.io/polars/nodejs-polars/html/index.html
[8]用戶指南: https://pola-rs.github.io/polars-book/user-guide/index.html
[9]Rust編譯器: https://www.rust-lang.org/tools/install
[10]maturin: https://maturin.rs/
[11]arrow2: https://crates.io/crates/arrow2
[12]Apache Arrow Columnar Format: https://arrow.apache.org/docs/format/Columnar.html
李宏毅《機器學習》國語課程(2022)來了
有人把吳恩達老師的機器學習和深度學習做成了中文版
上瘾了,最近又給公司撸了一個可視化大屏(附源碼)
如此優雅,4款 Python 自動數據分析神器真香啊
梳理半月有余,精心准備了17張知識思維導圖,這次要講清統計學
年終匯總:20份可視化大屏模板,直接套用真香(文末附源碼)
歡迎轉載、收藏、有所收獲點贊支持一下!數據、代碼可以找我獲取
目前開通了技術交流群,群友已超過2000人,添加時最好的備注方式為:來源+興趣方向,方便找到志同道合的朋友
Interface Association Interfa