前段時間在公司技術分享會上,同事介紹了目前市面上關于自動生成 pandas 代碼的工具庫。我們也嘗試把這些工具庫引入到工作流程中。經過一段時間的實踐,最終還是覺得不適合,不再使用這些工具庫。
今天就來給大家說一下其中的緣由,以及有什么其他可能的解決方案。
操作生成代碼
pandas 可以說是辦公自動化的神器,畢竟大部分的任務都需要處理結構化數據。目前Python/ target=_blank class=infotextkey>Python生態中,已經有好幾款能通過操作界面,自動生成 pandas 代碼的工具庫。
比如 Mito :
比如 pandas gui:
比如 dtale :
他們可以通過你的手工操作,把操作過程中的代碼生成出來。
聽起來很不錯吧。以后就不用自己寫 pandas 就能輕松得到自動化處理腳本。事實卻并非如此。
其實,自動生成代碼這件事情,實現并不難。我并不是在說大話,因為以前我也制作過這種工具。但是最終因為發現了工具的瓶頸,而沒有更新下去。當初我發現的那些工具瓶頸,恰恰是我們公司放棄這些工具庫的主要原因。
工程化更重要
當初我之所以制作自動化生成pandas工具,主要是因為我會經常到 kaggle 上找一些數據做數據探索。
數據探索是一件非常"反代碼"的事情,這是因為在你拿到數據之后,此時你并不知道下一步該怎么處理它。所以通常情況下,我會選擇使用 Excel 的透視表完成這項任務。但是往往需要把最終的探索過程自動化。這就迫使我使用pandas做數據探索。
我會經常寫出類似下面的代碼結構:
其實那時候我已經積累了不少常用的pandas自定義功能模塊。但是,這種模式不方便分享。畢竟數據處理的常用功能其實非常多,套路和技巧如果都制作成模塊,在公司團隊協作上,學習成本很高。
那么,有沒有其他的工具可以解決?期間我嘗試過一些 BI 工具的使用。比如 power bi 的數據處理工具 power query。它可以解決一部分的問題,但遠遠沒達到 pandas 的靈活。另一個讓我印象深刻的工具就要數 tabluea 的數據工具 —— prep
本質上它與 power query 大同小異,不過它可以讓流程可視化。下面是 prep 的工作界面:
每次操作都能生成在流程圖上體現,并且每一個節點都可以查看它的輸入數據和輸出結果。
那時候我一下子明白了,為什么不管怎么規范和模塊化pandas代碼,總是感覺很難管理。
我們需要的并不是自動生成pandas代碼,而是生成能體現流程的代碼信息。
其實這也是我學習pandas的方法論,集中精力學習少數核心的方法,更重要的是學會數據流的思維。比如在我編寫的pandas專欄中,就有一個案例講解如何編排你的pandas代碼:
說回現有的一些自動生成代碼的工具庫,它們無一例外只是生成一大串密密麻麻的代碼。你無法從中得知操作意圖。過幾天再看這些代碼,你都無從下手。
有人會說,你可以自己定義函數,封裝工具生成出來的代碼。其實我們公司一開始也是這么干,但實際情況是,我們經常因為需求變化,而去改動里面的邏輯。此時因為工具無法再次重現你的操作步驟。你只能默默手工把代碼實現一遍。
總的來說,這些工具的缺點是:
- 沒有可視化操作流程節點
- 生成的代碼沒有函數化
- 無法自定義功能
由此可以得知它的應用場景是一些非常簡單或無須長期維護代碼的任務。
既然上面說的 tableau prep 這么好,為什么不直接用它?因為它是收費的。并且它也無法做到自定義功能。
難道就不能破局嗎?其實我從未放棄。
一切皆有可能
現在我們來推敲一下,目前有沒有足夠的工具實現"假想"。
要做可視化操作工具,首當其沖就是要制作操作界面。目前 python 已經有了許多 web ui 框架,其中本人覺得最靈活最有潛力的就是 nicegui 。我也已經推出了一系列相關的實戰示例視頻,其實我之所以學習 nicegui,正是希望為 pandas 以及 pybi-next 打造各種輔助工具。
用 nicegui 做一個大概的功能界面非常容易:
該怎么樣設計每一個功能的結構?比如,要實現上圖功能區中的篩選功能,我們可以把每個功能視為一個函數:
想辦法讓函數的各個參數映射成一個界面組件:
這是一個在 juperter notebook 的一個界面組件庫給到我的啟發。利用裝飾器,函數定義的參數類型等信息,可以自動根據函數創建對應的可視化界面。
在導出代碼的時候,我們無須把函數里面的散亂的代碼輸出,而是直接輸出函數定義,以及函數的調用即可。
也就是說,假如用戶在界面上操作了兩次篩選功能,生成的代碼是這樣子:
這就解決了輸出代碼過于散亂的問題。
不僅如此,使用者同樣可以通過這種方式輕易制作自定義的功能。
那么,怎么可以制作出類似 tableau prep 的操作流程界面?由于 nicegui 本身的靈活性,我們可以充分利用前端強大的資源,在我之前的文章中,就介紹過關于這方面的實現。
只要整體機制能跑通,剩下的只是實現細節而已。接下來,我也會把制作過程涉及到的一些有用的python知識分享出來。