|
import time |
|
|
|
import altair as alt |
|
import joblib |
|
import numpy as np |
|
import pandas as pd |
|
import streamlit as st |
|
from sklearn.linear_model import LinearRegression |
|
import matplotlib.pyplot as plt |
|
import plotly.graph_objects as go |
|
from helper_functions import custom_metric_box, pollution_box |
|
import plotly.graph_objects as go |
|
import streamlit as st |
|
import pandas as pd |
|
import numpy as np |
|
|
|
st.set_page_config( |
|
page_title="Utrecht Pollution Dashboard", |
|
page_icon="🏂��🌱", |
|
layout="wide", |
|
initial_sidebar_state="expanded") |
|
|
|
alt.themes.enable("dark") |
|
|
|
st.title("Utrecht Pollution Dashboard 🌱") |
|
|
|
@st.cache_resource(ttl=6*300) |
|
def run_model(): |
|
|
|
model = joblib.load("linear_regression_model.pkl") |
|
|
|
|
|
input_data = pd.DataFrame({ |
|
'Temperature': [20.0], |
|
'Wind Speed': [10.0], |
|
'Humidity': [50.0] |
|
}) |
|
|
|
|
|
prediction = model.predict(input_data) |
|
return prediction |
|
col1, col2 = st.columns((1,1)) |
|
|
|
with col1: |
|
st.subheader('Current Weather') |
|
col1, col2, col3 = st.columns(3) |
|
|
|
|
|
with col1: |
|
custom_metric_box(label="Temperature", value="2 °C", delta="-3 °C") |
|
custom_metric_box(label="Humidity", value="60 %", delta="-1 %") |
|
|
|
|
|
with col2: |
|
custom_metric_box(label="Pressure", value="1010 hPa", delta="+2 hPa") |
|
custom_metric_box(label="Precipitation", value="5 mm", delta="-1 mm") |
|
|
|
|
|
with col3: |
|
custom_metric_box(label="Solar Radiation", value="200 W/m²", delta="-20 W/m²") |
|
custom_metric_box(label="Wind Speed", value="15 km/h", delta="-2 km/h") |
|
|
|
st.subheader('Current Pollution Levels') |
|
col1, col2 = st.columns((1,1)) |
|
|
|
|
|
with col1: |
|
pollution_box(label="O<sub>3</sub>", value="37 µg/m³", delta="+2 µg/m³") |
|
with col2: |
|
pollution_box(label="NO<sub>2</sub>", value="28 µg/m³", delta="+3 µg/m³") |
|
|
|
|
|
prediction = run_model() |
|
|
|
dates_past = pd.date_range(end=pd.Timestamp.today(), periods=7).to_list() |
|
dates_future = pd.date_range(start=pd.Timestamp.today() + pd.Timedelta(days=1), periods=3).to_list() |
|
|
|
|
|
o3_past_values = [30, 32, 34, 33, 31, 35, 36] |
|
no2_past_values = [20, 22, 21, 23, 22, 24, 25] |
|
|
|
|
|
o3_future_values = [37, 38, 40] |
|
no2_future_values = [26, 27, 28] |
|
|
|
|
|
dates = dates_past + dates_future |
|
o3_values = o3_past_values + o3_future_values |
|
no2_values = no2_past_values + no2_future_values |
|
|
|
|
|
df = pd.DataFrame({ |
|
'Date': dates, |
|
'O3': o3_values, |
|
'NO2': no2_values |
|
}) |
|
|
|
st.subheader('O3 and NO2 Prediction') |
|
|
|
subcol1, subcol2 = st.columns(2) |
|
|
|
with subcol1: |
|
fig_o3 = go.Figure() |
|
fig_o3.add_trace(go.Scatter(x=df['Date'], y=df['O3'], |
|
mode='lines+markers', |
|
name='O3', |
|
line=dict(color='rgb(0, 191, 255)', width=4))) |
|
|
|
fig_o3.add_shape( |
|
dict( |
|
type="line", |
|
x0=pd.Timestamp.today(), x1=pd.Timestamp.today(), |
|
y0=min(o3_values), y1=max(o3_values), |
|
line=dict(color="White", width=3, dash="dash"), |
|
) |
|
) |
|
fig_o3.update_layout( |
|
plot_bgcolor='rgba(0, 0, 0, 0)', |
|
paper_bgcolor='rgba(0, 0, 0, 0)', |
|
yaxis_title="O3 Concentration (µg/m³)", |
|
font=dict(size=14), |
|
hovermode="x unified" |
|
) |
|
st.plotly_chart(fig_o3) |
|
|
|
|
|
with subcol2: |
|
fig_no2 = go.Figure() |
|
fig_no2.add_trace(go.Scatter(x=df['Date'], y=df['NO2'], |
|
mode='lines+markers', |
|
name='NO2', |
|
line=dict(color='rgb(255, 20, 147)', width=4))) |
|
|
|
fig_no2.add_shape( |
|
dict( |
|
type="line", |
|
x0=pd.Timestamp.today(), x1=pd.Timestamp.today(), |
|
y0=min(no2_values), y1=max(no2_values), |
|
line=dict(color="White", width=3, dash="dash"), |
|
) |
|
) |
|
fig_no2.update_layout( |
|
plot_bgcolor='rgba(0, 0, 0, 0)', |
|
paper_bgcolor='rgba(0, 0, 0, 0)', |
|
yaxis_title="NO2 Concentration (µg/m³)", |
|
font=dict(size=14), |
|
hovermode="x unified" |
|
) |
|
st.plotly_chart(fig_no2) |