Who can still win the drivers WDC?

Calculates which drivers still has chance to win the WDC. Simplified since it doesn’t compare positions if points are equal.

This example implements 3 functions that it then uses to calculate its result.

import fastf1
from fastf1.ergast import Ergast

For this example, we are looking at the 2023 season. We want to know who can theoretically still win the drivers’ championship after the first 15 races.

SEASON = 2023
ROUND = 15

Get the current driver standings from Ergast. Reference https://theoehrly.github.io/Fast-F1-Pre-Release-Documentation/ergast.html#fastf1.ergast.Ergast.get_driver_standings

def get_drivers_standings():
    ergast = Ergast()
    standings = ergast.get_driver_standings(season=SEASON, round=ROUND)
    return standings.content[0]

We need a function to calculates the maximum amount of points possible if a driver wins everything left of the season. https://en.wikipedia.org/wiki/List_of_Formula_One_World_Championship_points_scoring_systems

def calculate_max_points_for_remaining_season():
    POINTS_FOR_SPRINT = 8 + 25 + 1  # Winning the sprint, race and fastest lap
    POINTS_FOR_CONVENTIONAL = 25 + 1  # Winning the race and fastest lap

    events = fastf1.events.get_event_schedule(SEASON, backend='ergast')
    events = events[events['RoundNumber'] > ROUND]
    # Count how many sprints and conventional races are left
    sprint_events = len(events.loc[events["EventFormat"] == "sprint_shootout"])
    conventional_events = len(events.loc[events["EventFormat"] == "conventional"])

    # Calculate points for each
    sprint_points = sprint_events * POINTS_FOR_SPRINT
    conventional_points = conventional_events * POINTS_FOR_CONVENTIONAL

    return sprint_points + conventional_points

For each driver we will see if there is a chance to get more points than the current leader. We assume the leader gets no more points and the driver gets the theoretical maximum amount of points.

We currently don’t consider the case of two drivers getting equal points since its more complicated and would require comparing positions.

def calculate_who_can_win(driver_standings, max_points):
    LEADER_POINTS = int(driver_standings.loc[0]['points'])

    for i, _ in enumerate(driver_standings.iterrows()):
        driver = driver_standings.loc[i]
        driver_max_points = int(driver["points"]) + max_points
        can_win = 'No' if driver_max_points < LEADER_POINTS else 'Yes'

        print(f"{driver['position']}: {driver['givenName'] + ' ' + driver['familyName']}, "
              f"Current points: {driver['points']}, "
              f"Theoretical max points: {driver_max_points}, "
              f"Can win: {can_win}")

Now using the 3 functions above we can use them to calculate who can still win.

# Get the current drivers standings
driver_standings = get_drivers_standings()

# Get the maximum amount of points
points = calculate_max_points_for_remaining_season()

# Print which drivers can still win
calculate_who_can_win(driver_standings, points)
1: Max Verstappen, Current points: 374.0, Theoretical max points: 580, Can win: Yes
2: Sergio Pérez, Current points: 223.0, Theoretical max points: 429, Can win: Yes
3: Lewis Hamilton, Current points: 180.0, Theoretical max points: 386, Can win: Yes
4: Fernando Alonso, Current points: 170.0, Theoretical max points: 376, Can win: Yes
5: Carlos Sainz, Current points: 142.0, Theoretical max points: 348, Can win: No
6: Charles Leclerc, Current points: 123.0, Theoretical max points: 329, Can win: No
7: George Russell, Current points: 109.0, Theoretical max points: 315, Can win: No
8: Lando Norris, Current points: 97.0, Theoretical max points: 303, Can win: No
9: Lance Stroll, Current points: 47.0, Theoretical max points: 253, Can win: No
10: Pierre Gasly, Current points: 45.0, Theoretical max points: 251, Can win: No
11: Oscar Piastri, Current points: 42.0, Theoretical max points: 248, Can win: No
12: Esteban Ocon, Current points: 36.0, Theoretical max points: 242, Can win: No
13: Alexander Albon, Current points: 21.0, Theoretical max points: 227, Can win: No
14: Nico Hülkenberg, Current points: 9.0, Theoretical max points: 215, Can win: No
15: Valtteri Bottas, Current points: 6.0, Theoretical max points: 212, Can win: No
16: Guanyu Zhou, Current points: 4.0, Theoretical max points: 210, Can win: No
17: Yuki Tsunoda, Current points: 3.0, Theoretical max points: 209, Can win: No
18: Kevin Magnussen, Current points: 3.0, Theoretical max points: 209, Can win: No
19: Liam Lawson, Current points: 2.0, Theoretical max points: 208, Can win: No
20: Logan Sargeant, Current points: 0.0, Theoretical max points: 206, Can win: No
21: Nyck de Vries, Current points: 0.0, Theoretical max points: 206, Can win: No
22: Daniel Ricciardo, Current points: 0.0, Theoretical max points: 206, Can win: No

Total running time of the script: (0 minutes 4.680 seconds)

Gallery generated by Sphinx-Gallery