iT邦幫忙

2026 iThome 鐵人賽

DAY 10
0
佛心分享-IT 人自學之術

老爺爺練習VIBE CODING系列 第 10

Day 10:百億級財務分析:用 Plotly Dash 打造會計科目差異分析儀表板

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20260828/200709694gvbkaVFgR.png
夕陽正紅,將整座鄉下的小院子染上一片溫柔的晚霞暮紫

阿公端起剛泡好、散發著清香的琥珀熱茶,笑瞇瞇地看著你們兩個。大孫女懂事,正安靜地坐在一旁幫阿公搥背;小孫女還是那樣愛撒嬌,揪著阿公這身舊衣角不肯放。阿公摸了摸自己這頭白髮銀霜,靠在椅背呈藤椅深棕的舊椅上,慢條斯理地說:

「大孫女常跟阿公說,現在城裡做什麼大企業的審計,動不動就是幾十億、上百億的帳目,看 Excel 看得頭都要暈了。阿公雖然年紀大、說話慢,但以前幫那些大掌櫃理帳時,可也見過不少風浪。幾十億的帳目,就跟院子裡的沙礫一樣,如果不理順了,看著當然眼睛花、頭疼得緊。」

「來,大孫女、小孫女,還有各位正在跟著阿公學習的孩子們,大家坐好。今天阿公一邊喝茶,一邊給你們慢慢講講這 Day 10 的課程:如何用 Python 搭配 Plotly Dash,打造一套百億級會計科目差異分析儀表板。」


🚨 痛點場景:密密麻麻的 Excel 螞蟻迷宮

乖孫女啊,你們想想,期末審計或者大掌櫃要下管理決策時,最重要的事情之一,就是比對 「開帳(Opening Balance,期初餘額)」與「結帳(Closing Balance,期末餘額)」 之間的會計科目波動。

企業裡的會計科目有上百個,金額更是動輒幾十億、上百億。以前那些分析人員,總是把這上百個科目、密密麻麻的數字,全部塞在 Excel 報表裡。那密密麻麻的數字,看起來就像一窩黑色的小螞蟻在白紙上爬。大掌櫃年紀比阿公還大,拿著放大鏡看到眼睛發酸,也根本找不到哪裡有異常波動

如果帳目有大額的異常虧空,或者科目波動超出了預設的「警戒線(閾值)」,而在密密麻麻的 Excel 裡沒看出來,那可是要出大問題的。這就是我們為什麼非要用科技,把它們變成人人看得懂的圖表。


🛠️ 架構實作:用 Plotly Dash 建立會計科目分析平台

為了解決這個痛點,阿公教你們用 Python 搭配 Plotly Dash 框架,來建置一個專門給財務和會計主管使用的互動式財務分析平台。這個平台只提供唯讀分析,不牽涉到修改傳票或異動帳務,這樣對公司的資安和財務控制是最保險的。

阿公把它的實作架構,給你們拆解成三個核心層次:

1. 資料底座與 LTV 關聯邏輯

