ml_proyecto / 07_STREAMLIT_FORM.py
carloscortezasto's picture
Commit final limpio
568241b
# 07_STREAMLIT_FORM.py
import streamlit as st
import joblib
import pandas as pd
import os
from dotenv import load_dotenv # <<< AÑADIDO
# =====================
# Configuración Dinámica desde .env
# =====================
# 1. Cargar las variables desde el archivo .env
load_dotenv()
# 2. Obtener la ruta base del proyecto
ruta_base = os.getenv("PROYECTO_RUTA_BASE")
# 3. Validar que la ruta se haya cargado correctamente (usando st.error para Streamlit)
if not ruta_base:
st.error("Error Crítico: La variable 'PROYECTO_RUTA_BASE' no se encontró en el archivo .env.")
st.stop() # Detiene la ejecución de la app si la ruta no está configurada
# <<< MODIFICADO: Las rutas ahora se construyen dinámicamente >>>
CARPETA_PROCESADO = os.path.join(ruta_base, "PROCESADO")
ARCHIVO_PIPELINE = os.path.join(CARPETA_PROCESADO, "modelo_prioridad_pipeline_FINAL.joblib") # Recomiendo usar el modelo final de tu script de comparación
ARCHIVO_CSV = os.path.join(CARPETA_PROCESADO, "reporte_mesa_ayuda_COMBINADO.csv")
# =====================
# Cargar pipeline y CSV para combobox dinámicos
# =====================
@st.cache_data(show_spinner=False)
def cargar_pipeline(path):
return joblib.load(path)
@st.cache_data(show_spinner=False)
def cargar_csv(path):
return pd.read_csv(path)
pipeline = cargar_pipeline(ARCHIVO_PIPELINE)
df_csv = cargar_csv(ARCHIVO_CSV)
# =====================
# Obtener listas dinámicas para combobox
# =====================
categorias = sorted(df_csv['Categoria'].dropna().unique())
grupos_asignados = sorted(df_csv['Grupo_Asignado'].dropna().unique())
areas_solicitantes = sorted(df_csv['Area_Solicitante'].dropna().unique())
# =====================
# Título de la app
# =====================
st.title("Predictor de Prioridad de Tickets")
st.write("📌 Ingresa los detalles del ticket y obtén la predicción automática de prioridad.")
# =====================
# Formulario de entrada con combobox dinámicos
# =====================
with st.form("form_ticket"):
categoria = st.selectbox("Categoría", categorias)
grupo_asignado = st.selectbox("Grupo Asignado", grupos_asignados)
area_solicitante = st.selectbox("Área Solicitante", areas_solicitantes)
submitted = st.form_submit_button("Predecir Prioridad")
# =====================
# Predicción
# =====================
if submitted:
# Creamos un DataFrame con el placeholder para Asunto
df_input = pd.DataFrame([{
"Categoria": categoria,
"Grupo_Asignado": grupo_asignado,
"Area_Solicitante": area_solicitante,
"Asunto": "No informado" # placeholder
}])
pred = pipeline.predict(df_input)[0]
proba = pipeline.predict_proba(df_input)[0]
st.subheader("🎯 Resultado de la predicción")
st.write(f"**Prioridad predicha:** {pred}")
st.subheader("📊 Probabilidades por clase")
for clase, p in zip(pipeline.classes_, proba):
st.write(f"- {clase}: {p:.2f}")