tracinginsights's picture
download
raw
8.98 kB
import json
import os
import fastf1
import numpy as np
import utils
fastf1.Cache.enable_cache("cache")
YEAR = 2021
def events_available(year: int) -> any:
# get events available for a given year
data = utils.LatestData(year)
events = data.get_events()
return events
events = [
'Abu Dhabi Grand Prix',
'Austrian Grand Prix',
'Azerbaijan Grand Prix',
'Bahrain Grand Prix',
'Belgian Grand Prix',
'British Grand Prix',
'Dutch Grand Prix',
'Emilia Romagna Grand Prix',
'French Grand Prix',
'Hungarian Grand Prix',
'Italian Grand Prix',
'Mexico City Grand Prix',
'Monaco Grand Prix',
'Portuguese Grand Prix',
'Qatar Grand Prix',
'Russian Grand Prix',
'Saudi Arabian Grand Prix',
'Spanish Grand Prix',
'Styrian Grand Prix',
'São Paulo Grand Prix',
'Turkish Grand Prix',
'United States Grand Prix',
]
def sessions_available(year: int, event: str | int) -> any:
# get sessions available for a given year and event
event = str(event)
data = utils.LatestData(year)
sessions = data.get_sessions(event)
return sessions
def session_drivers(year: int, event: str | int, session: str) -> any:
# get drivers available for a given year, event and session
import fastf1
f1session = fastf1.get_session(year, event, session)
f1session.load(telemetry=True, weather=False, messages=False)
laps = f1session.laps
team_colors = utils.team_colors(year)
# add team_colors dict to laps on Team column
laps["color"] = laps["Team"].map(team_colors)
unique_drivers = laps["Driver"].unique()
drivers = [
{
"driver": driver,
"team": laps[laps.Driver == driver].Team.iloc[0],
}
for driver in unique_drivers
]
return {"drivers": drivers}
def session_drivers_list(year: int, event: str | int, session: str) -> any:
# get drivers available for a given year, event and session
import fastf1
f1session = fastf1.get_session(year, event, session)
f1session.load(telemetry=True, weather=False, messages=False)
laps = f1session.laps
unique_drivers = laps["Driver"].unique()
return list(unique_drivers)
def laps_data(year: int, event: str | int, session: str, driver: str) -> any:
# get drivers available for a given year, event, and session
f1session = fastf1.get_session(year, event, session)
f1session.load(telemetry=False, weather=False, messages=False)
laps = f1session.laps
# add team_colors dict to laps on Team column
# for each driver in drivers, get the Team column from laps and get the color from team_colors dict
drivers_data = []
driver_laps = laps.pick_driver(driver)
driver_laps["LapTime"] = driver_laps["LapTime"].dt.total_seconds()
# remove rows where LapTime is null
driver_laps = driver_laps[driver_laps.LapTime.notnull()]
drivers_data = {
"time": driver_laps["LapTime"].tolist(),
"lap": driver_laps["LapNumber"].tolist(),
"compound": driver_laps["Compound"].tolist(),
}
return drivers_data
def accCalc(allLapsDriverTelemetry, Nax, Nay, Naz):
vx = allLapsDriverTelemetry["Speed"] / 3.6
time_float = allLapsDriverTelemetry["Time"] / np.timedelta64(1, "s")
dtime = np.gradient(time_float)
ax = np.gradient(vx) / dtime
for i in np.arange(1, len(ax) - 1).astype(int):
if ax[i] > 25:
ax[i] = ax[i - 1]
ax_smooth = np.convolve(ax, np.ones((Nax,)) / Nax, mode="same")
x = allLapsDriverTelemetry["X"]
y = allLapsDriverTelemetry["Y"]
z = allLapsDriverTelemetry["Z"]
dx = np.gradient(x)
dy = np.gradient(y)
dz = np.gradient(z)
theta = np.arctan2(dy, (dx + np.finfo(float).eps))
theta[0] = theta[1]
theta_noDiscont = np.unwrap(theta)
dist = allLapsDriverTelemetry["Distance"]
ds = np.gradient(dist)
dtheta = np.gradient(theta_noDiscont)
for i in np.arange(1, len(dtheta) - 1).astype(int):
if abs(dtheta[i]) > 0.5:
dtheta[i] = dtheta[i - 1]
C = dtheta / (ds + 0.0001) # To avoid division by 0
ay = np.square(vx) * C
indexProblems = np.abs(ay) > 150
ay[indexProblems] = 0
ay_smooth = np.convolve(ay, np.ones((Nay,)) / Nay, mode="same")
# for z
z_theta = np.arctan2(dz, (dx + np.finfo(float).eps))
z_theta[0] = z_theta[1]
z_theta_noDiscont = np.unwrap(z_theta)
dist = allLapsDriverTelemetry["Distance"]
ds = np.gradient(dist)
z_dtheta = np.gradient(z_theta_noDiscont)
for i in np.arange(1, len(z_dtheta) - 1).astype(int):
if abs(z_dtheta[i]) > 0.5:
z_dtheta[i] = z_dtheta[i - 1]
z_C = z_dtheta / (ds + 0.0001) # To avoid division by 0
az = np.square(vx) * z_C
indexProblems = np.abs(az) > 150
az[indexProblems] = 0
az_smooth = np.convolve(az, np.ones((Naz,)) / Naz, mode="same")
allLapsDriverTelemetry["Ax"] = ax_smooth
allLapsDriverTelemetry["Ay"] = ay_smooth
allLapsDriverTelemetry["Az"] = az_smooth
return allLapsDriverTelemetry
def telemetry_data(year, event, session: str, driver, lap_number):
f1session = fastf1.get_session(year, event, session)
f1session.load(telemetry=True, weather=False, messages=False)
laps = f1session.laps
driver_laps = laps.pick_driver(driver)
driver_laps["LapTime"] = driver_laps["LapTime"].dt.total_seconds()
# get the telemetry for lap_number
selected_lap = driver_laps[driver_laps.LapNumber == lap_number]
telemetry = selected_lap.get_telemetry()
acc_tel = accCalc(telemetry, 3, 9, 9)
acc_tel["Time"] = acc_tel["Time"].dt.total_seconds()
laptime = selected_lap.LapTime.values[0]
# data_key = f"{driver} - Lap {int(lap_number)} - {year} - {session} - [{laptime}]"
data_key = f"{year}-{event}-{session}-{driver}-{lap_number}"
acc_tel["DRS"] = acc_tel["DRS"].apply(lambda x: 1 if x in [10, 12, 14] else 0)
acc_tel["Brake"] = acc_tel["Brake"].apply(lambda x: 1 if x == True else 0)
telemetry_data = {
"tel": {
"time": acc_tel["Time"].tolist(),
"rpm": acc_tel["RPM"].tolist(),
"speed": acc_tel["Speed"].tolist(),
"gear": acc_tel["nGear"].tolist(),
"throttle": acc_tel["Throttle"].tolist(),
"brake": acc_tel["Brake"].tolist(),
"drs": acc_tel["DRS"].tolist(),
"distance": acc_tel["Distance"].tolist(),
"rel_distance": acc_tel["RelativeDistance"].tolist(),
"acc_x": acc_tel["Ax"].tolist(),
"acc_y": acc_tel["Ay"].tolist(),
"acc_z": acc_tel["Az"].tolist(),
"x": acc_tel["X"].tolist(),
"y": acc_tel["Y"].tolist(),
"z": acc_tel["Z"].tolist(),
"dataKey": data_key,
}
}
return telemetry_data
# Your list of events
events_list = events
# Loop through each event
for event in events_list:
# Get sessions for the current event
sessions = sessions_available(YEAR, event)
if event == "Russian Grand Prix":
sessions = ["Practice 1", "Practice 2", "Qualifying", "Race"]
if event == "Saudi Arabian Grand Prix":
sessions = ["Practice 1", "Practice 2", "Practice 3","Qualifying", "Race"] # removing
# Loop through each session and create a folder within the event folder
for session in sessions:
drivers = session_drivers_list(YEAR, event, session)
for driver in drivers:
f1session = fastf1.get_session(YEAR, event, session)
f1session.load(telemetry=False, weather=False, messages=False)
laps = f1session.laps
driver_laps = laps.pick_driver(driver)
driver_laps["LapNumber"] = driver_laps["LapNumber"].astype(int)
driver_lap_numbers = round(driver_laps["LapNumber"]).tolist()
for lap_number in driver_lap_numbers:
driver_folder = f"{event}/{session}/{driver}"
if not os.path.exists(driver_folder):
os.makedirs(driver_folder)
try:
telemetry = telemetry_data(YEAR, event, session, driver, lap_number)
# print(telemetry)
# Specify the file path where you want to save the JSON data
file_path = f"{driver_folder}/{lap_number}_tel.json"
# Save the dictionary to a JSON file
with open(file_path, "w") as json_file:
json.dump(telemetry, json_file)
except:
continue

Xet Storage Details

Size:
8.98 kB
·
Xet hash:
e3280ce820311682c928f3d1de35ae5548f42263fb3080a1a899ef5ebec94732

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.