
夕陽正紅,將整座鄉下的小院子染上一片溫柔的晚霞暮紫。
阿公端起剛泡好、散發著清香的琥珀熱茶,笑瞇瞇地看著你們兩個。大孫女懂事,正安靜地坐在一旁幫阿公搥背;小孫女還是那樣愛撒嬌,揪著阿公這身舊衣角不肯放。阿公摸了摸自己這頭白髮銀霜,靠在椅背呈藤椅深棕的舊椅上,慢條斯理地說:
「大孫女常跟阿公說,現在城裡做什麼大企業的審計,動不動就是幾十億、上百億的帳目,看 Excel 看得頭都要暈了。阿公雖然年紀大、說話慢,但以前幫那些大掌櫃理帳時,可也見過不少風浪。幾十億的帳目,就跟院子裡的沙礫一樣,如果不理順了,看著當然眼睛花、頭疼得緊。」
「來,大孫女、小孫女,還有各位正在跟著阿公學習的孩子們,大家坐好。今天阿公一邊喝茶,一邊給你們慢慢講講這 Day 10 的課程:如何用 Python 搭配 Plotly Dash,打造一套百億級會計科目差異分析儀表板。」
乖孫女啊,你們想想,期末審計或者大掌櫃要下管理決策時,最重要的事情之一,就是比對 「開帳(Opening Balance,期初餘額)」與「結帳(Closing Balance,期末餘額)」 之間的會計科目波動。
企業裡的會計科目有上百個,金額更是動輒幾十億、上百億。以前那些分析人員,總是把這上百個科目、密密麻麻的數字,全部塞在 Excel 報表裡。那密密麻麻的數字,看起來就像一窩黑色的小螞蟻在白紙上爬。大掌櫃年紀比阿公還大,拿著放大鏡看到眼睛發酸,也根本找不到哪裡有異常波動。
如果帳目有大額的異常虧空,或者科目波動超出了預設的「警戒線(閾值)」,而在密密麻麻的 Excel 裡沒看出來,那可是要出大問題的。這就是我們為什麼非要用科技,把它們變成人人看得懂的圖表。
為了解決這個痛點,阿公教你們用 Python 搭配 Plotly Dash 框架,來建置一個專門給財務和會計主管使用的互動式財務分析平台。這個平台只提供唯讀分析,不牽涉到修改傳票或異動帳務,這樣對公司的資安和財務控制是最保險的。
阿公把它的實作架構,給你們拆解成三個核心層次:
在資料庫裡,阿公設計了兩張主要的資料表:
dim_account):記錄會計科目代碼、會計科目名稱,以及科目分類。fact_balance):記錄每個會計科目代碼在各個日期的期初與期末金額。大企業的交易明細千絲萬縷,我們需要使用 LTV(Ledger-to-Value)比對邏輯,將交易明細與科目主檔進行關聯,並在後端用 Pandas 算出每個科目的 「差異金額」(期末金額 − 期初金額),這個差異金額有正有負,代表波動的方向。
這百億級的數字,後面那一長串零,大掌櫃看了頭都暈。所以阿公一定要在系統裡加入 「元/億元」的單位切換功能。
只要一轉換,金額全部換算成億元,預設保留 2 位小數,畫面看起來立刻變得乾乾淨淨、清清楚楚!
我們的畫面版面(Layout)上,有這幾個靈魂元件:
這系統能動,全靠 Python 後端的 Callback(回呼機制)。阿公把這控制關係,寫成了五個核心回呼:
DataTable 渲染,維持畫面的最新狀態。大孫女啊,你比較懂事,阿公接下來這段話你一定要記在心裡,這可是很多人寫程式會摔得鼻青臉腫的「坑」:
Plotly Dash 在處理大量資料時,如果 Callback 設計不當,網頁就會卡頓得一塌糊塗,大掌櫃的瀏覽器會直接當機、轉圈圈。
為什麼會這樣呢?因為很多人偷懶,把資料庫撈出來的幾百萬筆原始資料,通通透過網路送到前端網頁(也就是使用者的瀏覽器)裡,再用瀏覽器的 JavaScript 去做計算、過濾和排序。這可萬萬使不得!瀏覽器那點算力,經不起這百億級資料的折騰。
阿公的避坑法寶是:『後端要做重活,前端要裝優雅』。
如果能做到這一點,我們的系統效能就會變得非常優異:一般的查詢頁面載入時間會小於 3 秒,而 TOP N 圖表的重繪時間甚至會小於 1 秒!大掌櫃用起來,就像阿公泡的這杯熱茶,入口溫潤、流暢無比,再也不會氣得直跺腳了。
阿公今天就慢條斯理地講到這,大孫女聽懂了,可以開始動手試著寫寫看;小孫女聽累了,就在阿公藤椅旁瞇一會兒吧。大家寫程式,也一定要像理帳一樣,規規矩矩、不急不躁,才能寫出最穩定的好系統。