File size: 3,489 Bytes
a2d3266
 
e742cfd
 
 
a2d3266
9ae94f1
 
e742cfd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9ae94f1
e742cfd
 
 
a2d3266
e742cfd
 
 
 
4cc9fb2
a2d3266
 
 
 
4cc9fb2
 
 
 
f5980e9
e742cfd
 
 
a2d3266
e742cfd
 
4cc9fb2
 
e742cfd
 
a2d3266
e742cfd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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)