# import requests for interacting with backend import requests # import streamlit library for IO import streamlit as st # import pandas import pandas as pd # --------------------------------------------------------- # PAGE CONFIG # --------------------------------------------------------- st.set_page_config( page_title="Predictive Maintenenace App", layout="wide" ) # --------------------------------------------------------- # TITLE # --------------------------------------------------------- #st.title("🏖️ Predict Engine Maintenance") #st.write("The Predict Maintenance app is a tool to predict if an Engine needs any maintenance based on provided operating sensor parameters.") #st.write("Fill in the details below and click **Predict** to see if the Engine needs maintenance to prevent from failure.") # ----------------------------- # Title & Description # ----------------------------- st.markdown(""" """, unsafe_allow_html=True) # --------------------------------------------------------- # Set Page TITLE and additional information for consumer # --------------------------------------------------------- st.title("🏖️ Predict Maintenance") st.markdown(""" The Predict Maintenance app help to predict if an engine needs maintenance based on operating sensor parameters. *Suggested ranges are based on known information - input is not restricted to the specified range* """) # generic function to provide input # this is provided as an utiity to bring consistent user interface # currently few parameters are used, rest or for later expansion def formatted_number_input(title, hint, minval, maxval, defvalue, steps, valformat="%.4f"): st.markdown('
', unsafe_allow_html=True) user_input = st.number_input( label=f"{title} ({hint})", #min_value=minval, #max_value=maxval, value=defvalue, #step=steps, format=valformat, #label_visibility="collapsed" ) return user_input st.markdown(""" """, unsafe_allow_html=True) # ==================================== # Section : Capture Engine Parameters # ==================================== #st.subheader ("Engine Parameters") # divide UI into two column layout by defining two columns # left column is used for input and right for output col_inputs, col_output = st.columns([3, 1.5]) # update contnent (input) in left input column with col_inputs: # using form for usre input, this proivides elegant interface with st.form("engine_form"): # set header string st.subheader("🔧 Engine Parameters") # create two columsn so we can spread the input into two columns col_left, col_right = st.columns(2) # define inputs in left column with col_left: rpm = formatted_number_input( "Engine RPM", "50 to 2500", minval=50.0, maxval=2500.0, defvalue=735.0, steps=10.0, valformat="%.2f" ) oil_pressure = formatted_number_input( "Lubricating oil pressure in kPa", "0.001 to 10.0", minval=0.001, maxval=10.0, defvalue=3.300000, steps=0.001, valformat="%.6f" ) fuel_pressure = formatted_number_input( "Fuel Pressure in kPa", "0.01 to 25.0", minval=0.01, maxval=25.0, defvalue=6.500000, steps=0.01, valformat="%.6f" ) # define inputs in left column with col_right: coolant_pressure = formatted_number_input( "Coolant Pressure in kPa", "0.01 to 10.0", minval=0.01, maxval=10.0, defvalue=2.250000, steps=0.10, valformat="%.6f" ) lub_oil_temp = formatted_number_input( "Lubricating oil Temperature in °C", "50.0 to 100.0", minval=50.0, maxval=100.0, defvalue=75.0, steps=0.1, valformat="%.6f" ) coolant_temp = formatted_number_input( "Coolant Temperature in °C", "50.0 to 200.0", minval=50.0, maxval=200.0, defvalue=75.000000, steps=0.1, valformat="%.6f" ) submitted = st.form_submit_button("🚀 Check Maintenance") with col_output: # define place holders for output display output_placeholder = st.empty() probability_placeholder = st.empty() details_placeholder = st.empty() # ========================== # Single Value Prediction # ========================== with st.expander("🧠 Prediction Result", expanded=True): # dispaly result only after submit is done if submitted: # extract the data collected into a structure input_data = { 'Engine_rpm' : float(rpm), 'Lub_oil_pressure' : float(oil_pressure), 'Fuel_pressure' : float(fuel_pressure), 'Coolant_pressure' : float(coolant_pressure), 'lub_oil_temp' : float(lub_oil_temp), 'Coolant_temp' : float(coolant_temp), } input_df = pd.DataFrame([input_data]) response = requests.post ( "https://harishsohani-AIMLProjectTestBackEnd.hf.space/v1/EngPredMaintenance", json=input_data ) if response.status_code == 200: ## get result as json result = response.json () resp_status = result.get ("status") if resp_status == "success": ## Get Sales Prediction, probability Values prediction_from_backend = result.get ("prediction") # Extract only the value probability = result.get ("probability") # Extract only the value # convert probability into % for representation formatted_prob = f"{probability * 100:.2f}%" # generate output string if prediction_from_backend == 1: output_placeholder.error("⚠️ Engine likely needs maintenance") else: output_placeholder.success("✅ Engine operating normally") # dispaly probability of failur metric probability_placeholder.metric("Failure Probability", formatted_prob) # Display additional information details_placeholder.markdown(f""" *Model :* XGBoost *Inference :* Real-time *Note* : Probability of 50% and above is considered to suggested for Maintenance. """) else: error_str = result.get ("message") output_placeholder.error(f"⚠️ {error_str}") elif response.status_code == 400 or response.status_code == 500: # known errors ## get result as json result = response.json () # get error message error_str = result.get ("message") # show error message output_placeholder.error(f"⚠️ Error processing request- Status Code : {response.status_code}, error : {error_str}") else: output_placeholder.error(f"⚠️ Error processing request- Status Code : {response.status_code}") # ============================== # Batch Prediction # ============================== st.markdown("---") st.subheader ("Batch Prediction for Engine Maintenance") st.markdown(""" *Select csv file with engine sensor parameters to find prediction for all readings* """) file = st.file_uploader ("Upload CSV file", type=["csv"]) if file is not None and st.button("🚀 Check Maintenance"): inputfile = {"file": (file.name, file.getvalue(), "text/csv")} response = requests.post( "https://harishsohani-AIMLProjectTestBackEnd.hf.space/v1/EngPredMaintenanceForBatch", files=inputfile ) if response.status_code == 200: result = response.json () resp_status = result.get ("status") if resp_status == "success": ## Get Sales Prediction Value predictions_from_backend = result.get ("predictions") # Extract only the value ## get probabbilities from back end probabilities = result.get ("probabilities") # Extract only the value # read input data into data frame input_df = pd.read_csv(file) # Ensure lengths match if len(predictions_from_backend) == len(input_df): # Add prediction and probability column input_df["Prediction"] = predictions_from_backend input_df["Probability"] = probabilities st.success("Batch prediction completed successfully") st.markdown(""" *Prediction : 1 deontes Maintenance is needed* *Probability : Indicates failure probability and value ranges from 0.0 to 1.0. Value of 0.5 (50%) and above is suggested for Maintenance* """) # Show combined dataframe st.dataframe(input_df, use_container_width=True) else: st.error("Prediction count does not match input records") else: error_str = result.get ("message") st.error(error_str) elif response.status_code == 400 or response.status_code == 500: # known errors ## get result as json result = response.json () error_str = result.get ("message") st.error (f"Error processing request- Status Code : {response.status_code}, error : {error_str}") else: st.error (f"Error processing request- Status Code : {response.status_code}")