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()