import fastf1 import pandas as pd from fastapi import FastAPI from fastapi.responses import FileResponse, HTMLResponse from pydantic import BaseModel app = FastAPI() # class Laps(BaseModel): # Time: pd.Timedelta # Driver: str # DriverNumber: str # LapTime: pd.Timedelta # LapNumber: int # Stint: int # PitOutTime: pd.Timedelta # PitInTime: pd.Timedelta # Sector1Time: pd.Timedelta # Sector2Time: pd.Timedelta # Sector3Time: pd.Timedelta # Sector1SessionTime: pd.Timedelta # Sector2SessionTime: pd.Timedelta # Sector3SessionTime: pd.Timedelta # SpeedI1: float # SpeedI2: float # SpeedFL: float # SpeedST: float # IsPersonalBest: bool # Compound: str # TyreLife: float # FreshTyre: bool # Team: str # LapStartTime: pd.Timedelta # LapStartDate: pd.Timestamp # TrackStatus: str # IsAccurate: bool # # https://stackoverflow.com/questions/65412984/using-pandas-data-frame-as-a-type-in-pydantic # class Config: # arbitrary_types_allowed = True class Laps(BaseModel): Time: pd.core.frame.DataFrame Driver: pd.core.frame.DataFrame DriverNumber: pd.core.frame.DataFrame LapTime: pd.core.frame.DataFrame LapNumber: pd.core.frame.DataFrame Stint: pd.core.frame.DataFrame PitOutTime: pd.core.frame.DataFrame PitInTime: pd.core.frame.DataFrame Sector1Time: pd.core.frame.DataFrame Sector2Time: pd.core.frame.DataFrame Sector3Time: pd.core.frame.DataFrame Sector1SessionTime: pd.core.frame.DataFrame Sector2SessionTime: pd.core.frame.DataFrame Sector3SessionTime: pd.core.frame.DataFrame SpeedI1: pd.core.frame.DataFrame SpeedI2: pd.core.frame.DataFrame SpeedFL: pd.core.frame.DataFrame SpeedST: pd.core.frame.DataFrame IsPersonalBest: pd.core.frame.DataFrame Compound: pd.core.frame.DataFrame TyreLife: pd.core.frame.DataFrame FreshTyre: pd.core.frame.DataFrame Team: pd.core.frame.DataFrame LapStartTime: pd.core.frame.DataFrame LapStartDate: pd.core.frame.DataFrame TrackStatus: pd.core.frame.DataFrame IsAccurate: pd.core.frame.DataFrame # https://stackoverflow.com/questions/65412984/using-pandas-data-frame-as-a-type-in-pydantic class Config: arbitrary_types_allowed = True @app.get("/") async def root(): return {"message": "Hello World"} # create a function that returns laps dataframe given year, race ,session from fastf1 @app.get("/{year}/{race}/{session}", response_model=None) async def get_data(year: int, race: int, session: str) -> any: f1session = fastf1.get_session(year, race, session) f1session.load(telemetry=False, weather=False, messages=False) # Load all laps with telemetry laps = f1session.laps laps['Sector1Time'] = laps['Sector1Time'].dt.total_seconds() laps['Sector2Time'] = laps['Sector2Time'].dt.total_seconds() laps['Sector3Time'] = laps['Sector3Time'].dt.total_seconds() laps['LapTime_in_seconds'] = laps['LapTime'].dt.total_seconds() laps['laptime_sum_sectortimes'] = laps.Sector1Time + \ laps.Sector2Time + laps.Sector3Time # # convert laps to csv # laps.to_csv('laps.csv', index=False) # return laps # in laps replace NaN with "" laps = laps.fillna(" ") return {"laps": laps.to_dict(orient='records')} # return FileResponse(path='laps.csv', filename='laps.csv') # return HTMLResponse(content=laps.to_html(), status_code=200)