後端工程 Portfolio

CPBL Analytics

從零打造的棒球數據系統

雙資料源 ETL、RESTful API、互動式 Dashboard、自動化 CI/CD

377
場比賽
112K
逐球事件
13
API Endpoints
168
測試
84%
覆蓋率
每日
自動更新

球員查詢

輸入球員名稱查看個人分析

工程架構

CPBL 官網 API
POST /getlive
Python ETL
合併 + 驗證 + 冪等寫入
SQLite (WAL)
9 tables / 140K rows
分析引擎
4 模組 + 6 計算腳本
242 JSON
靜態匯出
Cloudflare Pages
Global CDN
GitHub Actions 每日 06:00 (台灣) 自動執行完整管線

Key Technical Decisions

為什麼用 SQLite?

14 萬行資料,SQLite 綽綽有餘且零維護。WAL mode 支持讀寫並行。

為什麼分 batter_box 和 PA 兩層?

彙總表(AVG/OPS)和事件表(RE24/Clutch)粒度不同。batter_box 還有來源獨有的 LOB 欄位。

雙資料源怎麼合併?

用 (game_date, home_team, away_team) 做 game-level 對齊。CPBL 缺 player_id,建 player_mapping 表對照。

為什麼靜態 JSON 不用即時 API?

棒球資料每日只更新一次。靜態匯出 = CDN 分發,零伺服器成本,延遲 < 50ms。

冪等 ETL 怎麼做?

INSERT OR IGNORE + UNIQUE constraint。重跑不會產生重複資料。

小樣本怎麼處理?

min_pa/min_ip 動態門檻:賽季初鬆(PA≥20),滿季收緊(PA≥50)。

Tech:Python 3.12|FastAPI|SQLAlchemy|SQLite|ECharts|Tailwind|Docker|GitHub Actions|Cloudflare Pages