1. 程式人生 > >(資料科學學習手札86)全平臺支援的pandas運算加速神器

(資料科學學習手札86)全平臺支援的pandas運算加速神器

> 本文示例程式碼已上傳至我的`Github`倉庫[https://github.com/CNFeffery/DataScienceStudyNotes](https://github.com/CNFeffery/DataScienceStudyNotes) # 1 簡介   隨著其功能的不斷優化與擴充,`pandas`已然成為資料分析領域最受歡迎的工具之一,但其仍然有著一個不容忽視的短板——難以快速處理大型資料集,這是由於`pandas`中的工作流往往是建立在單程序的基礎上,使得其只能利用單個處理器核心來實現各種計算操作,這就使得`pandas`在處理百萬級、千萬級甚至更大資料量時,出現了明顯的效能瓶頸。   本文要介紹的工具`modin`就是一個致力於在改變程式碼量最少的前提下,呼叫起多核計算資源,對`pandas`的計算過程進行並行化改造的`Python`庫,並且隨著其近期的一系列內容更新,`modin`基於`Dask`開始對`Windows`系統同樣進行了支援,使得我們只需要改變一行程式碼,就可以在所有平臺上獲得部分`pandas`功能可觀的計算效率提升。
圖1
# 2 基於modin的pandas運算加速   `modin`支援`Windows`、`Linux`以及`Mac`系統,其中`Linux`與`Mac`平臺版本的`modin`工作時可基於並行運算框架`Ray`和`Dask`,而`Windows`平臺版本目前只支援`Dask`作為計算後端(因為`Ray`沒有`Win`版本),安裝起來十分方便,可以用如下3種命令來安裝具有不同後端的`modin`: ``` pip install modin[dask] # 安裝dask後端 pip install modin[ray] # 安裝ray後端(windows不支援) pip install modin[all] # 推薦方式,自動安裝當前系統支援的所有後端 ```   本文在`Win10`系統上演示`modin`的功能,執行命令: ```bash pip install modin[all] ```   成功安裝`modin`+`dask`之後,在使用`modin`時,只需要將我們習慣的`import pandas as pd`變更為`import modin.pandas as pd`即可,接下來我們來看一下在一些常見功能上,`pandas`**VS**`modin`效能差異情況,首先我們分別使用`pandas`和`modin`讀入一個大小為1.1G的`csv`檔案`esea_master_dmg_demos.part1.csv`,來自`kaggle`(https://www.kaggle.com/skihikingkevin/csgo-matchmaking-damage/data),記錄了關於熱門遊戲`CS:GO`的一些玩家行為資料,因為體積過大,請感興趣的讀者朋友自行去下載:
圖2
  為了區分他們,在匯入時暫時將`modin.pandas`命名為`mpd`:
圖3
  可以看到因為是`Win`平臺,所以使用的計算後端為`Dask`,首先我們來分別讀入檔案檢視耗時:
圖4
  藉助`jupyter notebook`記錄計算時間的外掛,可以看到原生的`pandas`耗時14.8秒,而`modin`只用了5.32秒,接著我們再來試試`concat`操作:
圖5
  可以看到在`pandas`花了8.78秒才完成任務的情況下,`modin`僅用了0.174秒,取得了驚人的效率提升。接下來我們再來執行常見的檢查每列缺失情況的任務:
圖6
  這時耗時差距雖然不如`concat`操作時那麼巨大,也是比較可觀的,但是`modin`畢竟是一個處理快速開發迭代階段的工具,其針對`pandas`的並行化改造尚未覆蓋全部的功能,譬如分組聚合功能。對於這部分功能,`modin`會在執行程式碼時檢查自己是否支援,對於尚未支援的功能`modin`會自動切換到`pandas`單核後端來執行運算,但由於`modin`中組織資料的形式與`pandas`不相同,所以中間需要經歷轉換:
圖7
  這種時候`modin`的運算反而會比`pandas`慢很多:
圖8
  因此我對`modin`持有的態度是在處理大型資料集時,部分應用場景可以用其替換`pandas`,即其已經完成可靠並行化改造的`pandas`功能,你可以在官網對應介面(https://modin.readthedocs.io/en/latest/supported_apis/index.html )檢視其已經支援及尚未良好支援的功能,,因為`modin`還處於快速開發階段,很多目前無法支援的功能也許未來不久就會被加入`modin`:
圖9
  以上就是本文的全部內容,如有疑問歡迎在評論區與我