# -*- coding: utf-8 -*- """DashBoard.ipynb Automatically generated by Colab. Original file is located at https://colab.research.google.com/drive/101_T8xMCWHcohzgIs8NvdK3wYK7h7lwO """ import gradio as gr import pandas as pd import pickle import numpy as np from tensorflow.keras.models import load_model # تحميل النماذج من المجلد المحلي with open("Models/Feature_Scaler.pkl", "rb") as f: scaler = pickle.load(f) with open("Models/target_scaler.pkl", "rb") as f: target_scaler = pickle.load(f) with open("Models/LR_model.pkl", "rb") as f: linear_model = pickle.load(f) with open("Models/DT_model.pkl", "rb") as f: dt_model = pickle.load(f) with open("Models/RF_model.pkl", "rb") as f: rf_model = pickle.load(f) lstm_model = load_model("Models/best_model.h5") # Create sequences for LSTM def create_sequences(data, window_size=11): sequences = [] for i in range(len(data) - window_size + 1): seq = data[i:i+window_size] sequences.append(seq) return np.array(sequences).astype('float32') # Data processing and alert function def process_and_alert(file): try: df = pd.read_csv(file.name) df["timestamp"] = pd.to_datetime(df["timestamp"]) df = df.sort_values("timestamp").reset_index(drop=True) df["fault_flag"] = df["status"].apply(lambda x: 1 if x == "fault" else 0) fault_indices = df[df["fault_flag"] == 1].index.tolist() time_to_failure = [] for i in range(len(df)): next_faults = [j for j in fault_indices if j >= i] if next_faults: seconds = (df.loc[next_faults[0], "timestamp"] - df.loc[i, "timestamp"]).total_seconds() else: seconds = None time_to_failure.append(seconds) df["time_to_failure"] = time_to_failure df.dropna(inplace=True) X = df.drop(columns=['time_to_failure', 'fault_flag', 'status', 'timestamp']) X_scaled = scaler.transform(X) # LSTM processing window_size = 11 if len(X_scaled) < window_size: raise ValueError(f"Model requires at least {window_size} samples!") X_seq = create_sequences(X_scaled, window_size) # Predictions pred_linear = linear_model.predict(X_scaled) pred_dt = dt_model.predict(X_scaled) pred_rf = rf_model.predict(X_scaled) pred_lstm = lstm_model.predict(X_seq) # Align lengths min_length = min(len(pred_linear), len(pred_dt), len(pred_rf), len(pred_lstm)) pred_linear = pred_linear[:min_length] pred_dt = pred_dt[:min_length] pred_rf = pred_rf[:min_length] pred_lstm = pred_lstm[:min_length] # Inverse transform pred_lstm = target_scaler.inverse_transform(pred_lstm.reshape(-1, 1)) pred_linear = target_scaler.inverse_transform(pred_linear.reshape(-1, 1)) pred_dt = target_scaler.inverse_transform(pred_dt.reshape(-1, 1)) pred_rf = target_scaler.inverse_transform(pred_rf.reshape(-1, 1)) def format_value(val): return f'{val:.2f} (Fault)' if val < 0 else f'{val:.2f}' html_rows = "" for i in range(min_length): html_rows += "" + "".join([ f"{format_value(pred_linear[i][0])}-second", f"{format_value(pred_dt[i][0])}-second", f"{format_value(pred_rf[i][0])}-second", f"{format_value(pred_lstm[i][0])}-second" ]) + "" html_table = f""" {html_rows}
Linear Regression Decision Tree Random Forest LSTM
""" # Alert System preds = { "Linear Regression": pred_linear, "Decision Tree": pred_dt, "Random Forest": pred_rf, "LSTM": pred_lstm } alerts = [] for model_name, values in preds.items(): positives = values[values > 0] if positives.size > 0: min_pos = np.min(positives) alerts.append((model_name, min_pos)) if not alerts: alert_msg = "

❌ No positive predictions found! Failure may have already occurred.

" else: alerts.sort(key=lambda x: x[1]) best_model, time_left = alerts[0] minutes = int(time_left // 60) seconds = int(time_left % 60) color = "red" if time_left < 60 else "orange" if time_left < 180 else "green" msg = f"{minutes} minute(s) and {seconds} second(s)" if minutes > 0 else f"{seconds} second(s)" alert_msg = f"""

🔔 Failure Alert

Model: {best_model}

Estimated time to failure: {msg}

{"

⚠️ Imminent failure!

" if time_left < 60 else ""}
""" return html_table, alert_msg except Exception as e: error_msg = f"

❌ Error:

{str(e)}

" return error_msg, "" # Load comparison tables def load_metrics(): return pd.read_csv("Data/Models_Metrices.csv") def load_comparison(): return pd.read_csv("Data/model_comparison_20250419_0955.csv") # Gradio UI with gr.Blocks(title="📊 Model Comparison Dashboard") as interface: with gr.Tab("📈 Model Comparison"): gr.Markdown("## 🔍 Actual vs Predicted") with gr.Row(): gr.Image(value="Images/Liner_Regresion.png", label="Linear Regression") gr.Image(value="Images/DT.png", label="Decision Tree") with gr.Row(): gr.Image(value="Images/Random_Forest.png", label="Random Forest") gr.Image(value="Images/LSTM.png", label="LSTM") gr.Markdown("### 🧮 Data Distribution") gr.Image(value="Images/Data_Dis.png", label="Data Distribution") gr.Markdown("### 📋 Model Metrics Table") gr.Dataframe(load_metrics, interactive=False) gr.Markdown("### 🆕 Best and Worst Models Table") gr.Dataframe(load_comparison, interactive=False) with gr.Tab("📁 Upload Data"): gr.Markdown("## 📥 Upload a new CSV file to analyze and detect failure") file_input = gr.File(label="Choose CSV File") output_html = gr.HTML(label="Prediction Results") alert_output = gr.HTML(label="🔔 Alert") file_input.change(fn=process_and_alert, inputs=file_input, outputs=[output_html, alert_output]) with gr.Tab("🧮 Manual Input"): gr.Markdown("""
🧾

Enter 3 features to get a prediction and failure alert

""") with gr.Row(): f1 = gr.Number(label="vibration") f2 = gr.Number(label="temperature") f3 = gr.Number(label="pressure") result_output = gr.Textbox(label="🔍 Predicted Time (seconds)", interactive=False) alert_output_ready = gr.HTML(label="🚨 Alert") def predict_and_alert_ready(x1, x2, x3): try: X_input = np.array([[x1, x2, x3]]) X_scaled = scaler.transform(X_input) pred = rf_model.predict(X_scaled).reshape(-1, 1) pred_original = target_scaler.inverse_transform(pred)[0][0] minutes = int(pred_original // 60) seconds = int(pred_original % 60) color = "red" if pred_original < 60 else "orange" if pred_original < 180 else "green" msg = f"{minutes} minute(s) and {seconds} second(s)" if minutes > 0 else f"{seconds} second(s)" alert_html = f"""

📢 Advanced Alert

Estimated time to failure: {msg}

{"

⚠️ Imminent failure!

" if pred_original < 60 else ""}
""" return f"{pred_original:.2f} seconds", alert_html except Exception as e: return "Input Error", f"

❌ {str(e)}

" btn = gr.Button("🔍 Predict Now") btn.click(predict_and_alert_ready, inputs=[f1, f2, f3], outputs=[result_output, alert_output_ready]) interface.launch(share=True)