後端工程 Portfolio

CPBL Analytics

從零打造的棒球數據系統

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

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

分析模組

8 個進階數據分析
投手
打者

數據分析文章

7 篇深度解析

工程架構

Rebas Open Data
JSON / GitHub
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 支持讀寫並行。規模長大後可遷 PostgreSQL。

為什麼分 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。重跑不會產生重複資料,CI/CD 每日安全執行。

小樣本怎麼處理?

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

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