(數據科學學習手札107)在Python中利用funct實現鏈式風格編程


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

1 簡介

  鏈式編程是一種非常高效的組織代碼的方式,典型如pandasscikit-learn中的pipe(),以及R中的管道操作符%>%等,它們都可以幫助我們像連接管道一樣,將計算過程中的不同步驟順滑的連接起來,從而取代繁瑣的函數嵌套以及避免多余中間變量的創建。

圖1

  鏈式編程與常規寫法的比較如下例:

# 非鏈式寫法
func4(func3(func2(func1(A))))

# 鏈式寫法
A.func1().func2().func3().func4()

  哪一種寫法更簡潔明了,想必大家一眼就看得出來,而今天的文章就將帶大家認識如何借助funct的力量,來改造Python原生列表,賦予其鏈式計算的能力。

2 利用funct.Array實現鏈式計算

  funct的設計理念就是類似Python列表但更棒,它借鑒了numpy的很多特點,配合功能豐富的各種鏈式計算方法,使得我們在使用它完成計算任務編寫代碼如絲般順滑時~

  利用pip install funct完成安裝(本文演示版本為0.9.2)之后,下面我們來認識它的一些優秀特性吧~

2.1 funct.Array的創建

  funct中類比列表和numpy中的數組,創造了Array這種特別的數據結構,常用的有如下幾種創建方式:

  • 從其他數據結構創建

  最常規的方式是從現有的其他數據結構,轉換到Array,常見如下面的幾個例子:

圖2
  • 類似numpy風格的規則創建方法

  除了從現成的數據中創建Array之外,我們還可以類似numpy中的linspace()等API那樣,基於規則批量創建數據,常用的有如下兩種方法:

圖3
  • 創建嵌套Array

  既然是建立在列表的基礎上,那么funct對嵌套Array尤其是不規則嵌套Array的支持也是很到位的:

圖4

  但在配合多個numpy數組構建嵌套Array時要注意,最后一定要加上toArray()方法才能徹底完成轉換:

圖5

2.2 funct.Array的索引

  大致介紹完如何創建funct.Array之后,很重要的一點就是如何對已有Array進行索引,在funct中針對Array設計了如下幾種豐富的索引方式:

  • 列表式索引

  既然繼承自列表,自然可以使用Python原生列表的索引與切片方式:

圖6
  • 數組式索引

  我們都知道Python原生列表不能傳入一系列標號對應的數組來一次性索引出多個值,除非轉換為numpy數組或pandasSeries,但這又會在一些應用場景下丟失靈活性,但在Array中,它可以!

圖7
  • Bool值索引

  Array同樣支持傳入Bool值索引,使得我們可以將某個條件判斷之后的判斷結果作為索引依據傳入:

圖8
  • 多層索引

  既然Array是支持嵌套結構的,自然可以進行多層索引,但需要注意的是:

圖9

2.3 funct.Array的鏈式騷操作

  講完了如何創建與索引funct.Array之后,就來到了本文的重頭戲——Array的鏈式運算上,在funct.Array中,幾乎所有常見的數值與邏輯運算都被封裝到方法中,我們來一階一階的來看看不同情況下如何組織代碼:

  • level1:基礎的數值運算

  首先我們來看看最基礎的四則運算等操作在Array中如何鏈式下去:

圖10

  這樣每一步都很清楚,且每一步都可以獨立添加注釋,保持了代碼的可讀性,譬如可用於歸一化與標准化的計算上:

圖11
  • level2:配合map方法推廣元素級別運算

  除了使用內置的基礎的運算方法之外,在funct.Array中還支持配合map()方法將任意函數應用到每個元素上,從而無限拓寬計算的自由性,譬如我們在前面歸一化的基礎上對數據進行分箱:

圖12
  • level3:配合zip方法引入其他Array參與運算

  當我們想要在鏈式運算中引入其他數組對象時,就可以用到更高級的zip()方法,譬如我們想找出多個Array中相同位置最大值:

圖13
  • level4:條件分組

  在pandas中我們可以利用groupby()進行數據分箱並銜接任意形式的運算,在funct.Array中我們也可以配合groupBy()方法實現:

圖14

  而除了本文介紹到的這一點API之外,funct還提供了上百種實用API,並且還具有並行執行並發執行等高級特性,感興趣的朋友可以前往官方文檔查看( https://github.com/Lauriat/funct )。


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM