ml_proyecto / 08_STREAMLIT_GRILLA.py
carloscortezasto's picture
Commit final limpio
568241b
# 08_STREAMLIT_GRILLA.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
if not ruta_base:
# En Streamlit, es mejor mostrar un error en la app que lanzar una excepci贸n
st.error("Error Cr铆tico: La variable 'PROYECTO_RUTA_BASE' no se encontr贸 en el archivo .env.")
st.stop() # Detiene la ejecuci贸n del script de la app
# <<< MODIFICADO: Las rutas ahora se construyen a partir de 'ruta_base' >>>
CARPETA_PROCESADO = os.path.join(ruta_base, "PROCESADO")
ARCHIVO_PIPELINE = os.path.join(CARPETA_PROCESADO, "modelo_prioridad_pipeline_FINAL.joblib") # Aseg煤rate de usar el nombre del mejor modelo guardado
ARCHIVO_CSV = os.path.join(CARPETA_PROCESADO, "reporte_mesa_ayuda_COMBINADO.csv")
# =====================
# Cargar pipeline y CSV
# =====================
@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)
# =====================
# Compatibilidad
# =====================
if 'Asunto' not in df_csv.columns:
df_csv['Asunto'] = "No informado"
else:
df_csv['Asunto'] = df_csv['Asunto'].fillna("No informado")
# Columnas para predicci贸n
columnas_input = ['Categoria', 'Grupo_Asignado', 'Area_Solicitante', 'Asunto']
df_input = df_csv[columnas_input]
# =====================
# Predicci贸n
# =====================
df_csv['Prioridad_PREDICHA'] = pipeline.predict(df_input)
# Convertir a may煤sculas
df_csv['Area_Solicitante'] = df_csv['Area_Solicitante'].str.upper()
df_csv['Grupo_Asignado'] = df_csv['Grupo_Asignado'].str.upper()
df_csv['Prioridad_PREDICHA'] = df_csv['Prioridad_PREDICHA'].str.upper()
# =====================
# Agrupar por 谩rea y grupo
# =====================
df_grouped = df_csv.groupby(
['Grupo_Asignado', 'Area_Solicitante', 'Prioridad_PREDICHA']
).size().reset_index(name='Cantidad_Tickets')
# Pivot para grilla
df_pivot = df_grouped.pivot_table(
index=['Grupo_Asignado', 'Area_Solicitante'],
columns='Prioridad_PREDICHA',
values='Cantidad_Tickets',
fill_value=0
).reset_index()
# =====================
# Ordenar por Grupo_AsignADO y luego Area_SolicitANTE
# =====================
df_pivot = df_pivot.sort_values(by=['Grupo_Asignado', 'Area_Solicitante']).reset_index(drop=True)
# =====================
# Resaltar la mayor prioridad por fila
# =====================
def color_max_priority(row):
styles = pd.Series("", index=row.index)
# Solo para columnas de prioridad
prioridades = ['ALTA', 'MEDIA', 'BAJA']
exist_cols = [c for c in prioridades if c in row.index]
if exist_cols:
max_val = row[exist_cols].max()
for col in exist_cols:
if row[col] == max_val and max_val > 0:
styles[col] = 'background-color: green; color: white; font-weight: bold'
return styles
# =====================
# Mostrar en Streamlit
# =====================
st.title("Dashboard de Tickets - Prioridad Predicha")
st.write("馃搶 Resumen agrupado por Grupo y 脕rea. La prioridad con mayor cantidad se pinta de verde.")
st.dataframe(df_pivot.style.apply(color_max_priority, axis=1))