File size: 5,088 Bytes
e428742
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
import pickle
import pandas as pd
import sys
import os

# Add the parent directory to the path
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

from constants import *
import datetime

transformer_filename = 'saved_models/data_transformer.sav'
delay_carrier_filename = 'saved_models/delay_carrier_lin_reg.sav'
delay_weather_filename = 'saved_models/delay_weather_lin_reg.sav'
delay_nas_filename = 'saved_models/delay_nas_lin_reg.sav'
delay_security_filename = 'saved_models/delay_security_lin_reg.sav'
delay_late_aircraft_filename = 'saved_models/delay_late_aircraft_lin_reg.sav'
cancel_filename = 'saved_models/cancel_log_reg.sav'

transformer = pickle.load(open(transformer_filename, 'rb'))
delay_carrier_lin_reg_model = pickle.load(open(delay_carrier_filename, 'rb'))
delay_weather_lin_reg_model = pickle.load(open(delay_weather_filename, 'rb'))
delay_nas_lin_reg_model = pickle.load(open(delay_nas_filename, 'rb'))
delay_security_lin_reg_model = pickle.load(open(delay_security_filename, 'rb'))
delay_late_aircraft_lin_reg_model = pickle.load(open(delay_late_aircraft_filename, 'rb'))
cancel_lin_reg_model = pickle.load(open(cancel_filename, 'rb'))


def pred():
    st.header("Flight Delay and Cancellation Prediction")
    st.markdown("Fill in the information about your flight below and we will predict how long the flight may be \
         delayed for (or arrive early) and the probability of the flight being cancelled.")
    with st.form("flight_details"):
        valid_input = True
        c1, c2 = st.columns(2)
        with c1:
            airline = st.selectbox("Airline",
                                    options=[key + ' : ' + value for key, value in airline_name.items()]).split(" : ")[0]
            date = st.date_input("Departure Date", value=datetime.date.today(), min_value=datetime.date(2021, 1, 1), max_value=datetime.date(2024, 12, 31))
            dpt_airport = st.selectbox("From Airport",
                                    options=airports, index = 236)
            dpt_time = int(st.time_input('Expected Departure Time', datetime.time(13, 15)).strftime("%H%M"))      
        with c2:
            flight_num = st.text_input('Flight Number', '1111')
            arr_date = st.date_input("Arrival Date", value=datetime.date.today(), min_value=datetime.date(2021, 1, 1), max_value=datetime.date(2024, 12, 31))
            arv_airport = st.selectbox("To Airport",
                                    options=airports, index = 39)
            arv_time = int(st.time_input('Expected Arrival Time', datetime.time(15, 00)).strftime("%H%M"))
        if not flight_num.isnumeric() or int(flight_num) < 0 or int(flight_num) > 9999:
            st.write('Please enter a valid flight number between 1 and 9999.')
            valid_input = False
        elif dpt_airport == arv_airport:
            st.write('Please select different departure and arrival airport.')
            valid_input = False
        else:
            valid_input = True

        month = date.month
        day = date.day
        weekday = date.weekday() + 1

        submitted = st.form_submit_button("Predict!")

    if valid_input and submitted:
        dummy_data = [[month, day, weekday, airline, int(flight_num), dpt_airport, arv_airport, dpt_time, arv_time]]
        dummy_df = pd.DataFrame(dummy_data, columns=['MONTH', 'DAY_OF_MONTH', 
                'DAY_OF_WEEK', 'OP_UNIQUE_CARRIER', 'OP_CARRIER_FL_NUM', 
                'ORIGIN', 'DEST', 'CRS_DEP_TIME', 
                'CRS_ARR_TIME'])
        input = transformer.transform(dummy_df)
        delay_carrier_pred = delay_carrier_lin_reg_model.predict(input)[0]
        delay_weather_pred = delay_weather_lin_reg_model.predict(input)[0]
        delay_nas_pred = delay_nas_lin_reg_model.predict(input)[0]
        delay_security_pred = delay_security_lin_reg_model.predict(input)[0]
        delay_late_aircraft_pred = delay_late_aircraft_lin_reg_model.predict(input)[0]


        cancel_pred = cancel_lin_reg_model.predict_proba(input)[0][1] * 100
        total_delay = delay_weather_pred + delay_carrier_pred + delay_nas_pred + delay_security_pred + delay_late_aircraft_pred


        m1, m2, = st.columns(2)
        with m1:
            st.metric(label=f"Your flight may be late for", value=f"{round(total_delay)} minutes")
            st.metric(label=f"Your flight may be late due to weather for", value=f"{round(delay_weather_pred)} minutes")
            st.metric(label=f"Your flight may be late due to nas for", value=f"{round(delay_nas_pred)} minutes")
            st.metric(label=f"Your flight may be late due to late aircraft for", value=f"{round(delay_late_aircraft_pred)} minutes")
        with m2:
            st.metric(label=f"The probability of your flight being cancelled is", value=f"{round(cancel_pred)}%")
            st.metric(label=f"Your flight may be late due to carrier for", value=f"{round(delay_carrier_pred)} minutes")
            st.metric(label=f"Your flight may be late due to security for", value=f"{round(delay_security_pred)} minutes")

pred()