Back to Projects
data viz

33 → 1 → 3: Max Verstappen's F1 Career in Data

Three car numbers, 248 races, and a few things the data says that the usual story leaves out.

I'd already spent a lot of time with Formula 1 data for my race predictor, so this felt like a natural next step. But it's the opposite kind of project. The predictor looks forward and asks who will win on Sunday. This one looks back at a single career and asks what it actually looked like, race by race, without the hype in either direction.

Career stripes poster: one vertical stripe for each of Max Verstappen's 248 Grands Prix, coloured by finishing position, with wins in cream. The 2022 to 2024 section is almost solid cream.
Every Grand Prix he has started, one stripe each. Wins are cream, the rest go from yellow (P2) to deep red (P20), gray is a retirement. You can see the reign without reading a single number.

The title comes from his car numbers. He raced as #33 from 2015 to 2021, switched to #1 as reigning champion from 2022 to 2025, and runs #3 in 2026. That turned out to be a nice way to split the story: the rise, the reign, and whatever this season is.

248Grands Prix
71wins
4titles
134podiums

How it works

Two data sources, and they're very different things:

  • Jolpica-F1 (the community successor to the old Ergast API) is the results record: grid, finish, status, points, qualifying times, standings. It goes back to 1950, so it covers his whole career and also the careers of Schumacher, Senna and the rest.
  • FastF1 reads Formula 1's live-timing feed: every lap, tyre compound, safety car periods, telemetry. That data only exists from 2018, so anything lap-based starts there.

Everything is Python: pandas for the tables, Plotly for the charts, matplotlib for the poster. The chart colours come straight from this website's stylesheet, with Max in orange everywhere and everyone else in gray, so the eye goes where the story is.

Before drawing anything I wanted to know the numbers were right, so the first notebook compares my totals against the official record. Starts, wins, podiums, titles and career points all match exactly, including the points (3607.5), which only works if sprints, bonus points and half-points races are all handled properly. The one thing that didn't match was poles: my data has him fastest in qualifying 51 times against an official 48. The gap comes from grid penalties and the odd 2021 sprint weekends, where pole went to the sprint winner, and record-keepers don't agree on how to count those. So I count "fastest qualifier" instead and say so.

A few rules that matter more than they look

Sprints are stored separately and never count as wins. A retirement isn't "lost 15 places", it's a missing value. And every number on this page comes out of the pipeline into one file, so nothing here was typed in by hand.

What the data says

The whole career in one picture

Dot plot of his finishing position in every Grand Prix from 2015 to 2026. Midfield results early on, climbing to podiums, then a solid line of wins from 2022 to 2024, then back to mostly podiums.
Every race, P1 at the top. Wins in orange, retirements as crosses along the bottom, the line is a 10-race median.

Midfield, then podiums, then a long solid bar of wins, then podiums again. The shape is so clear that this is the chart I'd show if I could only show one.

Four titles, two of them on a knife-edge

Small multiples of cumulative championship points, one panel per season from 2015 to 2026. The 2021 and 2025 panels are shaded because they were decided by under 10 points.
Championship points round by round, one panel per season, same scale everywhere. Shaded seasons were decided by under 10 points.

2021 went his way by 8 points over Hamilton. 2025 went the other way: he finished 2 points behind Norris. That second one barely features when people talk about "the reign", but it's right there in the data. And in between, 2023 is almost silly: he won 19 of 22 races.

Among the greats

Cumulative wins against number of career starts for Verstappen, Hamilton, Schumacher, Vettel, Prost and Senna. Verstappen's line starts slowly and then rises more steeply than anyone's.
Cumulative wins by career start, so everyone is compared at the same stage of their career. The shaded strip is his best 50-race run.

This one surprised me. Comparing by career start rather than by year, after 248 starts Schumacher had 91 wins and Hamilton had 83. He has 71. So the "most dominant ever" line doesn't hold up on wins per start. What does hold up is the peak: his best run of 50 starts had 39 wins, against 31 for both Hamilton and Schumacher. Nobody on this chart has had a stretch like it.

Anatomy of one race: São Paulo 2024

Position of every driver on every lap of the 2024 São Paulo Grand Prix, with Max highlighted climbing from 17th on the grid to first. Safety car, virtual safety car and red flag periods are shaded. Below, his tyres: intermediates the whole race.
Running position every lap, lap 0 is the grid. Shaded laps were neutralised (safety car, VSC, red flag). The strip underneath is his tyres.

He started 17th in the rain and was already 11th after one lap. He made his only stop while the race was red-flagged, took the lead on lap 43 and kept it to the end of 69 laps, on intermediates the whole way. I picked this race because the position chart makes the climb visible in a way a results table never could.

#3: the reset

Three panels comparing 2022 to 2026: finishing positions, qualifying gap to the fastest qualifier, and race-pace gap. 2026 is slower on every measure. A bottom panel shows 2026 race by race, with results improving in the second half.
2026 against the reign years. Bottom panel: this season race by race, with his finishing position printed above each round.

The new rules haven't been kind so far. After 15 races he has no wins, 7 podiums and sits 6th in the championship. His median qualifying gap to the fastest qualifier is 0.50%, where in 2023 it was zero. But the second half of the season looks better than the first, and his last three finishes were P3, P2, P2. This is the one chapter that keeps changing: one command pulls the new race and rebuilds every chart.

Things I got wrong along the way

  • Winning margin is a bad measure of dominance. My first idea was the gap to second place. But his median winning margin in 2023 was smaller than in 2021, because once you're that far ahead you manage the gap instead of stretching it. I dropped the chart.
  • A finished chart that said nothing. I built one for positions gained on lap one, then noticed it mostly measured where he started (from pole you can only lose places). Cut it.
  • A line that lied. My first career timeline counted retirements as P20 in the rolling average, so 2017 looked like a collapse in form. It was retirements, not slow driving. They get their own row now.
  • Plotly quietly dropping things. Rows missing from a heatmap because it read the years as numbers, shading that never appeared in a subplot. None of that throws an error. You only catch it by looking at every chart.

Limits worth knowing

Finishing position mixes the driver with the car, so a P5 in a slow car can be a better drive than a win in a fast one. Retirement causes from 2024 on aren't recorded in the data (it just says "Retired"), so those are shown as unknown rather than guessed. And 2026 is half a season.

Data to the 2026 Azerbaijan Grand Prix (round 15, 26 September 2026). Data from Jolpica-F1 and FastF1. This is an unofficial project and isn't associated in any way with Formula 1.