import gradio as gr
import joblib
import pandas as pd
from pathlib import Path
# Carga tu modelo (ruta robusta relativa al archivo)
model = joblib.load("rfc_search_20251204.joblib")
def predict(IL1, WL1, IL2, WL2, QCL2, IL3, WL3, AmbientTemp, AL1, AL2, RLL2, AL3, RLL3):
# Construye un DataFrame con los nombres EXACTOS de tus features
X = pd.DataFrame([{
"A+ L1": AL1,
"I L1": IL1,
"W+ L1": WL1,
"A+ L2": AL2,
"W+ L3": WL3,
"W+ L2": WL2,
"I L2": IL2,
"Ambient Temp": AmbientTemp,
"I L3": IL3,
"R+L L2": RLL2,
"Q_C L2": QCL2,
"R+L L3": RLL3,
"A+ L3": AL3
}])
# Predicción (clasificación)
pred = model.predict(X)[0]
# Si tu modelo tiene predict_proba
proba_txt = ""
if hasattr(model, "predict_proba"):
proba = model.predict_proba(X)[0]
# Obtener las clases de forma segura (pipeline -> rf)
rf = model.named_steps["rf"] if hasattr(model, "named_steps") else model
classes = getattr(model, "classes_", None)
if classes is None:
classes = getattr(rf, "classes_", None)
if classes is not None:
pairs = [f"{c}: {p:.4f}" for c, p in zip(classes, proba)]
proba_txt = " " + ", ".join(pairs)
else:
proba_txt = " " + ", ".join([f"{p:.4f}" for p in proba])
return pred, proba_txt
title_html = (
"
"
"

"
"
"
"UOC - TFM - Salvador Bordón Ruano
"
"Detección de averías en Centros de Transformación de media a baja tensión
"
"Validador de modelo (RandomForestClassifier)
"
)
demo = gr.Interface(
fn=predict,
inputs=[
gr.Number(label="I L1: Phase current L1-N" ), # IL1
gr.Number(label="W+ L1: Active power L1-N"), # WL1
gr.Number(label="I L2: Phase Current L2-N"), # IL2
gr.Number(label="W+ L2: Active power L2-N"), # WL2
gr.Number(label="Q_C L2: Capacitive Reactive power L2-N"), # QCL2
gr.Number(label="I L3: Phase Current L3-N"), # IL3
gr.Number(label="W+ L3: Active power L3-N"), # WL3
gr.Number(label="Ambient Temp: Ambient Temperature"), # AmbientTemp
gr.Number(label="A+ L1: Import active energy L1-N"), # AL1
gr.Number(label="A+ L2: Import active energy L2-N"), # AL2
gr.Number(label="R+L L2: Reactive Inductive Energy L2-N"), # RLL2
gr.Number(label="A+ L3: Import active energy L3-N"), # AL3
gr.Number(label="R+L L3: Reactive Inductive Energy L3-N") # RLL3
],
outputs=[gr.Textbox(label="Resultado"), gr.Textbox(label="Probabilidades")],
title=title_html,
description="Introducir los valores de las características para obtener la predicción. Los campos a informar son las características seleccionadas para entrenar el modelo."
)
if __name__ == "__main__":
demo.launch() # local