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

本文示例代碼已上傳至個人Github倉庫https://github.com/CNFeffery/DataScienceStudyNotesgit

1 簡介

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

圖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,常見以下面的幾個例子:spa

圖2
  • 相似numpy風格的規則建立方法

  除了從現成的數據中建立Array以外,咱們還能夠相似numpy中的linspace()等API那樣,基於規則批量建立數據,經常使用的有以下兩種方法:設計

圖3
  • 建立嵌套Array

  既然是創建在列表的基礎上,那麼funct對嵌套Array尤爲是不規則嵌套Array的支持也是很到位的:3d

圖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 )。


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

相關文章
相關標籤/搜索