想讓pandas運行更快嗎?那就用Modin吧

2021-01-10 機器之心Pro

Pandas 是數據科學領域流行的程序庫,能夠提供高性能、易於使用的數據結構和數據分析工具。但是處理規模大小不同的數據使,用戶還得求助於不同的工具,實在有點麻煩。而 Modin 能夠將 pandas 的運行速度提高好幾倍,而無需切換 API 來適應不同的數據規模。

「通過更改一行代碼擴展你的 pandas 工作流。」

Pandas 是數據科學領域的工作者都熟知的程序庫。它提供高性能、易於使用的數據結構和數據分析工具。但是,當處理過於龐大的數據時,單個內核上運行的 Pandas 就會變得力不從心,人們不得不求助於不同的分布式系統來提高性能。然而,為了提高性能而做的這種權衡會帶來陡峭的學習曲線。

本質上,用戶只是想讓 Pandas 運行得更快,而不是為了特定的硬體設置而優化其工作流。這意味著人們希望在處理 10KB 的數據集時,可以使用與處理 10TB 數據集時相同的 Pandas 腳本。Modin 提供了一個優化 Pandas 的解決方案,這樣數據科學家就可以把時間花在從數據中提取價值上,而不是花在提取數據的工具上。

Modin

Modin 是加州大學伯克利分校 RISELab 的一個早期項目,旨在促進分布式計算在數據科學領域的應用。它是一個多進程的數據幀(Dataframe)庫,具有與 Pandas 相同的應用程式接口(API),使用戶可以加速他們的 Pandas 工作流。

在一臺 8 核的機器上,用戶只需要修改一行代碼,Modin 就能將 Pandas 查詢任務加速 4 倍。

該系統是為希望程序運行得更快、伸縮性更好,而無需進行重大代碼更改的 Pandas 用戶設計的。這項工作的最終目標是能夠在雲環境中使用 Pandas。

安裝

Modin 是完全開源的,可以通過下面的 GitHub 連結獲得:

https://github.com/modin-project/modin

我們可以使用如下所示的 PyPi 指令來安裝 Modin:

pip install modin

在 Windows 環境下,Ray 是安裝 Modin 所需的依賴之一。Windows 本身並不支持 Ray,所以為了安裝它,用戶需要使用 WSL(適用 Linux 的 Windows 子系統)。

Modin 如何加速數據處理過程

在筆記本上

在具有 4 個 CPU 內核的現代筆記本上處理適用於該機器的數據幀時,Pandas 僅僅使用了 1 個 CPU 內核,而 Modin 則能夠使用全部 4 個內核。

Pandas 和 Modin 對 CPU 內核的使用情況

從本質上講,Modin 所做的只是增加了 CPU 所有內核的利用率,從而提供了更好的性能。

在大型機器上

在大型機器上,Modin 的作用就變得更加明顯了。假設我們有一臺伺服器或一臺非常強大的機器,Pandas 仍然只會利用一個內核,而 Modin 會使用所有的內核。下圖顯示了在一臺擁有 144 內核的計算機上通過 Pandas 和 Modin 使用「read_csv」函數的性能對比情況:

Pandas 的運行時間會隨著數據量的變化而線性增長,因為它僅僅使用 1 個內核。而從上圖中可能很難看到綠色條形圖的增長,因為 Modin 的運行時間實在太短了。

通常,Modin 使用「read_csv」函數讀取 2G 數據需要 2 秒,而 讀取 18G 數據大約需要不到 18 秒。

架構

接下來,本文將解析 Modin 的架構。

數據幀分區

Modin 對數據幀的分區模式是沿著列和行同時進行劃分的,因為這樣為 Modins 在支持的列數和行數上都提供了靈活性和可伸縮性。

系統架構

Modin 被分為不同的層:

Pandas API 在最頂層暴露給用戶。下一層為查詢編譯器,它接收來自 Pandas API 層的查詢並執行某些優化。最後一層為分區管理器(Partition Manager),負責數據布局並對發送到每個分區的任務進行重組、分區和序列化。

modin 的一般架構

在 Modin 中實現 Pandas API

pandas 有大量的 API,這可能也是它應用如此廣泛的原因之一。

pandas API

由於 Pandas 具有這麼多種操作,Modin 採用了一種數據驅動的方法。也就是說 Modin 的創造者找出了人們最常用的 Pandas 操作。他們研究了 Kaggle 平臺上的 Pandas 使用數據,對上面所有的 notebook 和腳本進行了分析,最終總結出最受歡迎的 Pandas 方法如下:

「pd.read_CSV」是目前最常用的 Pandas 方法,其次是「pd.Dataframe」方法。因此,在 Modin 中,設計者們開始實現一些 Pandas 操作,並按照它們受歡迎程度從高到低的順序進行優化:

目前,Modin 支持大約 71% 的 Pandas API。根據研究,這代表了 93% 的使用場景。Ray

Modin 利用 Ray 以毫不費力的方式加速 Pandas 的 notebook、腳本和程序庫。Ray 是一個針對大規模機器學習和強化學習應用的高性能分布式執行框架。同樣的代碼可以在單臺機器上運行以實現高效的多進程,也可以在集群上用於大型計算。你可以通過下面的 GitHub 連結獲取 Ray:http://github.com/ray-project/ray。

使用方法

導入

Modin 封裝了 Pandas,並透明地分發數據和計算任務,它通過修改一行代碼就加速了 Pandas 的工作流。用戶可以繼續使用以前的 Pandas notebook,同時體驗 Modin 帶來的大幅加速,甚至在一臺機器上。用戶需要做的只是修改導入程序包的聲明,引入「modin.pandas」而不是「pandas」。

import numpy as npimport modin.pandas as pd

我們將使用 Numpy 構建一個由隨機整數組成的簡單數據集。請注意,我們並不需要在這裡指定分區。

data = np.random.randint(0,100,size = (2**16, 2**4))df = pd.DataFrame(data)df = df.add_prefix("Col:")

當我們將數據的類型列印在屏幕上時,會顯示出「Modin 數據幀」。

type(df)modin.pandas.dataframe.DataFrame

如果我們使用「head」命令列印出前五行數據,它會像 Pandas 一樣顯示出 HTML 表單。

df.head()

對比實驗

Modin 會管理數據分區和重組,從而使用戶能夠將注意力集中於從數據中提取出價值。下面的代碼是在一臺 2013 年的擁有 4 個 CPU 內核和 32 GB RAM 內存的 iMac 機器上運行的。

pd.read_csv

「read_csv」是目前為止最常用的 Pandas 操作。接下來,本文將對分別在 Pandas 和 Modin 環境下使用「read_csv」函數的性能進行一個簡單的對比。

pandas%%timeimport pandas pandas_csv_data = pandas.read_csv("../800MB.csv")CPU times: user 26.3 s, sys: 3.14 s, total: 29.4sWall time: 29.5 s

Modin%%timemodin_csv_data = pd.read_csv("../750MB.csv")CPU times: user 76.7 ms, sys: 5.08 ms, total: 81.8 msWall time: 7.6 s

通過使用 Modin,只需要修改導入聲明就可以在一臺 4 核機器上以普通 Pandas 4 倍的速度執行「read_csv」操作。

df.groupby

Pandas 的「groupby」聚合函數底層編寫得非常好,運行速度非常快。但是即使如此,Modin 的性能也比 Pandas 要好。

Pandas%%timeimport pandas_ = pandas_csv_data.groupby(by=pandas_csv_data.col_1).sum()CPU times: user 5.98 s, sys: 1.77 s, total: 7.75 sWall time: 7.74 s

modin%%timeresults = modin_csv_data.groupby(by=modin_csv_data.col_1).sum()CPU times: user 3.18 s, sys: 42.2 ms, total: 3.23 sWall time: 7.3 s

Pandas 實現的默認設置

如果想要使用尚未實現或優化的 Pandas API,實際上可以使用默認的 Pandas API。這使得該系統可以用於使用 Modin 中尚未實現操作的 notebook 中(儘管由於即將使用 Pandas API,性能會有所下降)。當使用默認的 Pandas API 時,你將看到一個警告:

dot_df = df.dot(df.T)

當計算完成後,該操作會返回一個分布式的 Modin 數據幀。

