Project contents
← Where the Action Actually Happens at F1 GPs
Updates
Where the Action Actually Happens at F1 GPs
Every update on this project, newest first.
Updates are bullet-point summaries generated with AI from my commits and build notes, then checked by me. Project articles and learning notes are written by me.
-
- The one-year circuit can’t fail a denominator test, since dividing by one changes nothing. Only the three-year circuit now counts as evidence for averaging checks.
- Replaced the comparison script. It never compared
race_phases, sorted lists the code deliberately orders, and keyed grandstands by the non-unique code. The new one compares every field and requires accepted differences to be declared. - Froze the old pipeline’s output in
baseline/, pinned to a commit, so validation doesn’t end up comparing the database with itself after cutover. Widened validation from 195 to 525 keys and confirmed the checks can fail. - Resolved a suspected unzoned incident (zones 7/7/7 against a total of 8). The zones overlap, so nothing was wrong.
- Added a
source_incidentstable: the circuit summary counts spreadsheet rows, not row and section pairs, and one 2023 row with no section could not be recovered fromincidents. - See Five verification failures.
-
- Rewrote the global rankings as three SQL queries plus a Python pass. 31 corners and 14 straights matched the old output exactly. The only grandstand differences were nine floating point artefacts the old code had been shipping, such as
14.399999999999999. ORDER BY g.grandstand_id, gv.rowidreproduced the old list ordering with zero differences across 29 grandstands.- Grandstand lookups were keyed by
code, which is only unique per circuit. Forcing a collision merged two grandstands (28 instead of 29). Now keyed bygrandstand_id, changed in a single commit, because the halfway state deleted a grandstand instead. - The circuit page, still on the old pipeline, listed two spreadsheet typos as straights that the new rankings page correctly dropped. Fixed the typos in the source workbook rather than rushing the migration.
- Those typos were cells showing
9-10that held dates under ad\-mnumber format. Set them to strings with Text format; database validation went to 0 mismatches. - See Migrating by predicted diffs.
- Rewrote the global rankings as three SQL queries plus a Python pass. 31 corners and 14 straights matched the old output exactly. The only grandstand differences were nine floating point artefacts the old code had been shipping, such as
-
- First run of the SQL loader: four transcription errors that each failed loudly, and one that didn’t. The incident insert sat inside a loop that skips crash sheets, so
is_crashwas false for every row while the load reported success. Split the loader into two passes.
- First run of the SQL loader: four transcription errors that each failed loudly, and one that didn’t. The incident insert sat inside a loop that skips crash sheets, so
-
- Changed the per-corner average to divide by every race year, not only the years a corner had action. A quiet year is a result, not missing data. Singapore corner 5 went from 3.0 to 2.0.
avg_lapstill averages only the years present, because a quiet year has no lap. The two rules are separate named functions with docstrings.- See A quiet year is zero.