尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證F1 race weekend companion: session-by-session replay, charts and (soon) predictions, built on FastF1
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗A companion app that follows a Formula 1 weekend session by session. After each session (FP1 → FP2 → FP3 → Qualifying, and Sprint sessions on sprint weekends) it refreshes the charts and updates a prediction of the race result - for a past weekend replayed step by step, or for a live weekend before its race.
Status: Day 3 of a 3-day build. Built: data pipeline, replay and live weekends, per-session
charts, race prediction with a backtest, race-result view, generated commentary, a "race starts soon"
banner, and a new website for a general F1 audience (web/, Next.js on Vercel). The original
Streamlit app is kept in the repo but is no longer deployed.
Two front ends read the same data:
web/, static Next.js, deployed on Vercel): the fan-facing version and the only one
published. 2026 weekends only, a start-light timeline with autoplay, plain-language explanations,
race-control style commentary, and a "lights out" race reveal. See web/README.md.app.py): the original analysis view, including earlier seasons' data and the
backtest charts. Taken offline on 2026-10-27, now that the website covers the same ground; the
code is kept and still runs locally with streamlit run app.py.Four predictors, and Auto (the default) picks between them:
Percentages come from simulating the race 20,000 times, with retirement chances per team and uncertainty sized - and, for the baseline and Grid + recovery, shaped (wider before Qualifying, tighter for the front six after it) - from each predictor's own past mistakes. Full description: docs/model.md.
Scored on the first 15 races of 2026 (R1-R15), each predicted using only what was known at the time (expanding-window backtest). After Qualifying:
| Order (Spearman ↑) | Winner log-loss ↓ | Podium Brier ↓ | Whole-grid RPS ↓ | |
|---|---|---|---|---|
| Baseline | 0.697 | 0.78 | 0.070 | 0.108 |
| Grid + recovery | 0.709 | 0.75 | 0.070 | 0.107 |
| Auto (default) | 0.704 | 0.745 | 0.069 | 0.108 |
| Ridge, all seasons | 0.699 | 1.18 | 0.075 | 0.110 |
| Ridge, same season | 0.692 | 1.34 | 0.068 | 0.110 |
The model is frozen at tag frozen-2026-r15b; races from R16 on are an untouched holdout
(results in docs/evaluation.md).
2026 has been unusually qualifying-dominated, so beating the grid order is hard; over 2023-26 the
models' edges are larger and significant (e.g. Grid + recovery +0.018 after Qualifying). What each
score means, all stages, and how differences are judged: docs/evaluation.md.
pip install -r requirements.txt
streamlit run app.py
The app reads only the files in data/; it needs neither FastF1 nor network access.
pip install -r requirements-dev.txt
python scripts/auto_update.py --push # pull what's due, re-score, re-export, publish
auto_update.py runs the steps below for any session that finished 30 minutes ago (the race, 60)
and does nothing if none has. Put it on a timer during a weekend — see
docs/season-checklist.md for the cron line and its caveats. To run the
steps yourself:
python scripts/backfill.py --years 2026 --in-progress # during a weekend: sessions run so far
python scripts/backfill.py --years 2026 # after the race
python scripts/backtest.py # re-score and re-predict
python scripts/export_site.py # refresh the website's data
python -m pytest tests
Then commit data/ and push; the deployed app reloads its code on its own. The full routine,
traps (rate limits, pulling too early, offline rebuilds) and what to re-check through the season:
docs/season-checklist.md.
| Document | Contents |
|---|---|
| docs/model.md | Pipeline diagram, every input, the predictors, how percentages are made, data rules, settings |
| docs/evaluation.md | The backtest, every metric with formulas and worked examples, significance rules, current results |
| docs/experiments.md | Everything tried - kept and rejected - with numbers |
| docs/faq.md | Concepts and questions (methods, Auto, grid vs qualifying, the data) |
| docs/season-checklist.md | Weekly routine, periodic re-checks, end-of-season tasks, ideas not built yet |
web/ website (Next.js static export for Vercel) - see web/README.md
app.py Streamlit app (presentation only)
f1cc/data.py FastF1 access, event-match guard, live-session timing
f1cc/features.py per-driver-per-session features from FastF1 sessions
f1cc/store.py parquet storage in data/, starting grids
f1cc/replay.py replay cutoff: which sessions are visible
f1cc/charts.py Plotly figures (no Streamlit inside)
f1cc/predict/ feature matrix, baseline, recovery, ridge, simulation
f1cc/backtest_summary.py summaries, significance, Auto
f1cc/commentary.py commentary sentences built only from computed numbers at each cutoff
f1cc/site_export.py stored data -> JSON for the website (race result kept in a separate file)
scripts/backfill.py pull sessions from FastF1 into data/
scripts/backtest.py backtest + stored predictions
scripts/export_site.py write the website's JSON (web/data, web/public/data)
scripts/auto_update.py scheduled: pull finished sessions, re-score, re-export, optionally push
scripts/build_overtakes.py on-track overtakes per race (circuit overtaking ease)
scripts/experiments/ reusable experiments (season trend, feature retest, chained model)
tests/ leakage, data integrity, freshness, app smoke tests
docs/season-checklist.md). Nothing in data/ depends on this — the deployed app and the
website read only committed files, so both run with no account and no network.Unofficial fan project. Not affiliated with or endorsed by Formula 1, the FIA, or any team.