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") # App Title st.title("Utrecht Pollution Dashboard 🌱") @st.cache_resource(ttl=6*300) # Reruns every 6 hours def run_model(): # Load or train your model (pretrained model in this case) model = joblib.load("linear_regression_model.pkl") # Static input values input_data = pd.DataFrame({ 'Temperature': [20.0], 'Wind Speed': [10.0], 'Humidity': [50.0] }) # Run the model with static input prediction = model.predict(input_data) return prediction col1, col2 = st.columns((1,1)) # Create a 3-column layout with col1: st.subheader('Current Weather') col1, col2, col3 = st.columns(3) # First column with col1: custom_metric_box(label="Temperature", value="2 °C", delta="-3 °C") custom_metric_box(label="Humidity", value="60 %", delta="-1 %") # Second column with col2: custom_metric_box(label="Pressure", value="1010 hPa", delta="+2 hPa") custom_metric_box(label="Precipitation", value="5 mm", delta="-1 mm") # Third column 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)) # Display the prediction #st.write(f'Predicted Pollution Level: {prediction[0]:.2f}') with col1: pollution_box(label="O3", value="37 µg/m³", delta="+2 µg/m³") with col2: pollution_box(label="NO2", value="28 µg/m³", delta="+3 µg/m³") prediction = run_model() # Assuming you have a function run_model() # Sample data (replace with your actual data) 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 and NO2 values for the past 7 days o3_past_values = [30, 32, 34, 33, 31, 35, 36] no2_past_values = [20, 22, 21, 23, 22, 24, 25] # Predicted O3 and NO2 values for the next 3 days o3_future_values = [37, 38, 40] no2_future_values = [26, 27, 28] # Combine dates and values dates = dates_past + dates_future o3_values = o3_past_values + o3_future_values no2_values = no2_past_values + no2_future_values # Create a DataFrame df = pd.DataFrame({ 'Date': dates, 'O3': o3_values, 'NO2': no2_values }) st.subheader('O3 and NO2 Prediction') # Create two columns for two separate graphs subcol1, subcol2 = st.columns(2) # Plot O3 in the first subcolumn 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))) # Bright blue # Add a vertical line for predictions (today's date) 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)', # Transparent background paper_bgcolor='rgba(0, 0, 0, 0)', # Transparent paper background yaxis_title="O3 Concentration (µg/m³)", font=dict(size=14), hovermode="x unified" ) st.plotly_chart(fig_o3) # Plot NO2 in the second subcolumn 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))) # Bright pink # Add a vertical line for predictions (today's date) 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)', # Transparent background paper_bgcolor='rgba(0, 0, 0, 0)', # Transparent paper background yaxis_title="NO2 Concentration (µg/m³)", font=dict(size=14), hovermode="x unified" ) st.plotly_chart(fig_no2)