AM-MLOps/POD_System_Sensor_Data
1
1# Loading packages2from datetime import datetime, timedelta3import joblib4import pandas as pd5import numpy as np6import matplotlib.pyplot as plt7import warnings8import hopsworks9import streamlit as st10import json11import os12import seaborn as sns13import time14import random15from sklearn.preprocessing import StandardScaler16 17# Configuring the web page and setting the page title and icon18st.set_page_config(19 page_title='Parking Occupacy Detection',20 page_icon='🅿️',21 initial_sidebar_state='expanded')22 23# Ignoring filtering warnings24warnings.filterwarnings("ignore")25 26# Setting the title and adding text27st.title('Parking Occupancy Detection')28 29# Defining functions30def fill_nan_with_zero(value):31 if pd.isna(value):32 return 033 else:34 return value35 36# Getting current time and yesterday37now = datetime.now() + timedelta(hours=2)38yesterday = now - timedelta(days=1)39 40# Defining scaler41scaler = StandardScaler()42 43# Creating tabs for the different features of the application44tab1,tab2 = st.tabs(['Parking place near Building', 'Parking place near Bikelane'])45 46with tab1:47 # Logging in to Hopsworks and loading the feature store48 project = hopsworks.login(project = "alaborg", api_key_value=os.environ['HOPSWORKS_API_KEY'])49 fs = project.get_feature_store()50 51 # Function to load the building models52 53 @st.cache_data()54 def get_building_mag_model(project=project):55 mr = project.get_model_registry()56 building_mag_model = mr.get_model("building_mag_hist_model", version = 2)57 building_mag_model_dir = building_mag_model.download()58 return joblib.load(building_mag_model_dir + "/building_mag_hist_model.pkl")59 60 # Retrieving model61 building_mag_hist_model = get_building_mag_model()62 63 @st.cache_data()64 def get_building_rad_model(project=project):65 mr = project.get_model_registry()66 building_rad_model = mr.get_model("building_rad_hist_model", version = 2)67 building_rad_model_dir = building_rad_model.download()68 return joblib.load(building_rad_model_dir + "/building_rad_hist_model.pkl")69 70 # Retrieving model71 building_rad_hist_model = get_building_rad_model()72 73 # Loading the feature group with latest data for building74 new_building_fg = fs.get_feature_group(name = 'new_building_fg', version = 1)75 76 # Function to loading the feature group with latest data for building as a dataset77 @st.cache_data()78 def retrieve_building(feature_group=new_building_fg):79 new_building_fg = feature_group.select_all()80 df_building_new = new_building_fg.read(read_options={"use_hive": True}) 81 return df_building_new82 83 # Retrieving building data84 building_new = retrieve_building()85 86 col1, col2 = st.columns(2)87 88 with col1:89 st.subheader("Magnetic field prediction")90 91 # Making the predictions and getting the latest data for magnetic field data92 building_mag_prediction_data = building_new[['time', 'x', 'y', 'z', 'temperature', 'et0_fao_evapotranspiration']] 93 building_mag_prediction_data['et0_fao_evapotranspiration'] = building_mag_prediction_data['et0_fao_evapotranspiration'].apply(fill_nan_with_zero)94 building_mag_most_recent_prediction = building_mag_prediction_data[['x', 'y', 'z', 'temperature', 'et0_fao_evapotranspiration']]95 building_mag_most_recent_prediction = building_mag_hist_model.predict(building_mag_most_recent_prediction)96 building_mag_prediction_data['Status'] = building_mag_most_recent_prediction97 building_mag_prediction_data['Status'].replace(['detection', 'no_detection'], ['Vehicle detected', 'No vehicle detected'], inplace=True)98 building_mag_prediction_data = building_mag_prediction_data.rename(columns={'time': 'Time'})99 building_mag_prediction_data = building_mag_prediction_data.set_index(['Time'])100 st.dataframe(building_mag_prediction_data[['Status']].tail(3))101 102 with col2:103 st.subheader("Radar prediction")104 105 # Making the predictions and getting the latest data for radar data106 building_rad_prediction_data = building_new[['time', 'radar_0', 'radar_1', 'radar_2', 'radar_3', 'radar_4', 'radar_5', 'radar_6', 'radar_7', 'temperature', 'et0_fao_evapotranspiration']] 107 building_rad_prediction_data['et0_fao_evapotranspiration'] = building_rad_prediction_data['et0_fao_evapotranspiration'].apply(fill_nan_with_zero)108 building_rad_most_recent_prediction = building_rad_prediction_data[['radar_0', 'radar_1', 'radar_2', 'radar_3', 'radar_4', 'radar_5', 'radar_6', 'radar_7', 'temperature', 'et0_fao_evapotranspiration']]109 building_rad_most_recent_prediction = building_rad_hist_model.predict(building_rad_most_recent_prediction)110 building_rad_prediction_data['Status'] = building_rad_most_recent_prediction111 building_rad_prediction_data['Status'].replace(['detection', 'no_detection'], ['Vehicle detected', 'No vehicle detected'], inplace=True)112 building_rad_prediction_data = building_rad_prediction_data.rename(columns={'time': 'Time'})113 building_rad_prediction_data = building_rad_prediction_data.set_index(['Time'])114 st.dataframe(building_rad_prediction_data[['Status']].tail(3))115 116 # Update button117 if st.button("Update Building"):118 # Clear cached data119 st.cache_data.clear()120 # Immediately rerun the application121 st.experimental_rerun()122 123 # Creating plot for latest magnetic field data for building124 # Filtering building_new for specific time125 building_mag_specific_time_range = building_new[(building_new['time'] >= yesterday) & (building_new['time'] <= now)]126 127 # Defining magnetic field data to normalise128 building_mag_to_normalize = building_mag_specific_time_range[['x', 'y', 'z']]129 130 # Applying StandardScaler131 normalized_building_mag = scaler.fit_transform(building_mag_to_normalize) 132 133 # Adding normalized data back to the DataFrame134 building_mag_specific_time_range[['x', 'y', 'z']] = normalized_building_mag135 136 # Streamlit plotting137 st.subheader('Normalized values of magnetic field data from yesterday to today')138 139 # Converting the time column to string for better readability in Streamlit plots140 building_mag_specific_time_range['time'] = building_mag_specific_time_range['time'].astype(str)141 142 # Plotting using Streamlit's line chart143 st.line_chart(building_mag_specific_time_range.set_index('time')[['x', 'y', 'z']])144 145 # Creating plot for latest radar data for building146 # Filtering building_new for specific time147 building_rad_specific_time_range = building_new[(building_new['time'] >= yesterday) & (building_new['time'] <= now)]148 149 # Defining magnetic field data to normalise150 building_rad_to_normalize = building_rad_specific_time_range[['radar_0', 'radar_1', 'radar_2', 'radar_3', 'radar_4', 'radar_5', 'radar_6', 'radar_7']]151 152 # Applying StandardScaler153 normalized_building_rad = scaler.fit_transform(building_rad_to_normalize) 154 155 # Adding normalized data back to the DataFrame156 building_rad_specific_time_range[['radar_0', 'radar_1', 'radar_2', 'radar_3', 'radar_4', 'radar_5', 'radar_6', 'radar_7']] = normalized_building_rad157 158 # Streamlit plotting159 st.subheader('Normalized values of radar data from yesterday to today')160 161 # Converting the time column to string for better readability in Streamlit plots162 building_rad_specific_time_range['time'] = building_rad_specific_time_range['time'].astype(str)163 164 # Plotting using Streamlit's line chart165 st.line_chart(building_rad_specific_time_range.set_index('time')[['radar_0', 'radar_1', 'radar_2', 'radar_3', 'radar_4', 'radar_5', 'radar_6', 'radar_7']])166 167with tab2:168 169 # Function to load the bikelane models170 171 @st.cache_data()172 def get_bikelane_mag_model(project=project):173 mr = project.get_model_registry()174 bikelane_mag_model = mr.get_model("bikelane_mag_hist_model", version = 2)175 bikelane_mag_model_dir = bikelane_mag_model.download()176 return joblib.load(bikelane_mag_model_dir + "/bikelane_mag_hist_model.pkl")177 178 # Retrieving model179 bikelane_mag_hist_model = get_bikelane_mag_model()180 181 @st.cache_data()182 def get_bikelane_rad_model(project=project):183 mr = project.get_model_registry()184 bikelane_rad_model = mr.get_model("bikelane_rad_hist_model", version = 2)185 bikelane_rad_model_dir = bikelane_rad_model.download()186 return joblib.load(bikelane_rad_model_dir + "/bikelane_rad_hist_model.pkl")187 188 # Retrieving model189 bikelane_rad_hist_model = get_bikelane_rad_model()190 191 # Loading the feature group with latest data for bikelane192 new_bikelane_fg = fs.get_feature_group(name = 'new_bikelane_fg', version = 1)193 194 # Function to loading the feature group with latest data for bikelane as a dataset195 @st.cache_data()196 def retrieve_bikelane(feature_group=new_bikelane_fg):197 new_bikelane_fg = feature_group.select_all()198 df_bikelane_new = new_bikelane_fg.read(read_options={"use_hive": True}) 199 return df_bikelane_new200 201 # Retrieving bikelane data202 bikelane_new = retrieve_bikelane()203 204 col1, col2 = st.columns(2)205 206 with col1: 207 st.subheader("Magnetic field prediction")208 # Making the predictions and getting the latest data for magnetic field data209 bikelane_mag_prediction_data = bikelane_new[['time', 'x', 'y', 'z', 'temperature', 'et0_fao_evapotranspiration']] 210 bikelane_mag_prediction_data['et0_fao_evapotranspiration'] = bikelane_mag_prediction_data['et0_fao_evapotranspiration'].apply(fill_nan_with_zero)211 bikelane_mag_most_recent_prediction = bikelane_mag_prediction_data[['x', 'y', 'z', 'temperature', 'et0_fao_evapotranspiration']]212 bikelane_mag_most_recent_prediction = bikelane_mag_hist_model.predict(bikelane_mag_most_recent_prediction)213 bikelane_mag_prediction_data['Status'] = bikelane_mag_most_recent_prediction214 bikelane_mag_prediction_data['Status'].replace(['detection', 'no_detection'], ['Vehicle detected', 'No vehicle detected'], inplace=True)215 bikelane_mag_prediction_data = bikelane_mag_prediction_data.rename(columns={'time': 'Time'})216 bikelane_mag_prediction_data = bikelane_mag_prediction_data.set_index(['Time'])217 st.dataframe(bikelane_mag_prediction_data[['Status']].tail(3))218 219 with col2: 220 st.subheader("Radar prediction")221 # Making the predictions and getting the latest data for radar data222 bikelane_rad_prediction_data = bikelane_new[['time', 'radar_0', 'radar_1', 'radar_2', 'radar_3', 'radar_4', 'radar_5', 'radar_6', 'radar_7', 'temperature', 'et0_fao_evapotranspiration']] 223 bikelane_rad_prediction_data['et0_fao_evapotranspiration'] = bikelane_rad_prediction_data['et0_fao_evapotranspiration'].apply(fill_nan_with_zero)224 bikelane_rad_most_recent_prediction = bikelane_rad_prediction_data[['radar_0', 'radar_1', 'radar_2', 'radar_3', 'radar_4', 'radar_5', 'radar_6', 'radar_7', 'temperature', 'et0_fao_evapotranspiration']]225 bikelane_rad_most_recent_prediction = bikelane_rad_hist_model.predict(bikelane_rad_most_recent_prediction)226 bikelane_rad_prediction_data['Status'] = bikelane_rad_most_recent_prediction227 bikelane_rad_prediction_data['Status'].replace(['detection', 'no_detection'], ['Vehicle detected', 'No vehicle detected'], inplace=True)228 bikelane_rad_prediction_data = bikelane_rad_prediction_data.rename(columns={'time': 'Time'})229 bikelane_rad_prediction_data = bikelane_rad_prediction_data.set_index(['Time'])230 st.dataframe(bikelane_rad_prediction_data[['Status']].tail(3))231 232 # Update button233 if st.button("Update Bikelane"):234 # Clear cached data235 st.cache_data.clear()236 # Immediately rerun the application237 st.experimental_rerun()238 239 # Creating plot for latest magnetic field data for bikelane240 # Filtering bikelane_new for specific time241 bikelane_mag_specific_time_range = bikelane_new[(bikelane_new['time'] >= yesterday) & (bikelane_new['time'] <= now)]242 243 # Defining magnetic field data to normalise244 bikelane_mag_to_normalize = bikelane_mag_specific_time_range[['x', 'y', 'z']]245 246 # Applying StandardScaler247 normalized_bikelane_mag = scaler.fit_transform(bikelane_mag_to_normalize) 248 249 # Adding normalized data back to the DataFrame250 bikelane_mag_specific_time_range[['x', 'y', 'z']] = normalized_bikelane_mag251 252 # Streamlit plotting253 st.subheader('Normalized values of magnetic field data from yesterday to today')254 255 # Converting the time column to string for better readability in Streamlit plots256 bikelane_mag_specific_time_range['time'] = bikelane_mag_specific_time_range['time'].astype(str)257 258 # Plotting using Streamlit's line chart259 st.line_chart(bikelane_mag_specific_time_range.set_index('time')[['x', 'y', 'z']])260 261 262 # Creating plot for latest radar data for bikelane263 # Filtering bikelane_new for specific time264 bikelane_rad_specific_time_range = bikelane_new[(bikelane_new['time'] >= yesterday) & (bikelane_new['time'] <= now)]265 266 # Defining magnetic field data to normalise267 bikelane_rad_to_normalize = bikelane_rad_specific_time_range[['radar_0', 'radar_1', 'radar_2', 'radar_3', 'radar_4', 'radar_5', 'radar_6', 'radar_7']]268 269 # Applying StandardScaler270 normalized_bikelane_rad = scaler.fit_transform(bikelane_rad_to_normalize) 271 272 # Adding normalized data back to the DataFrame273 bikelane_rad_specific_time_range[['radar_0', 'radar_1', 'radar_2', 'radar_3', 'radar_4', 'radar_5', 'radar_6', 'radar_7']] = normalized_bikelane_rad274 275 # Streamlit plotting276 st.subheader('Normalized values of radar data from yesterday to today')277 278 # Converting the time column to string for better readability in Streamlit plots279 bikelane_rad_specific_time_range['time'] = bikelane_rad_specific_time_range['time'].astype(str)280 281 # Plotting using Streamlit's line chart282 st.line_chart(bikelane_rad_specific_time_range.set_index('time')[['radar_0', 'radar_1', 'radar_2', 'radar_3', 'radar_4', 'radar_5', 'radar_6', 'radar_7']])