{"id":50680028,"url":"https://github.com/Casper-Guo/Armchair-Strategist","last_synced_at":"2026-06-25T16:01:14.403Z","repository":{"id":54330217,"uuid":"522035763","full_name":"Casper-Guo/Armchair-Strategist","owner":"Casper-Guo","description":"Strategy dashboard for all F1 races since 2018","archived":false,"fork":false,"pushed_at":"2026-05-25T00:01:17.000Z","size":389928,"stargazers_count":88,"open_issues_count":5,"forks_count":4,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-05-25T02:12:26.501Z","etag":null,"topics":["data-visualization","f1","formula1","python"],"latest_commit_sha":null,"homepage":"https://armchair-strategist.dev/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Casper-Guo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-08-06T19:26:05.000Z","updated_at":"2026-05-25T00:01:21.000Z","dependencies_parsed_at":"2024-11-04T05:17:16.131Z","dependency_job_id":"0bed1b6e-fa3f-433c-b20c-cd1dae0105b6","html_url":"https://github.com/Casper-Guo/Armchair-Strategist","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Casper-Guo/Armchair-Strategist","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Casper-Guo%2FArmchair-Strategist","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Casper-Guo%2FArmchair-Strategist/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Casper-Guo%2FArmchair-Strategist/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Casper-Guo%2FArmchair-Strategist/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Casper-Guo","download_url":"https://codeload.github.com/Casper-Guo/Armchair-Strategist/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Casper-Guo%2FArmchair-Strategist/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34782137,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-25T02:00:05.521Z","response_time":101,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["data-visualization","f1","formula1","python"],"created_at":"2026-06-08T18:00:31.969Z","updated_at":"2026-06-25T16:01:14.388Z","avatar_url":"https://github.com/Casper-Guo.png","language":"Python","funding_links":[],"categories":["Formula 1"],"sub_categories":["Dashboards and Analytics"],"readme":"# Armchair Strategist\n\n[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)\n\nThis repository contains all the code for the [armchair strategist dashboard](www.armchair-strategist.dev) as well as engineered data for F1 races from the 2018 season onwards.\n\nThe visualizations in this README are automatically updated to reflect the latest race.\n\n## Visualizations of the Most Recent Race\n\n\u003cdetails\u003e\n    \u003csummary\u003e\n        \u003cb\u003ePit Stop Strategies\u003c/b\u003e\n    \u003c/summary\u003e\n    \u003cimg src=\"Docs/visuals/strategy.png\", alt=\"strategy\"\u003e\n    \u003cdetails\u003e\n        \u003csummary\u003e\n            \u003cb\u003eFunction call:\u003c/b\u003e\n        \u003c/summary\u003e\n        \u003ccode\u003estrategy_barplot(season, event, session_type)\u003c/code\u003e\n    \u003c/details\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n    \u003csummary\u003e\n        \u003cb\u003ePosition Changes\u003c/b\u003e\n    \u003c/summary\u003e\n    \u003cimg src=\"Docs/visuals/position.png\" alt=\"position\"\u003e\n    \u003cdetails\u003e\n        \u003csummary\u003e\n            \u003cb\u003eFunction call:\u003c/b\u003e\n        \u003c/summary\u003e\n        \u003ccode\u003edriver_stats_scatterplot(season, event, session_type)\u003c/code\u003e\n    \u003c/details\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n    \u003csummary\u003e\n        \u003cb\u003ePoint Finishers Race Pace\u003c/b\u003e\n    \u003c/summary\u003e\n    \u003cimg src=\"Docs/visuals/laptime.png\" alt=\"laptime\"\u003e\n    \u003cdetails\u003e\n        \u003csummary\u003e\n            \u003cb\u003eFunction call:\u003c/b\u003e\n        \u003c/summary\u003e\n        \u003ccode\u003estrategy_barplot(season, event, session_type, drivers=10)\u003c/code\u003e\n    \u003c/details\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n    \u003csummary\u003e\n        \u003cb\u003eFuel-adjusted lap times\u003c/b\u003e\n    \u003c/summary\u003e\n    \u003cimg src=\"Docs/visuals/fuel_adjusted.png\" alt=\"fuel_adjusted\"\u003e\n    \u003cdetails\u003e\n        \u003csummary\u003e\n            \u003cb\u003eFunction call:\u003c/b\u003e\n        \u003c/summary\u003e\n        \u003ccode\u003edriver_stats_scatterplot(season, event, session_type, drivers=10, y=\"FuelAdjLapTime\")\u003c/code\u003e\n    \u003c/details\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n    \u003csummary\u003e\n        \u003cb\u003ePodium Finishers Gap to Winner\u003c/b\u003e\n    \u003c/summary\u003e\n    \u003cimg src=\"Docs/visuals/podium_gap.png\" alt=\"podium gap\"\u003e\n    \u003cdetails\u003e\n        \u003csummary\u003e\n            \u003cb\u003eFunction call:\u003c/b\u003e\n        \u003c/summary\u003e\n        \u003ccode\u003e\n            add_gap(winner, modify_global=True, season, session_type)\n            \u003cbr\u003e\n            driver_stats_lineplot(season, event, session_type, drivers=3, y=\"GapTo{winner}\")\n        \u003c/code\u003e\n    \u003c/details\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n    \u003csummary\u003e\n        \u003cb\u003eRace Trace to Winner Average Pace\u003c/b\u003e\n    \u003c/summary\u003e\n    \u003cimg src=\"Docs/visuals/race_trace.png\" alt=\"race trace\"\u003e\n    \u003cdetails\u003e\n        \u003csummary\u003e\n            \u003cb\u003eFunction call:\u003c/b\u003e\n        \u003c/summary\u003e\n        \u003ccode\u003e\n            add_gap(winner, modify_global=True, distribute_pit_loss=True, season, session_type)\n            \u003cbr\u003e\n            driver_stats_lineplot(season, event, session_type, drivers=3, y=\"GapTo{winner}Pace\")\n        \u003c/code\u003e\n    \u003c/details\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n    \u003csummary\u003e\n        \u003cb\u003eTeammate Pace Comparisons\u003c/b\u003e\n    \u003c/summary\u003e\n    Boxplot visualization:\n    \u003cimg src=\"Docs/visuals/teammate_box.png\" alt=\"teammate pace boxplot\"\u003e\n    \u003cdetails\u003e\n        \u003csummary\u003e\n            \u003cb\u003eFunction call:\u003c/b\u003e\n        \u003c/summary\u003e\n        \u003ccode\u003edriver_stats_distplot(season, event, session_type, violin=False, swarm=False, teammate_comp=True)\u003c/code\u003e\n    \u003c/details\u003e\n    Violinplot with all laptimes:\n    \u003cimg src=\"Docs/visuals/teammate_violin.png\" alt=\"teammate pace violinplot\"\u003e\n    \u003cdetails\u003e\n        \u003csummary\u003e\n            \u003cb\u003eFunction call:\u003c/b\u003e\n        \u003c/summary\u003e\n        \u003ccode\u003edriver_stats_distplot(season, event, session_type, teammate_comp=True)\u003c/code\u003e\n    \u003c/details\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n    \u003csummary\u003e\n        \u003cb\u003eDriver Pace Comparison\u003c/b\u003e\n    \u003c/summary\u003e\n    \u003cimg src=\"Docs/visuals/driver_pace.png\" alt=\"driver pace comparison\"\u003e\n    \u003cdetails\u003e\n        \u003csummary\u003e\n            \u003cb\u003eFunction call:\u003c/b\u003e\n        \u003c/summary\u003e\n        \u003ccode\u003edriver_stats_distplot(season, event, session_type)\u003c/code\u003e\n    \u003c/details\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n    \u003csummary\u003e\n        \u003cb\u003eTeam Pace Ranking\u003c/b\u003e\n    \u003c/summary\u003e\n    \u003cimg src=\"Docs/visuals/team_pace.png\" alt=\"team pace comparison\"\u003e\n    \u003cdetails\u003e\n        \u003csummary\u003e\n            \u003cb\u003eFunction call:\u003c/b\u003e\n        \u003c/summary\u003e\n        See \u003ccode\u003ereadme_machine.py\u003c/code\u003e\n    \u003c/details\u003e\n\u003c/details\u003e\n\n## Build\nBuild with `pip install -e .` Using a Python virtual environment is highly recommended.\n\n## [Dashboard](www.armchair-strategist.dev)\nRun dashboard locally with `python3 app.py`. Debug mode can be enabled by setting `app.run(debug=True)` in `app.py`.\n\n## Contributing\nYou should install pre-commit hooks with `pre-commit install`.\n\n## Data Source\n\nAll data sourced from the [FastF1](https://github.com/theOehrly/Fast-F1) package.\n\n## Data Availability\n\nData from all grand prixs and sprint races beginning in the 2018 season, excluding test sessions, are available. This repository will be automatically updated during the F1 season.\n\n## Metrics Definitions\n\nSee `SCHEMA.md` for details on the columns provided in `Data/all_laps_*.csv` and `Data/transformed_laps_*.csv` files.\n\n## Additional Examples\n\u003cdetails\u003e\n    \u003csummary\u003e\n        \u003cb\u003eTyre Degradation Lineplot\u003c/b\u003e\n    \u003c/summary\u003e\n    \u003cimg src=\"Docs/examples/tyre_line.png\"\u003e\n    \u003cdetails\u003e\n        \u003csummary\u003e\n            \u003cb\u003eFunction call:\u003c/b\u003e\n        \u003c/summary\u003e\n        \u003ccode\u003ecompounds_lineplot(seasons, events)\u003c/code\u003e\n    \u003c/details\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n    \u003csummary\u003e\n        \u003cb\u003eTyre Degradation Distribution Plot\u003c/b\u003e\n    \u003c/summary\u003e\n    \u003cimg src=\"Docs/examples/tyre_dist.png\"\u003e\n    \u003cdetails\u003e\n        \u003csummary\u003e\n            \u003cb\u003eFunction call:\u003c/b\u003e\n        \u003c/summary\u003e\n        \u003ccode\u003ecompounds_distplot(seasons, events)\u003c/code\u003e\n    \u003c/details\u003e\n\u003c/details\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FCasper-Guo%2FArmchair-Strategist","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FCasper-Guo%2FArmchair-Strategist","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FCasper-Guo%2FArmchair-Strategist/lists"}