# -*- 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"""
Linear Regression |
Decision Tree |
Random Forest |
LSTM |
{html_rows}
"""
# 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""
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)