在資料庫裡,阿公設計了兩張主要的資料表:

  • 會計科目主檔(dim_account:記錄會計科目代碼、會計科目名稱,以及科目分類。
  • 餘額事實表(fact_balance:記錄每個會計科目代碼在各個日期的期初與期末金額。

大企業的交易明細千絲萬縷,我們需要使用 LTV(Ledger-to-Value)比對邏輯,將交易明細與科目主檔進行關聯,並在後端用 Pandas 算出每個科目的 「差異金額」(期末金額 − 期初金額),這個差異金額有正有負,代表波動的方向。

2. 元件配置與「億元」換算

這百億級的數字,後面那一長串零,大掌櫃看了頭都暈。所以阿公一定要在系統裡加入 「元/億元」的單位切換功能
只要一轉換,金額全部換算成億元,預設保留 2 位小數,畫面看起來立刻變得乾乾淨淨、清清楚楚!

我們的畫面版面(Layout)上,有這幾個靈魂元件:

  • dcc.DatePickerRange:大掌櫃能自由拉動想查看的日期區間。
  • dcc.Dropdown:讓使用者過濾科目分類,調整 TOP N 的數量(比如只要看波動最大的前 5 名、10 名、20 名科目),以及進行金額單位切換。
  • dcc.Graph:這會幫我們畫出兩張動態圖表。一張是 TOP N 差異科目長條圖(依據差異金額絕對值從大到小排序,誰波動最劇烈一目了然);另一張是 差異趨勢折線圖,顯示科目隨日期區間的走勢變動。
  • dash_table.DataTable:這是一個好用的明細表格,支持篩選、排序和分頁。當主管在圖表上看到異常,點一下就能直接 下鑽(Drill-down) 到對應科目的交易明細。
  • html.Button + dcc.Download:大掌櫃和分析人員如果想把明細帶走,點一下按鈕,就能把明細表直接匯出成 CSV 或 Excel 檔案。

3. 控制拉線的木偶:回呼(Callback)設計

這系統能動,全靠 Python 後端的 Callback(回呼機制)。阿公把這控制關係,寫成了五個核心回呼:

  • CB-01 更新 KPI:當大掌櫃一改日期、科目分類或切換單位,畫面上方的 4 張 KPI 卡片(顯示總差異金額、最大正差異、最大負差異和異常科目數)會同步重算更新。
  • CB-02 更新 TOP N 圖:依據新條件重新繪製長條圖,抓出波動最大的前 N 筆科目。
  • CB-03 更新趨勢圖:即時更新折線圖,展現特定科目的歷史波動軌跡。
  • CB-04 更新明細表:將篩選後的資料送入 DataTable 渲染,維持畫面的最新狀態。
  • CB-05 匯出資料:監聽點擊事件,產生 Excel 或 CSV 的下載串流。

💡 避坑指南:別讓百億資料擠爆網頁前端

大孫女啊,你比較懂事,阿公接下來這段話你一定要記在心裡,這可是很多人寫程式會摔得鼻青臉腫的「坑」:

Plotly Dash 在處理大量資料時,如果 Callback 設計不當,網頁就會卡頓得一塌糊塗,大掌櫃的瀏覽器會直接當機、轉圈圈。

為什麼會這樣呢?因為很多人偷懶,把資料庫撈出來的幾百萬筆原始資料,通通透過網路送到前端網頁(也就是使用者的瀏覽器)裡,再用瀏覽器的 JavaScript 去做計算、過濾和排序。這可萬萬使不得!瀏覽器那點算力,經不起這百億級資料的折騰。

阿公的避坑法寶是:『後端要做重活,前端要裝優雅』。

  1. 在後端(Pandas / SQLAlchemy)完成資料聚合與計算
    所有繁重的 LTV 關聯比對、開結帳差異計算、TOP N 絕對值排序,通通要在後端的 Pandas 或資料庫(SQL Server/Oracle)裡計算完成。
  2. 前端只渲染經過過濾的少量數據
    後端算好之後,只把已經過濾、加總好的幾十列或幾百列「輕量級」結果,送到前端的 Dash 元件去畫圖和分頁。

如果能做到這一點,我們的系統效能就會變得非常優異:一般的查詢頁面載入時間會小於 3 秒,而 TOP N 圖表的重繪時間甚至會小於 1 秒!大掌櫃用起來,就像阿公泡的這杯熱茶,入口溫潤、流暢無比,再也不會氣得直跺腳了。


阿公今天就慢條斯理地講到這,大孫女聽懂了,可以開始動手試著寫寫看;小孫女聽累了,就在阿公藤椅旁瞇一會兒吧。大家寫程式,也一定要像理帳一樣,規規矩矩、不急不躁,才能寫出最穩定的好系統。


上一篇
Day 9:跨部門協同的時程管理:LCR 資料提供與預測的排程架構
系列文
老爺爺練習VIBE CODING10
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言