天天看點

6.6K Star,比 Pandas 快很多的資料處理庫

Polars 是一個使用 Apache Arrow 列格式作為記憶體模型,用Rust實作的,在Rust, Python以及Node.js中均可使用的速度極快的資料幀庫。

它有以下幾個特點:

  • 懶|立即執行
  • 多線程
  • SIMD
  • 查詢優化
  • 強大的表達式API
  • 支援多種語言:Rust、Python 等

了解更多内容可以點選這個使用者指南[1]。

Python代碼示例

>>> 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倍多。

Python安裝

用如下語句安裝最新的polars版本:

目前polars的更新頻率很高(每周/每隔幾天),是以最好定期更新一下polars來獲得最新的錯誤修複/功能。

Rust安裝

您可以從crates.io擷取最新版本,或者如果你想使用最新的功能/性能改進,可以用如下指令指向版本的master分支。

注意需要Rust version >=1.58

文檔

想知道Polars支援的所有功能嗎?閱讀文檔!

Python

  • 安裝指南:

    $ pip3 install polars

  • Python文檔[3]
  • 使用者指南[4]

Rust

  • Rust檔案(主分支)[5]
  • 使用者指南[6]

Node

  • 安裝指南:

    yarn install nodejs-polars

  • Node文檔[7]
  • 使用者指南[8]

[Python]: 從源代碼編譯polars

如果你想要擷取最前沿的版本或最大的性能,你應該從源代碼編譯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

Arrow2

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份可視化大屏模闆,直接套用真香(文末附源碼)

技術交流

歡迎轉載、收藏、有所收獲點贊支援一下!資料、代碼可以找我擷取

6.6K Star,比 Pandas 快很多的資料處理庫

目前開通了技術交流群,群友已超過2000人,添加時最好的備注方式為:來源+興趣方向,友善找到志同道合的朋友

  • 方式①、發送如下圖檔至微信,長按識别,背景回複:加群;
  • 方式②、添加微信号:dkl88191,備注:來自CSDN
  • 方式③、微信搜尋公衆号:Python學習與資料挖掘,背景回複:加群
6.6K Star,比 Pandas 快很多的資料處理庫