Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import joblib | |
| import pandas as pd | |
| # Cargar modelos entrenados | |
| MODELOS = { | |
| "Femenino - Random Forest": joblib.load("fem_modelos_rf_sin_leakage.pkl"), | |
| "Femenino - XGBoost": joblib.load("fem_modelos_xgb_sin_leakage.pkl"), | |
| "FIBA - Random Forest": joblib.load("fiba_modelos_rf_sin_leakage.pkl"), | |
| "FIBA - XGBoost": joblib.load("fiba_modelos_xgb_sin_leakage.pkl"), | |
| "NBA - Random Forest": joblib.load("nba_modelos_rf_sin_leakage.pkl"), | |
| "NBA - XGBoost": joblib.load("nba_modelos_xgb_sin_leakage.pkl"), | |
| } | |
| # MAEs hist贸ricos (ajusta si cambian) | |
| MAES = { | |
| "Femenino - Random Forest": {"3er cuarto": 4.50, "4to cuarto": 4.15, "Tiempo completo": 4.49}, | |
| "Femenino - XGBoost": {"3er cuarto": 4.66, "4to cuarto": 4.65, "Tiempo completo": 4.86}, | |
| "FIBA - Random Forest": {"3er cuarto": 4.46, "4to cuarto": 4.38, "Tiempo completo": 4.52}, | |
| "FIBA - XGBoost": {"3er cuarto": 4.63, "4to cuarto": 4.67, "Tiempo completo": 4.85}, | |
| "NBA - Random Forest": {"3er cuarto": 5.35, "4to cuarto": 4.88, "Tiempo completo": 5.06}, | |
| "NBA - XGBoost": {"3er cuarto": 5.57, "4to cuarto": 5.13, "Tiempo completo": 5.36}, | |
| } | |
| def maes_table(): | |
| maes_df = pd.DataFrame(MAES).T | |
| maes_df.index.name = "Modelo" | |
| return maes_df.reset_index() | |
| def predecir_puntos( | |
| modelo_nombre, | |
| home_1, home_2, home_3, | |
| away_1, away_2, away_3 | |
| ): | |
| h1 = home_1 if home_1 is not None else 0 | |
| h2 = home_2 if home_2 is not None else 0 | |
| h3 = home_3 if home_3 is not None else 0 | |
| a1 = away_1 if away_1 is not None else 0 | |
| a2 = away_2 if away_2 is not None else 0 | |
| a3 = away_3 if away_3 is not None else 0 | |
| modelos = MODELOS[modelo_nombre] | |
| pred_3 = pred_4 = pred_total = "" | |
| # Predicci贸n del 3er cuarto (si solo hay 1er y 2do cuarto) | |
| if (h3 == 0 and a3 == 0) and (h1 != 0 or h2 != 0 or a1 != 0 or a2 != 0): | |
| pace = h1 + h2 + a1 + a2 | |
| X3 = [[h1, h2, a1, a2, pace]] | |
| pred_3 = modelos["tercer_cuarto"].predict(X3)[0] | |
| pred_3 = f"{pred_3:.2f} puntos (predicci贸n 3er cuarto)" | |
| else: | |
| pred_3 = "No disponible (ya jugado o faltan datos)" | |
| # Predicci贸n del 4to cuarto y total (si hay hasta 3er cuarto) | |
| if h3 != 0 or a3 != 0: | |
| pace = h1 + h2 + h3 + a1 + a2 + a3 | |
| X4 = [[h1, h2, h3, a1, a2, a3, pace]] | |
| pred_4 = modelos["cuarto_cuarto"].predict(X4)[0] | |
| pred_4 = f"{pred_4:.2f} puntos (predicci贸n 4to cuarto)" | |
| pred_total = modelos["tiempo_completo"].predict(X4)[0] | |
| pred_total = f"{pred_total:.2f} puntos (predicci贸n tiempo completo)" | |
| else: | |
| pred_4 = "No disponible (faltan datos de 3er cuarto)" | |
| pred_total = "No disponible (faltan datos de 3er cuarto)" | |
| return pred_3, pred_4, pred_total, maes_table() | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# Predicci贸n de Puntos por Cuarto y Tiempo Completo") | |
| gr.Markdown( | |
| "Selecciona la liga/modelo, ingresa los puntos de los cuartos jugados para ambos equipos (deja en blanco los que no han ocurrido)." | |
| ) | |
| with gr.Row(): | |
| modelo_input = gr.Dropdown(choices=list(MODELOS.keys()), label="Liga y Modelo") | |
| with gr.Row(): | |
| home_1_input = gr.Number(label="Puntos Home 1er cuarto", value=None) | |
| home_2_input = gr.Number(label="Puntos Home 2do cuarto", value=None) | |
| home_3_input = gr.Number(label="Puntos Home 3er cuarto", value=None) | |
| with gr.Row(): | |
| away_1_input = gr.Number(label="Puntos Away 1er cuarto", value=None) | |
| away_2_input = gr.Number(label="Puntos Away 2do cuarto", value=None) | |
| away_3_input = gr.Number(label="Puntos Away 3er cuarto", value=None) | |
| with gr.Row(): | |
| pred3_output = gr.Textbox(label="Predicci贸n 3er cuarto") | |
| pred4_output = gr.Textbox(label="Predicci贸n 4to cuarto") | |
| predtotal_output = gr.Textbox(label="Predicci贸n tiempo completo") | |
| gr.Markdown("## Tabla de MAEs hist贸ricos") | |
| maes_output = gr.Dataframe(value=maes_table(), interactive=False) | |
| def wrapper(modelo, h1, h2, h3, a1, a2, a3): | |
| p3, p4, pt, maes_df = predecir_puntos(modelo, h1, h2, h3, a1, a2, a3) | |
| return p3, p4, pt, maes_df | |
| gr.Button("Predecir").click( | |
| wrapper, | |
| inputs=[modelo_input, home_1_input, home_2_input, home_3_input, away_1_input, away_2_input, away_3_input], | |
| outputs=[pred3_output, pred4_output, predtotal_output, maes_output] | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch() | |