import gradio as gr import joblib # Define los MAE por liga (ajusta si tus resultados cambian) MAE_LIGAS = { "FIBA": 7.23, "NBA": 9.19, "Femenino": 7.45 } # Carga los modelos entrenados modelos = { "FIBA": joblib.load("mejor_modelo_fiba.pkl"), "NBA": joblib.load("mejor_modelo_nba.pkl"), "Femenino": joblib.load("mejor_modelo_femenino.pkl") } def calcular_features(home1, home2, away1, away2): q1 = home1 + away1 q2 = home2 + away2 pace = (q1 + q2) * 2 return [q1, q2, pace] def predecir(liga, home1, home2, away1, away2, linea_apuesta): modelo = modelos[liga] mae = MAE_LIGAS[liga] X = [calcular_features(home1, home2, away1, away2)] pred = modelo.predict(X)[0] total_predicho = int(pred[2]) explicacion = ( f"El MAE (error promedio) para {liga} es de {mae} puntos.\n" f"Esto significa que, en promedio, la predicción puede variar ±{mae} puntos.\n" f"\n" f"Si la diferencia entre tu predicción ({total_predicho}) y la línea de apuesta ({linea_apuesta}) " f"es menor que el MAE, la apuesta es riesgosa.\n" f"Si la diferencia es mayor que el MAE, puede haber una oportunidad de valor.\n" f"\n" f"Ejemplo: Si tu predicción es {total_predicho} y la línea es {linea_apuesta}, " f"la diferencia es {abs(total_predicho - linea_apuesta)} puntos.\n" f"{'¡Hay valor para apostar!' if abs(total_predicho - linea_apuesta) > mae else 'La diferencia es menor que el MAE, apuesta con precaución.'}" ) return { "Q3 (total)": int(pred[0]), "Q4 (total)": int(pred[1]), "Total partido": total_predicho, "MAE (Error Promedio)": mae, "Ayuda para apostar": explicacion } with gr.Blocks() as demo: gr.Markdown("# 🏀 Predicción puntos Q3, Q4 y Total") gr.Markdown( "Selecciona la liga, ingresa los puntos de cada equipo en los dos primeros cuartos, " "y la línea de apuesta (over/under) para el total de puntos del partido." ) liga = gr.Dropdown(["FIBA", "NBA", "Femenino"], label="Liga", value="FIBA") with gr.Row(): home1 = gr.Number(label="Puntos Home Q1", value=20) home2 = gr.Number(label="Puntos Home Q2", value=18) away1 = gr.Number(label="Puntos Away Q1", value=17) away2 = gr.Number(label="Puntos Away Q2", value=21) linea_apuesta = gr.Number(label="Línea de apuesta (total puntos)", value=160, info="Over/Under de la casa de apuestas") btn = gr.Button("Predecir y analizar apuesta") output = gr.JSON(label="Predicción y análisis") btn.click( predecir, inputs=[liga, home1, home2, away1, away2, linea_apuesta], outputs=output ) demo.launch()