BikeControl (SwiftControl)
使用 Zwift Click、Zwift Play、Shimano Di2 或任何藍牙控制器,搭配 MyWhoosh、Rouvy、Zwift 等。iOS、Android、Windows、macOS 均可免費試用。
AI 翻译
Stage-by-stage GC, sprint and KOM analytics for the Tour de France, Giro d'Italia and Vuelta a España, plus 11 one-day monuments and classics and 6 American gravel and MTB races — 1892–2026.
翻译准备中
运动与健身Python · TypeScriptGitHub @eshiflet在线运营者未确认
试用过了吗? 点一下就好,无需登录。
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Stage-by-stage cycling analytics: the Tour de France, Giro d'Italia and Vuelta a España, 11 one-day classics and 7 gravel races — 1892 to 2026, 786,787 results
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
Stage-by-stage results for professional road cycling, charted — every edition of the Tour de France, the Giro d'Italia and the Vuelta a España, eleven one-day classics, and seven gravel and mountain-bike races. Every value is traced to a source in data_provenance. DATA_SOURCES.md lists each one — procyclingstats, bikeraceinfo, cyclingflash, Athlinks, sportmaniacs, tretzesports — with its URLs, how to reach it, and what it is and is not good for.查看完整 README ↗
Stage-by-stage results for professional road cycling, charted — every edition of the Tour de France, the Giro d'Italia and the Vuelta a España, eleven one-day classics, and seven gravel and mountain-bike races.
Live: ericshiflet.com/tdf-analytics
21 races · 1,365 race-years · 1892–2026 · 19,023 riders · 786,870 stage results
Every value is traced to a source in data_provenance. DATA_SOURCES.md lists each one — procyclingstats, bikeraceinfo, cyclingflash, Athlinks, sportmaniacs, tretzesports — with its URLs, how to reach it, and what it is and is not good for.
| path | what it holds |
|---|---|
cycling-app/ | the site: TypeScript, D3, Vite. No framework. Deployed to GitHub Pages. |
cycling-app/src/data/ | exported JSON, one file per race-year — what the site actually loads |
pipeline/ | scrapers, ingest, validators and exporters (Python, standard library only) |
pipeline/*_scrapes/ | raw scraped JSON, tracked in git — the source of truth |
ai-context.md | the long-form record: every defect found, why it happened, what the fix was |
architecture.md | data model, module map, CI/CD flow |
cycling.db is not in git and not regenerable from scratch — some values
in it came from sources that no longer answer. Back it up with
python3 pipeline/db_backup.py.
cd cycling-app && npm install && npm run dev # the site, on :5173
cd pipeline && python3 -m unittest discover -p 'test_*.py'
The pipeline needs no dependencies at all — Python 3 and the standard library. The site needs Node 20.
A typical data change is scrape → ingest → export → validate:
python3 scrape_race.py --race tour 1985 # writes tour_scrapes/1985/
python3 preview_reingest.py --race tour 1985 # what the ingest WOULD change
python3 ingest_race.py --race tour 1985
python3 export_gc.py --race tdf --year 1985
python3 validate_db.py && python3 validate_exports.py
preview_reingest.py is worth the habit: it copies the database, ingests into
the copy and reports the diff, counting fills, overwrites and clears
separately. A rebuild that loses rows is the one to stop for.
Cycling data is wrong in quiet ways. A parser that stops matching returns nothing, which becomes a NULL column and a blank chart rather than an error — so the failures here are silent by default, and most of them look plausible. Some real examples, all fixed:
21:47.870 and the pattern allowed no fraction.ai-context.md records each one with the evidence, because the expensive part
is never the fix — it is working out that anything is wrong.
Results come from procyclingstats.com, with
Wikipedia and bikeraceinfo.com used to cross-check distances and classification
totals. Every stored value carries provenance: data_provenance records the
source and the URL for each field, and unknown is a real answer that means
nobody recorded where a number came from.