0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Pandas數(shù)據(jù)幀庫概述、性能及安裝

Linux愛好者 ? 來源:開源前哨 ? 作者:Lenskit ? 2022-07-11 12:02 ? 次閱讀

導(dǎo)語

Polars 是一個使用 Apache Arrow 列格式作為內(nèi)存模型,用Rust實現(xiàn)的,在Rust, Python以及Node.js中均可使用的速度極快的數(shù)據(jù)幀庫。

它有以下幾個特點:

  • 懶|立即執(zhí)行

  • 多線程

  • SIMD

  • 查詢優(yōu)化

  • 強(qiáng)大的表達(dá)式API

  • 支持多種語言:Rust、Python 等

了解更多內(nèi)容可以點擊這個用戶指南[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基準(zhǔn)測試結(jié)果[2]

此處我們自己用一些示例代碼來對比python中pandas和polars處理數(shù)據(jù)的速度差距。

importpandasaspd
importpolarsaspl
importtimeit

#讀取時間對比
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倍多,在數(shù)據(jù)縱向拼接上,polars比pandas快了有7倍多。

Python安裝

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

$pip3install-Upolars[pyarrow]

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

Rust安裝

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

polars={git="https://github.com/pola-rs/polars",rev=""}

注意需要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

如果你想要獲取最前沿的版本或最大的性能,你應(yīng)該從源代碼編譯Polar。

這可以通過按順序執(zhí)行以下步驟來完成:

  • 1、安裝最新的Rust編譯器[9]

  • 2、安裝maturin[10]: $ pip3 install maturin

  • 3、選擇以下任一:

  • 最快的二進(jìn)制文件,非常長的編譯時間:

  • $ cd py-polars && maturin develop --rustc-extra-args="-C target-cpu=native" --release

  • 較快的二進(jìn)制文件,短一些的編譯時間:

  • $ cd py-polars && maturin develop --rustc-extra-args="-C codegen-units=16 -C lto=

需要注意的是,Python實現(xiàn)的Rust crate被稱為py-polars,以區(qū)別于Rust crate包polars本身。然而,Python包和Python模塊都被命名為polars,所以你可以pip install polarsimport polars

Arrow2

Polars已經(jīng)轉(zhuǎn)移到arrow2[11]。Arrow2是Apache Arrow Columnar Format[12]更快、更安全的實現(xiàn)。Arrow2還具有更細(xì)粒度的代碼庫,有助于減少編譯器膨脹。

審核編輯:湯梓紅


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • python
    +關(guān)注

    關(guān)注

    54

    文章

    4759

    瀏覽量

    84297
  • 數(shù)據(jù)幀
    +關(guān)注

    關(guān)注

    0

    文章

    43

    瀏覽量

    6718
  • Rust
    +關(guān)注

    關(guān)注

    1

    文章

    228

    瀏覽量

    6529

原文標(biāo)題:6.6K Star!比 Pandas 快很多的數(shù)據(jù)處理庫

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    python數(shù)據(jù)分析的類

    ,因為它太重要了.Pandas提供了我們很多函數(shù),能夠快速的方便的,處理結(jié)構(gòu)化的大型數(shù)據(jù),不夸張的說,Pandas是讓Python成為強(qiáng)大的數(shù)據(jù)
    發(fā)表于 05-10 15:18

    pandas數(shù)據(jù)分析的方法

    pandas數(shù)據(jù)分析中常用方法
    發(fā)表于 06-03 06:16

    數(shù)據(jù)庫安裝流程及遇到的問題概述

    筆記4-數(shù)據(jù)庫安裝
    發(fā)表于 07-24 11:04

    pandas使用步驟

    提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔文章目錄前言一、pandas是什么?二、使用步驟1.引入庫2.讀入數(shù)據(jù)總結(jié)學(xué)習(xí)內(nèi)容:學(xué)習(xí)時間:學(xué)習(xí)產(chǎn)出:前言一、pandas是什么?二
    發(fā)表于 08-10 07:50

    pandas是什么?

    提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔文章目錄前言一、pandas是什么?二、使用步驟1.引入庫2.讀入數(shù)據(jù)總結(jié)前言提示:這里可以添加本文要記錄的大概內(nèi)容:例如:隨著
    發(fā)表于 01-12 07:53

    機(jī)器學(xué)習(xí)開發(fā)課程,使用Pandas探索數(shù)據(jù)分析

    Pandas是一個Python,提供了大量數(shù)據(jù)分析的方法。數(shù)據(jù)科學(xué)家經(jīng)常和表格形式的數(shù)據(jù)(比如.csv、.tsv、.xlsx)打交道。
    的頭像 發(fā)表于 03-14 18:07 ?4775次閱讀

    Stellaris軟件安裝,特性介紹和資源說明詳細(xì)中文概述

    本文的主要內(nèi)容介紹的是Stellaris軟件安裝,特性介紹和資源說明詳細(xì)中文概述
    發(fā)表于 05-09 11:20 ?5次下載
    Stellaris軟件<b class='flag-5'>庫</b>的<b class='flag-5'>安裝</b>,特性介紹和資源說明詳細(xì)中文<b class='flag-5'>概述</b>

    pandas的快速入門介紹

    pandas 是基于NumPy 的一種工具,該工具是為了解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的。Pandas 納入了大量和一些標(biāo)準(zhǔn)的數(shù)據(jù)模型,提供了高效
    發(fā)表于 06-03 08:00 ?0次下載
    <b class='flag-5'>pandas</b>的快速入門介紹

    探究pandas與GUI界面的超強(qiáng)結(jié)合

    pandasgui安裝與簡單使用 根據(jù)作者的介紹,pandasgui是用于分析 Pandas DataFrames的GUI。這個屬于第三方,使用之前需要安裝。 pip?install
    的頭像 發(fā)表于 11-09 10:55 ?1505次閱讀
    探究<b class='flag-5'>pandas</b>與GUI界面的超強(qiáng)結(jié)合

    Pandas profiling數(shù)據(jù)庫的功能及解決方案

    Pandas profiling 可以彌補(bǔ) pandas describe 沒有詳細(xì)數(shù)據(jù)報告生成的不足。它為數(shù)據(jù)集提供報告生成,并為生成的報告提供許多功能和自定義。在本文中,我們將探索
    的頭像 發(fā)表于 03-15 16:31 ?1776次閱讀

    詳解Python中的Pandas和Numpy

    pandas、numpy是Python數(shù)據(jù)科學(xué)中非常常用的,numpy是Python的數(shù)值計算擴(kuò)展,專門用來處理矩陣,它的運算效率比列表更高效。
    的頭像 發(fā)表于 05-25 12:49 ?2440次閱讀

    Python Pandas如何來管理結(jié)構(gòu)化數(shù)據(jù)

    Python Pandas是一個為Python編程提供數(shù)據(jù)操作和分析功能的開源工具包。這個已經(jīng)成為數(shù)據(jù)科學(xué)家和分析師的必備工具。它提供了一種有效的方法來管理結(jié)構(gòu)化
    的頭像 發(fā)表于 05-25 11:22 ?632次閱讀
    Python <b class='flag-5'>Pandas</b>如何來管理結(jié)構(gòu)化<b class='flag-5'>數(shù)據(jù)</b>

    如何使用Python和pandas讀取、寫入文件

    在本文中,我將介紹如何使用 Python 和 pandas 讀取、寫入文件。 1、安裝 pip install pandas 2、讀取 import
    的頭像 發(fā)表于 09-11 17:52 ?1097次閱讀

    如何利用Python和pandas來處理json數(shù)據(jù)

    了如何利用Python和pandas(Python的第三方)來處理json數(shù)據(jù),主要內(nèi)容包含: json數(shù)據(jù)簡介 常用json數(shù)據(jù)轉(zhuǎn)化網(wǎng)站
    的頭像 發(fā)表于 11-01 10:59 ?2096次閱讀
    如何利用Python和<b class='flag-5'>pandas</b>來處理json<b class='flag-5'>數(shù)據(jù)</b>

    使用pandas進(jìn)行數(shù)據(jù)選擇和過濾的基本技術(shù)和函數(shù)

    Python pandas提供了幾種選擇和過濾數(shù)據(jù)的方法,如loc、iloc、[]括號操作符、query、isin、between等等
    的頭像 發(fā)表于 12-01 10:14 ?311次閱讀
    使用<b class='flag-5'>pandas</b>進(jìn)行<b class='flag-5'>數(shù)據(jù)</b>選擇和過濾的基本技術(shù)和函數(shù)