File size: 5,887 Bytes
6fedaa7
 
 
 
 
be9e9ca
adcbaca
 
 
 
 
03e67cf
6fedaa7
c4ec6df
 
 
 
 
 
 
 
 
 
 
 
 
 
 
852d5ad
c4ec6df
 
 
03e67cf
c4ec6df
 
 
 
 
 
6fedaa7
c4ec6df
03e67cf
c4ec6df
 
 
 
 
 
 
 
03d8f37
c4ec6df
 
 
 
03d8f37
c4ec6df
03e67cf
c4ec6df
03d8f37
c4ec6df
03e67cf
 
 
 
 
 
 
 
 
 
 
c4ec6df
dc46bb2
c4ec6df
03d8f37
03e67cf
 
 
 
03d8f37
03e67cf
03d8f37
f5086fc
a642d4a
c560442
 
d2d3ba1
a642d4a
f5086fc
03e67cf
f5086fc
 
 
af6c04e
03e67cf
f5086fc
 
 
03e67cf
 
 
 
f5086fc
 
03e67cf
26e57cf
0dd59e9
67b00d8
 
0dd59e9
 
a766b35
 
0dd59e9
 
 
f50a4d0
ef884ae
0dd59e9
4d5e943
e757b51
03e67cf
 
 
 
c4ec6df
 
 
 
 
03d8f37
c4ec6df
03e67cf
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import sklearn
import gradio as gr
import joblib
import pandas as pd
import datasets
import requests
import json
import dateutil.parser as dp
import pandas as pd
from huggingface_hub import hf_hub_url, cached_download
import time
from datetime import datetime

def get_row():
    response_tomtom = requests.get(
                    'https://api.tomtom.com/traffic/services/4/flowSegmentData/absolute/10/json?key=azGiX8jKKGxCxdsF1OzvbbWGPDuInWez&point=59.39575,17.98343')
    json_response_tomtom = json.loads(response_tomtom.text)  # get json response
    
    currentSpeed = json_response_tomtom["flowSegmentData"]["currentSpeed"]
    freeFlowSpeed = json_response_tomtom["flowSegmentData"]["freeFlowSpeed"]
    congestionLevel = currentSpeed/freeFlowSpeed
    
    confidence = json_response_tomtom["flowSegmentData"]["confidence"] # Reliability of the traffic data, by percentage
    
    
    # Get weather data from SMHI, updated hourly
    
    response_smhi = requests.get(
                'https://opendata-download-metanalys.smhi.se/api/category/mesan1g/version/2/geotype/point/lon/17.983/lat/59.3957/data.json')
    json_response_smhi = json.loads(response_smhi.text) 
    
    # weather data manual https://opendata.smhi.se/apidocs/metanalys/parameters.html#parameter-wsymb
    # referenceTime = dp.parse(json_response_smhi["referenceTime"]).timestamp()
    
    t             = json_response_smhi["timeSeries"][0]["parameters"][0]["values"][0] # Temperature
    ws            = json_response_smhi["timeSeries"][0]["parameters"][4]["values"][0] # Wind Speed
    prec1h        = json_response_smhi["timeSeries"][0]["parameters"][6]["values"][0] # Precipation last hour
    fesn1h        = json_response_smhi["timeSeries"][0]["parameters"][8]["values"][0] # Snow precipation last hour
    vis           = json_response_smhi["timeSeries"][0]["parameters"][9]["values"][0] # Visibility

    # Use current time
    referenceTime = datetime.fromtimestamp(time.time())
    
    row           ={"referenceTime": referenceTime, 
                        "temperature": t, 
                        "wind speed": ws, 
                        "precipation last hour": prec1h, 
                        "snow precipation last hour": fesn1h, 
                        "visibility": vis, 
                        "confidence of data": confidence}
    
    row = pd.DataFrame([row], columns=row.keys())
    print(row)
    row.dropna(axis=0, inplace=True)
    return row

model = joblib.load(cached_download(
    hf_hub_url("Chenzhou/Traffic_Prediction", "traffic_model_adam.pkl")
))

def infer(input_dataframe):
    serie = input_dataframe["referenceTime"]
    ts = dp.parse(serie.iloc[0]).timestamp()
    input_dataframe["referenceTime"] = ts
    res = pd.DataFrame(model.predict(input_dataframe)).clip(0, 1).iloc[0, 0]
    if res > 0.8:
        status = "Smooth Traffic on E4"
    elif res > 0.5:
        status = "Slight congestion on E4"
    else:
        status = "Total congestion on E4"
    return pd.DataFrame({'Freeflow Level':[res], 'Status': [status]})

title = "Stockholm Highway E4 Real Time Traffic Prediction"
description = "Stockholm E4 (59°23'44.7"" N 17°59'00.4""E) highway real time traffic prediction"

# inputs = [gr.Dataframe(row_count = (1, "fixed"), col_count=(7,"fixed"), 
#                        headers=["referenceTime", "t", "ws", "prec1h", "fesn1h", "vis", "confidence"], 
#                        # datatype=["timestamp", "float", "float", "float", "float", "float"],
#                        label="Input Data", interactive=1)]

# outputs = [gr.Dataframe(row_count = (1, "fixed"), col_count=(1, "fixed"), label="Predictions", headers=["Congestion Level"])]

with gr.Blocks() as demo:
    gr.Markdown("<h1 style='text-align: center; margin-bottom: 1rem'>"
                + title
                + "</h1>")
    gr.Markdown(description)
    with gr.Row():
        with gr.Column():
            inputs = gr.Dataframe(row_count = (1, "fixed"), col_count=(7,"fixed"), 
                       headers=["referenceTime", "t", "ws", "prec1h", "fesn1h", "vis", "confidence"], 
                       # datatype=["timestamp", "float", "float", "float", "float", "float"],
                       label="Input Data", interactive=1)
        with gr.Column():
            outputs = gr.Dataframe(row_count = (1, "fixed"), col_count=(2, "fixed"), label="Predictions", headers=["Freeflow Level", "Status"])
    
    with gr.Row():
        btn_sub = gr.Button(value="Submit")
    with gr.Row():
        btn_ref = gr.Button(value="Get real-time data")

    
    
    btn_sub.click(infer, inputs = inputs, outputs = outputs)
    btn_ref.click(get_row, inputs = None, outputs = inputs)

    #example_row = ["2023-01-01 15:00:00", 4.5, 6.6, 0, 0, 40, 1]
    ref_ex = datetime.fromtimestamp(1672585200)
    example_row       ={"referenceTime": ref_ex, 
                        "temperature": 4.5, 
                        "wind speed": 6.6, 
                        "precipation last hour": 0.0, 
                        "snow precipation last hour": 0.0, 
                        "visibility": 40, 
                        "confidence of data": 1}
    
    example_row = pd.DataFrame([example_row], columns=example_row.keys())
    example_row.dropna(axis=0, inplace=True)
    
    #examples = gr.Examples(fn = infer, examples=[get_row()],inputs=inputs,outputs=outputs  ,cache_examples=True)
    examples = gr.Examples(fn = infer, examples=[example_row] ,inputs=inputs, outputs=outputs, cache_examples=False)

    # demo.load(get_row, inputs = None, outputs = [inputs], every=10)
    demo.load(get_row, inputs = None, outputs = [inputs])

        

    
# interface = gr.Interface(fn = infer, inputs = inputs, outputs = outputs, title=title, description=description, examples=[get_row()], cache_examples=False)
# interface.launch()

if __name__ == "__main__":
    demo.queue().launch()