import streamlit as st import hopsworks import joblib import pandas as pd import numpy as np import folium from streamlit_folium import st_folium, folium_static import json import time from datetime import timedelta, datetime from branca.element import Figure from functions import decode_features, get_model def fancy_header(text, font_size=24): res = f'{text}' st.markdown(res, unsafe_allow_html=True ) st.markdown( f''' ''', unsafe_allow_html=True ) st.title('⛅️Air Quality Prediction Project🌩') progress_bar = st.sidebar.header('⚙️ Working Progress') progress_bar = st.sidebar.progress(0) st.write(36 * "-") fancy_header('\n📡 Connecting to Hopsworks Feature Store...') project = hopsworks.login() fs = project.get_feature_store() feature_view = fs.get_feature_view( name = 'air_quality_fv', version = 1 ) st.write("Successfully connected!✔️") progress_bar.progress(20) st.write(36 * "-") fancy_header('\n☁️ Getting batch data from Feature Store...') feature_view.init_batch_scoring(training_dataset_version=4) start_date = datetime.now() - timedelta(days=1) start_time = int(start_date.timestamp()) * 1000 X = feature_view.get_batch_data(start_time=start_time) progress_bar.progress(50) latest_date_unix = str(X.date.values[0])[:10] latest_date = time.ctime(int(latest_date_unix)) st.write(f"⏱ Data for {latest_date}") X=X.loc[X['date'] == max (X['date'])] X = X.drop(columns=["date"]).fillna(0) data_to_display = decode_features(X, feature_view=feature_view) progress_bar.progress(60) st.write(36 * "-") fancy_header(f"🗺 Processing the map...") fig = Figure(width=550,height=350) my_map = folium.Map(location=[58, 20], zoom_start=3.71) fig.add_child(my_map) folium.TileLayer('Stamen Terrain').add_to(my_map) folium.TileLayer('Stamen Toner').add_to(my_map) folium.TileLayer('Stamen Water Color').add_to(my_map) folium.TileLayer('cartodbpositron').add_to(my_map) folium.TileLayer('cartodbdark_matter').add_to(my_map) folium.LayerControl().add_to(my_map) data_to_display = data_to_display[[ "temp", "humidity", "conditions", "aqi"]] cities_coords = {("Amsterdam", "Netherlands"): [52.377956, 4.897070] } cols_names_dict = {"temp": "Temperature", "humidity": "Humidity", "conditions": "Conditions", "aqi": "AQI"} data_to_display = data_to_display.rename(columns=cols_names_dict) cols_ = ["Temperature", "Humidity", "AQI"] data_to_display[cols_] = data_to_display[cols_].apply(lambda x: round(x, 1)) for city, country in cities_coords: text = f"""

{city}

""" for column in data_to_display.columns: text += f""" """ text += """
Country: {country}
{column}: {data_to_display.loc[0][column]}
""" city='Amsterdam' country='Netherlands' folium.Marker( cities_coords[(city, country)], popup=text, tooltip=f"{city}" ).add_to(my_map) # call to render Folium map in Streamlit folium_static(my_map) progress_bar.progress(80) st.sidebar.write("-" * 36) model = get_model(project=project, model_name="LSTM_model", evaluation_metric="mse", sort_metrics_by="min") X=np.reshape(np.array(X),(len(X),1,len(X.columns))) preds = model.predict(X) cities = [city_tuple[0] for city_tuple in cities_coords.keys()] next_day_date = datetime.today() + timedelta(days=1) last_day_date = datetime.today() + timedelta(days=7) next_day = next_day_date.strftime ('%d/%m/%Y') last_day=last_day_date.strftime ('%d/%m/%Y') days=list() temp_sec=int(latest_date_unix) for i in range(0,7): temp_sec=temp_sec+(3600*24) days.append(time.ctime(temp_sec)[4:-14]) CQ=['Estimated AQI'] df = pd.DataFrame(data=preds,index=CQ, columns=days, dtype=int) st.sidebar.write(df) progress_bar.progress(100) st.button("Re-run") #, columns=[f"AQI Predictions from {next_day} to {last_day}"]