File size: 6,025 Bytes
0bb4d1d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
305d3df
0bb4d1d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
95
96
97
98
99
100
101
102
import gradio as gr
import numpy as np
import pandas as pd
import os, joblib
import re

# load model pipeline
file_path = os.path.abspath('toolkit/pipeline.joblib')
pipeline = joblib.load(file_path)


#function to calculate week hour from weekday and hour
def calculate_pickup_week_hour(pickup_hour, pickup_weekday):
    return pickup_weekday * 24 + pickup_hour

def predict(origin_lat, origin_lon, Destination_lat, Destination_lon,
            Trip_distance, dewpoint_2m_temperature,
            minimum_2m_air_temperature, pickup_weekday, pickup_hour,
            cluster_id, temperature_range, rain):
    
    # Calculate pickup_week_hour
    pickup_week_hour = calculate_pickup_week_hour(pickup_hour, pickup_weekday)

    # Modeling
    try:
        model_output = abs(int(pipeline.predict(pd.DataFrame([[origin_lat, origin_lon, Destination_lat, Destination_lon,
                                                               Trip_distance, dewpoint_2m_temperature,
                                                               minimum_2m_air_temperature, pickup_weekday, pickup_hour,
                                                               pickup_week_hour, cluster_id, temperature_range,
                                                               rain]], columns=['Origin_lat', 'Origin_lon', 'Destination_lat',
                                                                                'Destination_lon', 'Trip_distance',
                                                                                'dewpoint_2m_temperature',
                                                                                'minimum_2m_air_temperature',
                                                                                'pickup_weekday', 'pickup_hour',
                                                                                'pickup_week_hour', 'cluster_id',
                                                                                'temperature_range', 'rain']))))
    except Exception as e:
        print(f"Error during prediction: {str(e)}")
        model_output = 0

    output_str = 'Hey there, Your ETA is'
    dist = 'seconds'

    return f"{output_str} {model_output} {dist}"

# UI layout
with gr.Blocks(theme=gr.themes.Soft()) as app:
    gr.Markdown("# ETA PREDICTION")
    gr.Markdown("""This app uses a machine learning model to predict the ETA of trips on the Yassir Hailing App.Refer to the expander at the bottom for more information on the inputs.""")

    with gr.Row():
        origin_lat = gr.Slider(2.806, 3.373, step=0.001, interactive=True, value=2.806, label='Origin latitude')
        origin_lon = gr.Slider(36.589, 36.820, step=0.001, interactive=True, value=36.589, label='Origin longitude')
        Destination_lat = gr.Slider(2.807, 3.381, step=0.001, interactive=True, value=2.810, label='Destination latitude')
        Destination_lon = gr.Slider(36.592, 36.819, step=0.001, interactive=True, value=36.596, label='Destination longitude')
        Trip_distance = gr.Slider(0, 62028, step=1, interactive=True, value=1000, label='Trip distance (M)')
        cluster_id = gr.Dropdown([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], label="Cluster ID", value=4)

    with gr.Column():
        pickup_weekday = gr.Dropdown([0, 1, 2, 3, 4, 5, 6], value=3, label='Pickup weekday')
        pickup_hour = gr.Dropdown([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23],
                                   value=13, label='Pickup hour')

    with gr.Column():
        dewpoint_2m_temperature = gr.Slider(279.129, 286.327, step=0.001, interactive=True, value=282.201,
                                             label='dewpoint_2m_temperature')
        minimum_2m_air_temperature = gr.Slider(282.037, 292.543, step=0.01, interactive=True, value=285.203,
                                               label='minimum_2m_air_temperature')
        temperature_range = gr.Slider(1.663, 10.022, step=0.01, interactive=True, value=5.583, label='temperature_range')
        rain = gr.Dropdown([0, 1], label='Is it raining (0=No, 1=Yes)')

    with gr.Row():
        btn = gr.Button("Predict")
        output = gr.Textbox(label="Prediction")

    # Expander for more info on columns
    with gr.Accordion("Information on inputs"):
        gr.Markdown("""These are information on the inputs the app takes for predicting a rides ETA.
                    - Origin latitude: Origin in degree latitude)
                    - Origin longitude:  Origin in degree longitude
                    - Destination latitude: Destination latitude
                    - Destination longitude: Destination logitude
                    - Trip distance (M): Distance in meters on a driving route
                    - Cluster ID: Select the cluster within which you started your trip
                    - Pickup weekday: Day of the week
                        Monday=0, Tuesday=1, Wednesday=2, Thursday=3, Friday=4, Saturday=5, Sunday=6
                    - Pickup hour: The hour of the day (24hr clock)
                    - dewpoint_2m_temperature: The temperature at 2 meters above the ground where the air temperature would be 
                      low enough for dew to form. It gives an indication of humidity.
                    - minimum_2m_air_temperature: The lowest air temperature recorded at 2 meters above the ground during the specified date.
                    - temperature_range: The air temperature range recorded at 2 meters above the ground on the day
                    - rain: Is it raining? yes=1, no=2
                    """)

    btn.click(fn=predict, inputs=[origin_lat, origin_lon, Destination_lat, Destination_lon,
                                  Trip_distance, dewpoint_2m_temperature,
                                  minimum_2m_air_temperature, pickup_weekday, pickup_hour,
                                  cluster_id, temperature_range,
                                  rain], outputs=output)

    app.launch(share=True, debug=True)