(資料科學學習手札151)速通pandas2.0新版本乾貨內容

費弗裡發表於2023-04-05

本文示例程式碼已上傳至我的Github倉庫https://github.com/CNFeffery/DataScienceStudyNotes

1 簡介

  大家好我是費老師,前兩天pandas正式釋出了其2.0.0版本,作為一次大版本更新,pandas針對底層進行了大量的重構以最佳化效能和穩定性,其有關這次更新內容的說明文件更是洋洋灑灑非常繁雜。

  我們作為日常使用pandas的使用者,並不需要了解過多底層更新內容,只需要學習如何使用新版pandas為自己提質提效就行,今天的文章話不多說,直接帶大家速通新版pandas乾貨內容?。

(資料科學學習手札151)速通pandas2.0新版本乾貨內容

2 速通pandas 2.0新版本乾貨內容

  為了下文中方便進行演示,我們建立新的虛擬環境來測試新版pandas效能表現:

conda create -n pandas2.0-test python=3.8 -y
conda activate pandas2.0-test
pip install pandas pyarrow jupyterlab

2.1 資料讀取及運算效能提升

  我們對新版pandas的最大期待就是1個字——快,因為經過15年的發展,pandas的分析功能已經相當豐富,API語法也足夠簡單高效,但在處理較大型資料集時的速度和記憶體佔用屬實捉急。

  因此新版pandas引入了基於高效能運算庫arrow的一系列常用資料型別,作為對預設基於numpy的資料型別的代替。

  我們測試使用到的資料集來自(https://www.kaggle.com/datasets/kartik2112/fraud-detection),針對其中的fraudTrain.csv檔案進行讀取,這個檔案大小為三百多兆,我們分別採用3種不同的方式進行讀取:

(資料科學學習手札151)速通pandas2.0新版本乾貨內容

  可以看到,新版pandas中最優的引數組合,足足比預設的引數快了將近20倍?,檢視使用pyarrow資料型別後端讀入的資料框,可以發現型別都已經切換到pyarrow的常用型別:

(資料科學學習手札151)速通pandas2.0新版本乾貨內容

  得益於新的資料型別支援,很多常用的運算操作都要比預設情況下快上很多,其中數值型運算提升幅度很小,但是針對字元型的提升幅度相當大,如下面例子中的startswith()判斷就快了接近50倍:

(資料科學學習手札151)速通pandas2.0新版本乾貨內容

2.2 “修改時複製”機制

  “修改時複製”作為一種最佳化機制,在1.5版本中開始引入pandas,並在2.0中對pandas中大多數運算操作進行了支援,且很有可能在3.0版本中作為預設的策略。

  一言以蔽之,“修改時複製”機制就是一種惰性複製機制,可以幫助我們在運算過程中自動避免很多不必要的資料複製操作,下面我們來看一些例子:

  在預設情況下,如果我們像下面這樣將dffield1列直接賦值給了field1,再對field1中的值進行修改,就會導致原先的df中的對應值也被修改了,這種機制本意是避免賦值時頻繁的資料複製佔用記憶體,但很容易讓我們不小心篡改了原始資料:

(資料科學學習手札151)速通pandas2.0新版本乾貨內容

  而“修改時複製”機制,則會在頻繁複制資料,和避免篡改資料之間進行兼顧(當前版本需要設定全域性引數mode.copy_on_writeTrue以啟用):

(資料科學學習手札151)速通pandas2.0新版本乾貨內容

  也就是說,新版pandas中的“修改時複製”機制,會自動檢測從源資料中衍生出的資料自身是否發生了值修改,並在修改時才進行資料複製操作,保證了分析過程的高效性和穩定性?。

  除了上述介紹的內容外,新版pandas還進行了大量的效能最佳化更新,這些更新無需我們改變過去的pandas寫法,而是在我們的日常使用過程中”潤物細無聲“地幫我們節省了計算開銷,可以說,作為pandas老使用者,切換到2.0版本的過程是無痛且絲滑的?,大家可以放心地進行更新,更多更新內容細節請移步https://pandas.pydata.org/docs/whatsnew/v2.0.0.html


  以上就是本文的全部內容,歡迎在評論區與我進行討論~

相關文章