File size: 3,499 Bytes
a2d3266
 
e742cfd
 
 
a2d3266
9ae94f1
 
e742cfd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9ae94f1
e742cfd
 
 
a2d3266
e742cfd
 
 
 
4cc9fb2
a2d3266
 
 
 
4cc9fb2
 
 
 
 
 
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
110
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)