type(dot_df)--modin.pandas.dataframe.DataFrame

結語

Modin 項目仍處於早期階段,但對 Pandas 來說是一個非常有發展前景的補充。Modin 為用戶處理所有的數據分區和重組任務,這樣我們就可以集中精力處理工作流。Modin 的基本目標是讓用戶能夠在小數據和大數據上使用相同的工具,而不用考慮改變 API 來適應不同的數據規模。

相關焦點

  • 嫌pandas慢又不想改代碼怎麼辦?來試試Modin
    從本質上講,用戶可能只是希望Pandas運行得更快,並不希望對其特定的硬體設置優化其工作流程。這意味著大家希望使用相同Pandas腳本作用於10KB數據集和10TB數據集。 Modin對優化pandas提供了解決方案,以便數據科學家可以花更多時間從數據中提取價值,而不是在工具上。
  • 提高數據處理效率,一行代碼開啟Pandas四倍速!
    如何讓Pandas更快更省心呢?快來了解新庫Modin,可以分割pandas的計算量,提高數據處理效率,一行代碼即刻開啟Pandas四倍速。首先了解一些基礎知識:Pandas作為Python中用於處理數據的庫,能簡單且靈活地處理不同種類、大小的數據。除此之外,Pandas還有許多函數有助於輕鬆處理不同數據。
  • 如何用pandas更快地進行數據可視化?
    作者:劉早起來源:早起Python(公眾號)如果你經常使用Python進行數據分析,那麼對於pandas一定不會陌生,但是Pandas除了在數據處理上大放異彩,隨著版本的不斷更新,Pandas的繪圖功能在某些情況下甚至要比matplotlib更加適用,本文就將介紹如何用
  • 用Pandas演示tips的小技巧,學到了嗎?
    下載Jupyter notebook,一起動動小手來試試吧!設置創建一個10行3列的數據幀,數值隨機。還可以在pandas分析伺服器上製作API,這樣就可以在網頁瀏覽器的數據幀中追蹤最新數值。注意,這需要用到lxml軟體包,可以用pip安裝lxml。
  • Pandas的介紹與基本使用
    如果說沒有pandas的出現,目前的金融數據分析領域還應該是R語言的天下。2、Pandas能幹什麼Pandas的主要功能:具備對應其功能的數據結構DataFrame,Series集成時間序列功能提供豐富的數學運算和操作靈活處理缺失數據.....以上就是pandas能完成的一些基礎操作,當然並不完全,下面就來看看pandas到底是怎麼用的。
  • 懶人秘籍:教你如何避免編寫pandas代碼
    在本文中,筆者首先展示了一個「如何避免」的例子,然後展示了一個正確的「如何使用」pandas來計算統計數據的方法。改進後,代碼更簡潔、易讀,執行更快。報告時間的格式為: 831 ms ± 25.7 ms per loop,即平均831毫秒,標準偏差為25.7毫秒。每個代碼示例執行多次,以計算準確的執行時間。
  • PANDAS: 新手教程 一
    注意-此命令在不同運行時的輸出可能不同。titanic_data.sample(5)3.使用shape獲取數據維度一旦我們有了數據,我們就需要知道我們要處理的行或列的數量,而Pandas的shape API提供的正是這些。
  • Python學習120課 pandas簡介kaggle下載數據及pandas讀取外部數據
    現在我們開始學習pandas,pandas一般用的更多,pandas是基於numpy去寫的。pandas是一個專門做數據結構和數據分析的庫。●pandas的安裝推薦使用anaconda,只要安裝了anaconda,它裡面就會自帶pandas,這會為我們省去很多的麻煩。接下來就是用pandas去處理數據,數據從哪來呢?
  • 想成為高效數據科學家?不會Pandas怎麼行
    要想成為一名高效的數據科學家,不會 Pandas 怎麼行?Python 是開源的,它很棒,但是也無法避免開源的一些固有問題:很多包都在做(或者在嘗試做)同樣的事情。如果你是 Python 新手,那麼你很難知道某個特定任務的最佳包是哪個,你需要有經驗的人告訴你。有一個用於數據科學的包絕對是必需的,它就是 pandas。
  • Pandas on Ray:僅需改動一行代碼,即可讓Pandas加速四倍
    當面臨這種規模的數據時,Pandas 成了最受喜愛的工具;然而,當你開始處理 TB 級別的基因數據時,單核運行的 Pandas 就會變得捉襟見肘。如果我們擁有更多的處理器核,或者要打開數十 TB 規模的文件時,我們希望 Pandas 運行得更快。
  • 高效的5個pandas函數,你都用過嗎?
    之前為大家介紹過10個高效的pandas函數,頗受歡迎,裡面的每一個函數都能幫我們在數據分析過程中節省時間。高效的10個Pandas函數,你都用過嗎?pandas還有很多讓人舒適的用法,這次再為大家介紹5個pandas函數,作為這個系列的第二篇。1. explodeexplode用於將一行數據展開成多行。
  • 教程| pandas輕鬆入門 之 數據結構介紹 1
    訪問flyai.club,一鍵創建你的人工智慧項目Pandas含有使數據清洗和分析工作變得更快更簡單的數據結構和操作工具。pandas經常和其它工具一同使用,如數值計算工具NumPy和SciPy,分析庫statsmodels和scikit-learn,和數據可視化庫matplotlib。
  • pandas指南:做更高效的數據科學家
    今天我要告訴你們的是:在數據科學中,有一個軟體包是你們絕對需要學習的,那就是pandas。而pandas真正有趣的地方是,很多其他的包也在裡面。pandas是一個核心包,因此它具有來自其他各種包的特性。pandas類似於Python中的Excel:它使用表(即DataFrame)並對數據進行轉換,但它還能做更多。
  • 從小白到大師,這裡有一份Pandas入門指南
    v=hK6o_TDXXN8用一句話來總結,Pandas v1.0 主要改善了穩定性(如時間序列)並刪除了未使用的代碼庫(如 SparseDataFrame)。數據讓我們開始吧!選擇「1985 到 2016 年間每個國家的自殺率」作為玩具數據集。這個數據集足夠簡單,但也足以讓你上手 Pandas。
  • 如何通過一頓飯來說明NumPy與pandas的功用
    縱然NumPy與pandas風靡於數據分析任務,人們對其的不足也多有指出,其中最主要的便是由於Python自身的動態語言特性而帶來的運行速度方面的損失,其次便是Python在大數據處理方面(數G甚至幾十上百G)的捉襟見肘。對於前者,NumPy已經做了相當程度的優化,可以對大數組的數據進行高效處理。
  • PandaSQL:一個讓你能夠通過SQL語句進行pandas的操作的python包
    假設你對SQL非常的熟悉,或者你想有更可讀的代碼。或者您只是想在dataframe上運行一個特殊的SQL查詢。或者,也許你來自R,想要一個sqldf的替代品。這篇文章將介紹一種在pandas的dataframe中使用SQL的python包,並且使用一個不等連結的查詢操作來介紹PandasSQL的使用方法。
  • PANDAS: 新手教程 一 - 人工智慧遇見磐創
    注意-此命令在不同運行時的輸出可能不同。titanic_data.sample(5)3.使用shape獲取數據維度一旦我們有了數據,我們就需要知道我們要處理的行或列的數量,而Pandas的shape API提供的正是這些。
  • 20個Pandas函數詳解
    pandas之所以如此普遍,是因為它具有強大的功能,以及他簡單的語法和靈活性。在這篇文章中,我將舉例來解釋20個常用的pandas函數。有些是很常見的,我敢肯定你以前用過。有些對你來說可能是新的。所有函數都將為你的數據分析過程增加價值。
  • 【跟著stackoverflow學Pandas】- Pandas修改列的類型
    Pandas: change data type of columns - Pandas修改列的類型我們利用pandas進行數據處理經常會遇到數據類型不符的問題
  • pandas使用的25個技巧
    查詢pandas版本  如果你還想知道pandas所依賴的模塊的版本,你可以使用show_versions()函數:減小DataFrame空間大小   pandas DataFrame被設計成可以適應內存,所以有些時候你可以減小DataFrame的空間大小,讓它在你的系統上更好地運行起來。  這是drinks這個DataFrame所佔用的空間大小: