(數據科學學習手札107)在Python中利用funct實現鏈式風格編程
本文示例程式碼已上傳至我的
Github倉庫//github.com/CNFeffery/DataScienceStudyNotes
1 簡介
鏈式編程是一種非常高效的組織程式碼的方式,典型如pandas與scikit-learn中的pipe(),以及R中的管道操作符%>%等,它們都可以幫助我們像連接管道一樣,將計算過程中的不同步驟順滑的連接起來,從而取代繁瑣的函數嵌套以及避免多餘中間變數的創建。

鏈式編程與常規寫法的比較如下例:
# 非鏈式寫法
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,常見如下面的幾個例子:

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

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

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

2.2 funct.Array的索引
大致介紹完如何創建funct.Array之後,很重要的一點就是如何對已有Array進行索引,在funct中針對Array設計了如下幾種豐富的索引方式:
- 列表式索引
既然繼承自列表,自然可以使用Python原生列表的索引與切片方式:

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

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

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

2.3 funct.Array的鏈式騷操作
講完了如何創建與索引funct.Array之後,就來到了本文的重頭戲——Array的鏈式運算上,在funct.Array中,幾乎所有常見的數值與邏輯運算都被封裝到方法中,我們來一階一階的來看看不同情況下如何組織程式碼:
- level1:基礎的數值運算
首先我們來看看最基礎的四則運算等操作在Array中如何鏈式下去:

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

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

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

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

而除了本文介紹到的這一點API之外,funct還提供了上百種實用API,並且還具有並行執行與並發執行等高級特性,感興趣的朋友可以前往官方文檔查看( //github.com/Lauriat/funct )。
以上就是本文的全部內容,歡迎在評論區與我進行討論~


