{"cells":[{"cell_type":"markdown","metadata":{},"source":["# Save fastf1 data a to SQL database\n","\n","Useful for generating quick reports during the race.\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"name":"stderr","output_type":"stream","text":["req WARNING \tDEFAULT CACHE ENABLED! (1.04 GB) /Users/diegomaradona/Library/Caches/fastf1\n","core INFO \tLoading data for Spanish Grand Prix - Practice 1 [v3.3.3]\n","req INFO \tUsing cached data for session_info\n","req INFO \tUsing cached data for driver_info\n","req INFO \tUsing cached data for session_status_data\n","req INFO \tUsing cached data for track_status_data\n","req INFO \tUsing cached data for _extended_timing_data\n","req INFO \tUsing cached data for timing_app_data\n","core INFO \tProcessing timing data...\n","core WARNING \tNo lap data for driver 27\n","core WARNING \tFailed to perform lap accuracy check - all laps marked as inaccurate (driver 27)\n","req INFO \tUsing cached data for car_data\n","req INFO \tUsing cached data for position_data\n","core INFO \tFinished loading data for 21 drivers: ['1', '10', '11', '14', '16', '18', '2', '20', '22', '23', '24', '27', '3', '31', '4', '44', '50', '55', '63', '77', '81']\n"]}],"source":["import fastf1\n","\n","GRAND_PRIX = 'Spain'\n","YEAR = 2024\n","SESSION = 'FP1'\n","\n","session = fastf1.get_session(YEAR, GRAND_PRIX, SESSION)\n","session.load(weather=False, messages=False)"]},{"cell_type":"code","execution_count":2,"metadata":{},"outputs":[],"source":["from pandas import DataFrame\n","\n","\n","def feature_engineering(raw_df: DataFrame) -> DataFrame:\n"," \"\"\"\n"," Perform feature engineering on the input DataFrame.\n","\n"," Parameters:\n"," raw_df (DataFrame): The input DataFrame to be processed.\n","\n"," Returns:\n"," DataFrame: The processed DataFrame after feature engineering.\n"," \"\"\"\n"," df = raw_df.copy()\n","\n"," df = df[df['Deleted'].isna()]\n"," df['LapNumber'] = df['LapNumber'].astype(int)\n"," df = df.sort_values(by='LapNumber')\n","\n"," time_columns = ['LapTime', 'PitOutTime', 'PitInTime',\n"," 'Sector1Time', 'Sector2Time', 'Sector3Time', 'LapStartTime']\n"," for col in time_columns:\n"," if col in df.columns:\n"," df[col + 'Seconds'] = df[col].dt.total_seconds()\n"," df.drop(columns=[col], inplace=True, axis=1)\n"," print(f\"Converted {col} to seconds.\")\n","\n"," df.drop(columns=[col for col in ['Sector1SessionTime', 'Sector2SessionTime',\n"," 'Sector3SessionTime'] if col in df.columns], inplace=True, axis=1)\n","\n"," df['TimeInMinutes'] = df['Time'].dt.total_seconds() / 60\n"," df.drop(columns=['Time'], inplace=True, axis=1)\n","\n"," return df"]},{"cell_type":"code","execution_count":3,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["Converted LapTime to seconds.\n","Converted PitOutTime to seconds.\n","Converted PitInTime to seconds.\n","Converted Sector1Time to seconds.\n","Converted Sector2Time to seconds.\n","Converted Sector3Time to seconds.\n","Converted LapStartTime to seconds.\n","Converted LapTime to seconds.\n","Converted PitOutTime to seconds.\n","Converted PitInTime to seconds.\n","Converted Sector1Time to seconds.\n","Converted Sector2Time to seconds.\n","Converted Sector3Time to seconds.\n","Converted LapStartTime to seconds.\n","Converted LapTime to seconds.\n","Converted PitOutTime to seconds.\n","Converted PitInTime to seconds.\n","Converted Sector1Time to seconds.\n","Converted Sector2Time to seconds.\n","Converted Sector3Time to seconds.\n","Converted LapStartTime to seconds.\n","Converted LapTime to seconds.\n","Converted PitOutTime to seconds.\n","Converted PitInTime to seconds.\n","Converted Sector1Time to seconds.\n","Converted Sector2Time to seconds.\n","Converted Sector3Time to seconds.\n","Converted LapStartTime to seconds.\n"]}],"source":["hamilton_laps = feature_engineering(session.laps.pick_driver('HAM'))\n","russel_laps = feature_engineering(session.laps.pick_driver('RUS'))\n","verstappen_laps = feature_engineering(session.laps.pick_driver('VER'))\n","norris_laps = feature_engineering(session.laps.pick_driver('NOR'))"]},{"cell_type":"code","execution_count":4,"metadata":{},"outputs":[{"data":{"text/html":["
\n"," | Driver | \n","DriverNumber | \n","LapNumber | \n","Stint | \n","SpeedI1 | \n","SpeedI2 | \n","SpeedFL | \n","SpeedST | \n","IsPersonalBest | \n","Compound | \n","... | \n","FastF1Generated | \n","IsAccurate | \n","LapTimeSeconds | \n","PitOutTimeSeconds | \n","PitInTimeSeconds | \n","Sector1TimeSeconds | \n","Sector2TimeSeconds | \n","Sector3TimeSeconds | \n","LapStartTimeSeconds | \n","TimeInMinutes | \n","
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
368 | \n","HAM | \n","44 | \n","1 | \n","1.0 | \n","215.0 | \n","220.0 | \n","281.0 | \n","207.0 | \n","False | \n","HARD | \n","... | \n","False | \n","False | \n","NaN | \n","855.834 | \n","NaN | \n","NaN | \n","35.817 | \n","24.869 | \n","855.834 | \n","16.018517 | \n","
369 | \n","HAM | \n","44 | \n","2 | \n","1.0 | \n","287.0 | \n","287.0 | \n","282.0 | \n","316.0 | \n","True | \n","HARD | \n","... | \n","False | \n","True | \n","77.632 | \n","NaN | \n","NaN | \n","22.815 | \n","31.375 | \n","23.442 | \n","961.111 | \n","17.312383 | \n","
370 | \n","HAM | \n","44 | \n","3 | \n","1.0 | \n","124.0 | \n","127.0 | \n","NaN | \n","252.0 | \n","False | \n","HARD | \n","... | \n","False | \n","False | \n","138.480 | \n","NaN | \n","1174.54 | \n","34.776 | \n","60.313 | \n","43.391 | \n","1038.743 | \n","19.620383 | \n","
371 | \n","HAM | \n","44 | \n","4 | \n","2.0 | \n","162.0 | \n","209.0 | \n","280.0 | \n","149.0 | \n","False | \n","HARD | \n","... | \n","False | \n","False | \n","138.969 | \n","1202.155 | \n","NaN | \n","60.718 | \n","46.940 | \n","31.311 | \n","1177.223 | \n","21.936533 | \n","
372 | \n","HAM | \n","44 | \n","5 | \n","2.0 | \n","288.0 | \n","301.0 | \n","280.0 | \n","318.0 | \n","True | \n","HARD | \n","... | \n","False | \n","True | \n","76.650 | \n","NaN | \n","NaN | \n","22.563 | \n","30.890 | \n","23.197 | \n","1316.192 | \n","23.214033 | \n","
5 rows × 28 columns
\n","