import streamlit as st import numpy as np import pandas as pd import time import joblib as jb from sklearn.pipeline import Pipeline import plotly.express as px import matplotlib.pyplot as plt import seaborn as sns from sklearn.ensemble import IsolationForest st.set_page_config( page_title="Dashboard", page_icon='H' ) st.markdown(""" """ , unsafe_allow_html=True) st.sidebar.success('Pages') data = pd.read_csv('demonstrate_data.csv') health = jb.load('predict.pkl') prep = jb.load('prep.pkl') anomaly = jb.load('anomaly.pkl') features = ['Pressure (psi)', 'Temperature (°C)', 'Oil Flow (L/min)', 'Vibration (mm/s)','Oil Level (%)' ,'Tool RPM (rpm)' ,'Current (A)'] health_ft = ['Temperature (°C)','Tool RPM (rpm)'] pressure_cond = 'Normal' temp_cond = 'Normal' oil_cond = 'Normal' rpm_cond = 'Normal' with open ('style.css') as f: st.markdown(f'', unsafe_allow_html=True) def checks(i): pressure_psi = data.loc[i,'Pressure (psi)'] temperature_c = data.loc[i,'Temperature (°C)'] vibration_mm_s = data.loc[i,'Vibration (mm/s)'] oil_level_percent = data.loc[i,'Oil Level (%)'] tool_rpm_rpm = data.loc[i,'Tool RPM (rpm)'] global pressure_cond, temp_cond, oil_cond, rpm_cond,vib_cond if pressure_psi > data['Pressure (psi)'].quantile(0.98): pressure_cond = 'Warning! Too High' elif pressure_psi < data['Pressure (psi)'].quantile(0.02): pressure_cond = 'Warning! Too Low' else: pressure_cond = 'Normal' if temperature_c > data['Temperature (°C)'].quantile(0.98): temp_cond = 'Warning! Too High' else: temp_cond = 'Normal' if oil_level_percent < data['Oil Level (%)'].quantile(0.02): oil_cond = 'Warning! Too Low' else: oil_cond = 'Normal' if tool_rpm_rpm > data['Tool RPM (rpm)'].quantile(0.98): rpm_cond = 'Warning! Too High' elif tool_rpm_rpm < data['Tool RPM (rpm)'].quantile(0.02): rpm_cond = 'Warning! Too Low' else: rpm_cond = 'Normal' if vibration_mm_s > data['Vibration (mm/s)'].quantile(0.98): vib_cond = 'Warning! Too High' elif vibration_mm_s < data['Vibration (mm/s)'].quantile(0.02): vib_cond = 'Warning! Too Low' else: vib_cond = 'Normal' return pressure_cond,temp_cond,oil_cond,rpm_cond def predict_health(i): k = pd.DataFrame(data.loc[i,health_ft]).T feature_map = {'Temperature (°C)':'Process temperature','Tool RPM (rpm)':'Rotational speed'} features = ['Process temperature','Rotational speed'] k = k.rename(columns=feature_map) k = prep.fit_transform(k) pred = health.predict(k) if pred != 0: x = 'Likely' else: x = 'Unlikely' return x def predict_anomaly(i): pred = anomaly.predict(pd.DataFrame(data.loc[i,features]).T) if pred==-1: x = 'Abnormal' else: x = 'Normal' return x st.title("Dashboard") update_interval = 1 update_interval = st.slider(min_value=1,max_value=5,value=None,label='Speed') placeholder = st.empty() run = [] run = pd.DataFrame(run,columns=data.columns) anom = data for i in range(1,len(data)): checks(i) with placeholder.container(): element1,element2,element3 = st.columns(3) e4, e5, e6 = st.columns(3) e7, e8 = st.columns(2) e9, e10 = st.columns(2) d1,d2= st.columns(2) d3,d4= st.columns(2) d5, machine_health= st.columns(2) element1.metric(value=data.loc[i,'Pressure (psi)'],label='Pressure (psi)',delta=round((data.loc[i,'Pressure (psi)']-data.loc[i-1,'Pressure (psi)']))) element2.metric(value=data.loc[i,'Temperature (°C)'],label='Temperature (°C)',delta=round((data.loc[i,'Temperature (°C)']-data.loc[i-1,'Temperature (°C)']))) element3.metric(value=data.loc[i,'Oil Flow (L/min)'],label='Oil Flow (L/min)',delta=round((data.loc[i,'Oil Flow (L/min)']-data.loc[i-1,'Oil Flow (L/min)']))) e4.metric(value=data.loc[i,'Vibration (mm/s)'],label='Vibration (mm/s)',delta=round((data.loc[i,'Vibration (mm/s)']-data.loc[i-1,'Vibration (mm/s)']))) e5.metric(value=data.loc[i,'Power Status'],label='Power Status') e6.metric(value=data.loc[i,'Oil Level (%)'],label='Oil Level (%)',delta=round((data.loc[i,'Oil Level (%)']-data.loc[i-1,'Oil Level (%)']))) e7.metric(value=data.loc[i,'Tool RPM (rpm)'],label='Tool RPM (rpm)',delta=round((data.loc[i,'Tool RPM (rpm)']-data.loc[i-1,'Tool RPM (rpm)']))) e8.metric(value=data.loc[i,'Current (A)'],label='Current (A)',delta=round((data.loc[i,'Current (A)']-data.loc[i-1,'Current (A)']))) e9.metric(value=data.loc[i,'Machine Status'],label='Machine Status') e10.metric(value=predict_anomaly(i),label='Anomaly') d1.metric(label=f"Pressure Levels", value=pressure_cond) d2.metric(label=f"Temperature Levels", value=temp_cond) d3.metric(label=f"Oil Levels", value=oil_cond) d4.metric(label=f"RPM Levels", value=rpm_cond) d5.metric(label=f"Vibration Levels", value=vib_cond) machine_health.metric(value=predict_health(i),label='Temperature/RPM Failure') new_row = pd.Series(data.loc[i,data.columns]) #un = run.append(new_row, ignore_index=True) new_row = pd.DataFrame(data.loc[i,:]).T run = pd.concat([run,new_row]) fig_col1, fig_col2 = st.columns(2) fig_col3, fig_col4 = st.columns(2) fig_col5, fig_col6 = st.columns(2) fig_col7 = st.empty() with fig_col1: st.markdown("Pressure (psi)") fig = px.line(data_frame=run, y = 'Pressure (psi)', x = run.index) fig.update_layout(width=350,height=350) st.write(fig) with fig_col2: st.markdown("Temperature (°C)") fig = px.line(data_frame=run, y = 'Temperature (°C)', x = run.index) fig.update_layout(width=350,height=350) st.write(fig) with fig_col3: st.markdown("Oil Flow (L/min)") fig = px.line(data_frame=run, y = 'Oil Flow (L/min)', x = run.index) fig.update_layout(width=350,height=350) st.write(fig) with fig_col4: st.markdown("Tool RPM (rpm)") fig = px.line(data_frame=run, y = 'Tool RPM (rpm)', x = run.index) fig.update_layout(width=350,height=350) st.write(fig) with fig_col5: st.markdown("Vibration (mm/s)") fig = px.line(data_frame=run, y = 'Vibration (mm/s)', x = run.index) fig.update_layout(width=350,height=350) st.write(fig) with fig_col6: st.markdown("Oil Level (%)") fig = px.line(data_frame=run, y = 'Oil Level (%)', x = run.index) fig.update_layout(width=350,height=350) st.write(fig) with fig_col7: st.markdown("Current (A)") fig = px.line(data_frame=run, y = 'Current (A)', x = run.index) fig.update_layout(width=350,height=350) st.write(fig) time.sleep(1/update_interval)