import streamlit as st from joblib import load import pickle as pkl import json import pandas as pd import numpy as np model = load('./src/best_model.pkl') with open('./src/nationalities.txt', 'rb') as file_2: nats = json.load(file_2) driver_nats = nats["driver_nationalities"] constructor_nats = nats["constructor_nationalities"] def run(): with st.form(key = 'form_ftds_rmt_053'): grid_position = st.slider("Grid Position", 1, 26, 5, help= "Driver's Grid Position at Race Day") quali_position = st.slider("Qualifying Position", 1, 26, 5, help= "Driver's Qualifying Position before Race Day") round_num = st.slider("Round of Season", 1, 26, 5, help= "Which Race of the Season") year = st.number_input("Year", min_value = 1950, max_value = 2026, value= 2020, help="Season Year (1950-2026)") driver_position_before = st.slider("Driver's Championship Position", 1, 26, 5, help= "Driver's Position on the World Driver's Championship") driver_points_before = st.number_input("Points Before Race", min_value = 0, max_value = 600, value= 100, help="Driver Points in the Championship (0-600)") driver_wins_before = st.slider("Driver's Total Wins", 1, 110, 5, help= "Driver's Total Wins in their career") driver_age = st.number_input("Age", min_value = 15.0, max_value = 100.0, value = 20.0, step = 0.5, help = 'Driver Age') driver_nationality = st.selectbox("Driver Nationality", options=driver_nats, index=driver_nats.index("Dutch") if "Dutch" in driver_nats else 0,help="Driver's nationality. Must match a nationality seen during model training.") constructor_nationality = st.selectbox("Constructor Nationality", options=constructor_nats, index=constructor_nats.index("British") if "British" in constructor_nats else 0, help="The nationality of the constructor (team). Must match a nationality seen during model training.") constructor_position_before = st.slider("Constructor's Championship Position", 1, 13, 5, help= "Constructor's Position on the World Constructor's Championship") driver_historical_dnf_rate = st.slider("DNF Rate", 0.0, 1.0, 0.01, help= "Driver's Historical DNF Rate") pit_stops = st.slider("Pit Stops", 0, 10, help= "Pit Stops done within the race") submitted = st.form_submit_button('Predict') input_df = pd.DataFrame([{ "grid_position" : float(grid_position), "quali_position" : float(quali_position), "round" : int(round_num), "year" : int(year), "driver_points_before" : float(driver_points_before), "driver_position_before" : float(driver_position_before), "driver_wins_before" : float(driver_wins_before), "driver_age" : float(driver_age), "driver_nationality" : driver_nationality, "constructor_nationality" : constructor_nationality, "constructor_position_before" : float(constructor_position_before), "driver_historical_dnf_rate" : float(driver_historical_dnf_rate), "pit_stops" : float(pit_stops), }]) if submitted: prediction = model.predict(input_df)[0] probability = model.predict_proba(input_df)[0] podium_prob = probability[1] no_podium_prob = probability[0] st.subheader("Prediction Result") if prediction == 1: st.success("This driver is likely to finish on the podium") else: st.warning("This driver is unlikely to finish on the podium.") st.write("### Probabilities") st.write(f"Podium Probability: {podium_prob:.2%}") st.write(f"No Podium Probability: {no_podium_prob:.2%}") if __name__ == '__main__': run()