我們如何為非開發人員建立 Python 開發框架
Python 是 Bluevine 使用的核心程式語言,為我們的後端、資料工程、資料科學、質量保證自動化,以及最近的資料分析提供支援。
在資料分析中,我們使用 SQL 查詢來獲取和轉換資料,特別是使用 PostgreSQL 資料庫。
Bluevine 的整體銀行解決方案專為小型企業設計,旨在幫助他們在快節奏的環境中蓬勃發展。我們實現這一目標的一種方式是讓企業主儘快知道他們是否獲得 Bluevine 服務的批准。為此,我們需要對他們的資料進行風險評估,並及時完成。當我們的許多查詢執行時間過長,並在我們擁有的少數副本之間競爭資源時,這被證明是一個巨大的挑戰。
我們使用的查詢很長(最長的達到 3,000 多行!),並且在資料庫功能的利用方面效率低下,更不用說難以閱讀,並且很難更新和構建。有了這些查詢和我們對快速響應的需求,解決方案很明確。我們可以使用 Python 來執行繁重的工作和資料轉換。
不幸的是,分析團隊幾乎沒有 Python 的經驗。並且在沒有適當注意的情況下遷移我們一些最重要的操作可能會導致不良程式碼。不良程式碼將難以管理,甚至可能遭受與 SQL 指令碼相同的問題,使我們回到原點。
我們設計了以下解決方案
- 首先,為所有工程師提供基於角色的 Python 培訓,特別是面向資料的第三方庫,如 pandas 和 NumPy。
- 其次,設計並構建一個 Python 框架,使團隊能夠專注於他們的工作,同時抽象出軟體工程原則。這將允許他們執行和測試他們的程式碼,更新或建立新的流程。
設計框架需要我們識別 SQL 指令碼中重複出現的模式,並將它們建立為模組化且易於重用或擴充套件的構建塊。
我們確定了 SQL 查詢中可以應用於指令碼的常見結構
- 根據特定條件獲取客戶
- 從不同的表中豐富資料
- 執行邏輯以做出決定
許多指令碼使用類似的查詢來獲取客戶,因此我們能夠提供引數化的函式,這些函式執行 ORM 查詢,提供相同的功能並避免程式碼重複。
對於第二步,我們不是在資料庫中進行繁重的查詢和資料轉換,而是僅提取客戶的原始資料並提供通用函式,這些函式大量使用 pandas 來豐富資料。我們能夠使用向量化操作對資料及其豐富的資料結構執行復雜的聚合和轉換,例如轉置和透視。
這種方法產生多重好處,既提高了效能,又透過避免低效操作釋放了資料庫資源。
邏輯執行更棘手,因為每個程序都會檢查不同的內容。為了允許靈活性,我們提供了一個需要遵循的預定義模組的鬆散結構。例如,每個程序都需要遵循特定結構的模組,例如:- preprocessing.py - calculations.py - conditions.py - decisions.py
框架載入這些模組並按特定順序執行其中的入口點函式。這返回一個 Decision 的類例項。Decision 物件包含我們需要將其傳送回客戶端的所有資訊和功能。
該框架的設計易於使用,即使對於最沒有經驗的使用者也是如此,同時又足夠靈活,允許開發人員構建新的功能以進行重用和改進。
我們很高興地宣佈,我們已將所有流程遷移到在此新框架上執行,並且所有新流程都是使用它建立的。自過渡以來,我們已經看到了改進
- Python 的使用者友好特性使我們的分析師能夠快速學習並及時建立新規則。
- 我們總體上實現了流程執行時間的大幅改進。
- 我們的資料庫執行更簡單、更精煉的查詢,從而總體上減少了負載。
- 透過日誌和監控庫提高可追溯性和可觀察性。
我們很自豪地分享我們的專案取得了成功,但重要的是要記住,利用 Python 可能不適合所有人。在考慮類似的努力時,請考慮以下事項
- 您的客戶(在本例中為分析師)是否具備交付更高質量程式碼所需的技術能力?
- 您是否能夠在公司時間表方面兼顧舊系統的支援和新框架的開發?
- 此框架是否將滿足未來的需求,還是僅改進現有流程?