#!/usr/bin/env python # coding: utf-8 # In[ ]: import os import pandas as pd import pickle import gradio as gr import numpy as np import pandas as pd import base64 # Carga modelo with open("modelo_random_forest.pkl", "rb") as file: model = pickle.load(file) # Carga datos ruta_datos = "datos_premier_consolidado.csv" df = pd.read_csv(ruta_datos, encoding="utf-8", delimiter=";") RUTA_ESCUDOS = "ESCUDOS" estadios = { 'Arsenal': {'estadio': 'Emirates Stadium', 'capacidad': 60383}, 'Aston Villa': {'estadio': 'Villa Park', 'capacidad': 42824}, 'Birmingham': {'estadio': 'St Andrew\'s', 'capacidad': 29409}, 'Blackburn': {'estadio': 'Ewood Park', 'capacidad': 31367}, 'Blackpool': {'estadio': 'Bloomfield Road', 'capacidad': 16750}, 'Bolton': {'estadio': 'University of Bolton Stadium', 'capacidad': 28723}, 'Bournemouth': {'estadio': 'Vitality Stadium', 'capacidad': 11307}, 'Brentford': {'estadio': 'Gtech Community Stadium', 'capacidad': 17250}, 'Brighton': {'estadio': 'American Express Community Stadium', 'capacidad': 31872}, 'Burnley': {'estadio': 'Turf Moor', 'capacidad': 22546}, 'Cardiff': {'estadio': 'Cardiff City Stadium', 'capacidad': 33280}, 'Charlton': {'estadio': 'The Valley', 'capacidad': 27111}, 'Chelsea': {'estadio': 'Stamford Bridge', 'capacidad': 41841}, 'Crystal Palace': {'estadio': 'Selhurst Park', 'capacidad': 26309}, 'Derby': {'estadio': 'Pride Park Stadium', 'capacidad': 33597}, 'Everton': {'estadio': 'Goodison Park', 'capacidad': 40569}, 'Fulham': {'estadio': 'Craven Cottage', 'capacidad': 25700}, 'Huddersfield': {'estadio': 'John Smith\'s Stadium', 'capacidad': 24500}, 'Hull': {'estadio': 'MKM Stadium', 'capacidad': 25400}, 'Leeds': {'estadio': 'Elland Road', 'capacidad': 40204}, 'Leicester': {'estadio': 'King Power Stadium', 'capacidad': 34310}, 'Liverpool': {'estadio': 'Anfield', 'capacidad': 61276}, 'Luton': {'estadio': 'Kenilworth Road', 'capacidad': 10356}, 'Man City': {'estadio': 'Etihad Stadium', 'capacidad': 55097}, 'Man United': {'estadio': 'Old Trafford', 'capacidad': 76212}, 'Middlesbrough': {'estadio': 'Riverside Stadium', 'capacidad': 34988}, 'Newcastle': {'estadio': 'St. James\' Park', 'capacidad': 52758}, 'Norwich': {'estadio': 'Carrow Road', 'capacidad': 27606}, "Nott'm Forest": {'estadio': 'The City Ground', 'capacidad': 30576}, 'Portsmouth': {'estadio': 'Fratton Park', 'capacidad': 20821}, 'QPR': {'estadio': 'Loftus Road', 'capacidad': 18360}, 'Reading': {'estadio': 'Select Car Leasing Stadium', 'capacidad': 24200}, 'Sheffield United': {'estadio': 'Bramall Lane', 'capacidad': 32702}, 'Southampton': {'estadio': 'St. Mary\'s Stadium', 'capacidad': 32689}, 'Stoke': {'estadio': 'bet365 Stadium', 'capacidad': 30089}, 'Sunderland': {'estadio': 'Stadium of Light', 'capacidad': 49000}, 'Swansea': {'estadio': 'Swansea.com Stadium', 'capacidad': 21028}, 'Tottenham': {'estadio': 'Tottenham Hotspur Stadium', 'capacidad': 62850}, 'Watford': {'estadio': 'Vicarage Road', 'capacidad': 22200}, 'West Brom': {'estadio': 'The Hawthorns', 'capacidad': 28003}, 'West Ham': {'estadio': 'London Stadium', 'capacidad': 60000}, 'Wigan': {'estadio': 'DW Stadium', 'capacidad': 25138}, 'Wolves': {'estadio': 'Molineux Stadium', 'capacidad': 34674}, 'Coventry': {'estadio': 'Coventry Building Society Arena', 'capacidad': 32609}, 'Bradford': {'estadio': 'Valley Parade', 'capacidad': 25136} # Añadir todos los demás estadios aquí } # Funciones auxiliares def obtener_escudo(equipo): ruta = os.path.join(RUTA_ESCUDOS, f"{equipo}.png") if os.path.exists(ruta): with open(ruta, "rb") as img_file: img_base64 = base64.b64encode(img_file.read()).decode('utf-8') return f"" else: return f"

Escudo no encontrado

