File size: 3,777 Bytes
1e971b9 ad91425 1e971b9 | 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 | 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() |