" def asignar_color_resultado(local, visitante): if local > visitante: return "green" elif local < visitante: return "red" else: return "blue" # Tu función corregida y definitiva # Diccionario global para almacenar predicciones de partidos predicciones_guardadas = {} def predecir(equipo_local, equipo_visitante): global predicciones_guardadas # Para modificar la variable global clave_partido = (equipo_local, equipo_visitante) # ✅ Si la predicción ya existe, usarla if clave_partido in predicciones_guardadas: prob_max, resultado_max, resultado_html, estadisticas_html, tabla_historial_html = predicciones_guardadas[clave_partido] else: # ✅ Generar la predicción solo si no existe aún prob_max = np.random.uniform(40, 60) resultado_max = "Victoria Local" if prob_max > 50 else "Victoria Visitante" color_resultado = "green" if prob_max > 50 else "red" enfrentamientos = df[ ((df["Equipo_Local"] == equipo_local) & (df["Equipo_Visitante"] == equipo_visitante)) | ((df["Equipo_Local"] == equipo_visitante) & (df["Equipo_Visitante"] == equipo_local)) ].sort_values(by="Fecha", ascending=False).head(10) # ✅ Verificar si hay enfrentamientos previos if enfrentamientos.empty: print(f"⚠️ No hay enfrentamientos previos entre {equipo_local} y {equipo_visitante}.") # Retornar valores vacíos para evitar el error de Gradio return ( f"

⚠️ No hay datos suficientes para predecir este partido.

", "", "

No hay historial de enfrentamientos.

" ) # ✅ Calcular promedio de goles en los enfrentamientos goles_equipo_A = enfrentamientos.apply( lambda row: row["Goles_Local"] if row["Equipo_Local"] == equipo_local else row["Goles_Visitante"], axis=1 ) goles_equipo_B = enfrentamientos.apply( lambda row: row["Goles_Local"] if row["Equipo_Local"] == equipo_visitante else row["Goles_Visitante"], axis=1 ) promedio_goles_equipo_A = goles_equipo_A.mean() if not goles_equipo_A.empty else 0 promedio_goles_equipo_B = goles_equipo_B.mean() if not goles_equipo_B.empty else 0 ultimos_10_local = df[df["Equipo_Local"] == equipo_local].sort_values(by="Fecha", ascending=False).head(10) ultimos_10_visitante = df[df["Equipo_Visitante"] == equipo_visitante].sort_values(by="Fecha", ascending=False).head(10) prom_goles_local = ultimos_10_local["Goles_Local"].mean() prom_tiros_local = ultimos_10_local["Tiros_Puerta_Local"].mean() prom_corners_local = ultimos_10_local["Corners_Local"].mean() prom_goles_visitante = ultimos_10_visitante["Goles_Visitante"].mean() prom_tiros_visitante = ultimos_10_visitante["Tiros_Puerta_Visitante"].mean() prom_corners_visitante = ultimos_10_visitante["Corners_Visitante"].mean() # ✅ Calcular la efectividad de gol (% de tiros que terminan en gol) efectividad_local = ( prom_goles_local / prom_tiros_local * 100) if prom_tiros_local > 0 else 0 efectividad_visitante = (prom_goles_visitante / prom_tiros_visitante * 100) if prom_tiros_visitante > 0 else 0 resultado_max = "Victoria Local" if prob_max > 50 else "Victoria Visitante" color_resultado = "green" if prob_max > 50 else "red" resultado_html = f"""
{obtener_escudo(equipo_local)}
{equipo_local}
{resultado_max}: {prob_max:.2f}%
{obtener_escudo(equipo_visitante)}
{equipo_visitante}
""" estadisticas_html = f"""

🏟️ Estadio: {estadios[equipo_local]['estadio']}

📊 Capacidad: {estadios[equipo_local]['capacidad']} espectadores


Promedio Goles Últimos 10 Partidos entre ellos: {promedio_goles_equipo_A:.2f} | {promedio_goles_equipo_B:.2f}
🎯 Promedio Tiros a Puerta (Últimos 10 Partidos como Local/Visitante) {prom_tiros_local:.2f} | {prom_tiros_visitante:.2f}
🏳️ Promodio Corners (Últimos 10 Partidos como Local/Visitante: {prom_corners_local:.2f} | {prom_corners_visitante:.2f}
🎯 Efectividad Gol(Últimos 10 Partidos como Local/Visitante) {efectividad_local:.2f}% | {efectividad_visitante:.2f}% """ enfrentamientos["Resultado"] = enfrentamientos.apply( lambda x: f"{x['Goles_Local']} - {x['Goles_Visitante']}", axis=1 ) tabla_historial_html = enfrentamientos[['Fecha','Equipo_Local','Resultado','Equipo_Visitante']].rename( columns={"Equipo_Local": "Local", "Equipo_Visitante": "Visitante"} ).to_html(index=False, escape=False) # ✅ Guardar la predicción en el diccionario para no cambiar en el futuro predicciones_guardadas[clave_partido] = (prob_max, resultado_max, resultado_html, estadisticas_html, tabla_historial_html) return resultado_html, estadisticas_html, tabla_historial_html # Interfaz Gradio corregida completamente with gr.Blocks() as app: gr.Markdown("## ⚽ Predicción de Partidos Premier League") equipos = list(estadios.keys()) with gr.Row(): with gr.Column(scale=1): equipo_local = gr.Dropdown(label="Local", choices=equipos, value=equipos[0]) equipo_visitante = gr.Dropdown(label="Visitante", choices=[e for e in equipos if e != equipos[0]]) boton_predecir = gr.Button("Predecir Resultado") resultado_html = gr.HTML() with gr.Row(): estadisticas_html = gr.HTML() tabla_historial_html = gr.HTML() def actualizar_visitante(equipo_local): return gr.update(choices=[e for e in equipos if e != equipo_local]) equipo_local.change( actualizar_visitante, inputs=equipo_local, outputs=equipo_visitante ) boton_predecir.click( predecir, inputs=[equipo_local, equipo_visitante], outputs=[resultado_html, estadisticas_html, tabla_historial_html] ) app.launch(debug=True) # In[ ]: ## Ejecuta el notebook como un script import os os.system("jupyter nbconvert --to script --execute app.ipynb") # In[ ]: