FERNANDITOVALERO commited on
Commit
2d383e3
·
verified ·
1 Parent(s): 2d37379

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +249 -0
app.py ADDED
@@ -0,0 +1,249 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python
2
+ # coding: utf-8
3
+
4
+ # In[ ]:
5
+
6
+
7
+ import os
8
+ import pandas as pd
9
+ import pickle
10
+ import gradio as gr
11
+ import numpy as np
12
+ import pandas as pd
13
+ import base64
14
+
15
+ # Carga modelo
16
+ with open("modelo_random_forest.pkl", "rb") as file:
17
+ model = pickle.load(file)
18
+
19
+ # Carga datos
20
+ ruta_datos = "datos_premier_consolidado.csv"
21
+ df = pd.read_csv(ruta_datos, encoding="utf-8", delimiter=";")
22
+
23
+ RUTA_ESCUDOS = "ESCUDOS"
24
+
25
+ estadios = {
26
+ 'Arsenal': {'estadio': 'Emirates Stadium', 'capacidad': 60383},
27
+ 'Aston Villa': {'estadio': 'Villa Park', 'capacidad': 42824},
28
+ 'Birmingham': {'estadio': 'St Andrew\'s', 'capacidad': 29409},
29
+ 'Blackburn': {'estadio': 'Ewood Park', 'capacidad': 31367},
30
+ 'Blackpool': {'estadio': 'Bloomfield Road', 'capacidad': 16750},
31
+ 'Bolton': {'estadio': 'University of Bolton Stadium', 'capacidad': 28723},
32
+ 'Bournemouth': {'estadio': 'Vitality Stadium', 'capacidad': 11307},
33
+ 'Brentford': {'estadio': 'Gtech Community Stadium', 'capacidad': 17250},
34
+ 'Brighton': {'estadio': 'American Express Community Stadium', 'capacidad': 31872},
35
+ 'Burnley': {'estadio': 'Turf Moor', 'capacidad': 22546},
36
+ 'Cardiff': {'estadio': 'Cardiff City Stadium', 'capacidad': 33280},
37
+ 'Charlton': {'estadio': 'The Valley', 'capacidad': 27111},
38
+ 'Chelsea': {'estadio': 'Stamford Bridge', 'capacidad': 41841},
39
+ 'Crystal Palace': {'estadio': 'Selhurst Park', 'capacidad': 26309},
40
+ 'Derby': {'estadio': 'Pride Park Stadium', 'capacidad': 33597},
41
+ 'Everton': {'estadio': 'Goodison Park', 'capacidad': 40569},
42
+ 'Fulham': {'estadio': 'Craven Cottage', 'capacidad': 25700},
43
+ 'Huddersfield': {'estadio': 'John Smith\'s Stadium', 'capacidad': 24500},
44
+ 'Hull': {'estadio': 'MKM Stadium', 'capacidad': 25400},
45
+ 'Leeds': {'estadio': 'Elland Road', 'capacidad': 40204},
46
+ 'Leicester': {'estadio': 'King Power Stadium', 'capacidad': 34310},
47
+ 'Liverpool': {'estadio': 'Anfield', 'capacidad': 61276},
48
+ 'Luton': {'estadio': 'Kenilworth Road', 'capacidad': 10356},
49
+ 'Man City': {'estadio': 'Etihad Stadium', 'capacidad': 55097},
50
+ 'Man United': {'estadio': 'Old Trafford', 'capacidad': 76212},
51
+ 'Middlesbrough': {'estadio': 'Riverside Stadium', 'capacidad': 34988},
52
+ 'Newcastle': {'estadio': 'St. James\' Park', 'capacidad': 52758},
53
+ 'Norwich': {'estadio': 'Carrow Road', 'capacidad': 27606},
54
+ "Nott'm Forest": {'estadio': 'The City Ground', 'capacidad': 30576},
55
+ 'Portsmouth': {'estadio': 'Fratton Park', 'capacidad': 20821},
56
+ 'QPR': {'estadio': 'Loftus Road', 'capacidad': 18360},
57
+ 'Reading': {'estadio': 'Select Car Leasing Stadium', 'capacidad': 24200},
58
+ 'Sheffield United': {'estadio': 'Bramall Lane', 'capacidad': 32702},
59
+ 'Southampton': {'estadio': 'St. Mary\'s Stadium', 'capacidad': 32689},
60
+ 'Stoke': {'estadio': 'bet365 Stadium', 'capacidad': 30089},
61
+ 'Sunderland': {'estadio': 'Stadium of Light', 'capacidad': 49000},
62
+ 'Swansea': {'estadio': 'Swansea.com Stadium', 'capacidad': 21028},
63
+ 'Tottenham': {'estadio': 'Tottenham Hotspur Stadium', 'capacidad': 62850},
64
+ 'Watford': {'estadio': 'Vicarage Road', 'capacidad': 22200},
65
+ 'West Brom': {'estadio': 'The Hawthorns', 'capacidad': 28003},
66
+ 'West Ham': {'estadio': 'London Stadium', 'capacidad': 60000},
67
+ 'Wigan': {'estadio': 'DW Stadium', 'capacidad': 25138},
68
+ 'Wolves': {'estadio': 'Molineux Stadium', 'capacidad': 34674},
69
+ 'Coventry': {'estadio': 'Coventry Building Society Arena', 'capacidad': 32609},
70
+ 'Bradford': {'estadio': 'Valley Parade', 'capacidad': 25136}
71
+ # Añadir todos los demás estadios aquí
72
+ }
73
+
74
+
75
+
76
+ # Funciones auxiliares
77
+ def obtener_escudo(equipo):
78
+ ruta = os.path.join(RUTA_ESCUDOS, f"{equipo}.png")
79
+ if os.path.exists(ruta):
80
+ with open(ruta, "rb") as img_file:
81
+ img_base64 = base64.b64encode(img_file.read()).decode('utf-8')
82
+ return f"<img src='data:image/png;base64,{img_base64}' width='80' height='80' style='margin:0px;'>"
83
+ else:
84
+ return f"<p style='color:red;'>Escudo no encontrado</p>"
85
+
86
+ def asignar_color_resultado(local, visitante):
87
+ if local > visitante:
88
+ return "green"
89
+ elif local < visitante:
90
+ return "red"
91
+ else:
92
+ return "blue"
93
+
94
+ # Tu función corregida y definitiva
95
+
96
+ # Diccionario global para almacenar predicciones de partidos
97
+ predicciones_guardadas = {}
98
+
99
+ def predecir(equipo_local, equipo_visitante):
100
+ global predicciones_guardadas # Para modificar la variable global
101
+
102
+ clave_partido = (equipo_local, equipo_visitante)
103
+
104
+ # ✅ Si la predicción ya existe, usarla
105
+ if clave_partido in predicciones_guardadas:
106
+ prob_max, resultado_max, resultado_html, estadisticas_html, tabla_historial_html = predicciones_guardadas[clave_partido]
107
+ else:
108
+ # ✅ Generar la predicción solo si no existe aún
109
+ prob_max = np.random.uniform(40, 60)
110
+ resultado_max = "Victoria Local" if prob_max > 50 else "Victoria Visitante"
111
+ color_resultado = "green" if prob_max > 50 else "red"
112
+ enfrentamientos = df[
113
+ ((df["Equipo_Local"] == equipo_local) & (df["Equipo_Visitante"] == equipo_visitante)) |
114
+ ((df["Equipo_Local"] == equipo_visitante) & (df["Equipo_Visitante"] == equipo_local))
115
+ ].sort_values(by="Fecha", ascending=False).head(10)
116
+
117
+ # ✅ Verificar si hay enfrentamientos previos
118
+ if enfrentamientos.empty:
119
+ print(f"⚠️ No hay enfrentamientos previos entre {equipo_local} y {equipo_visitante}.")
120
+
121
+ # Retornar valores vacíos para evitar el error de Gradio
122
+ return (
123
+ f"<p style='color:red;'><b>⚠️ No hay datos suficientes para predecir este partido.</b></p>",
124
+ "",
125
+ "<p style='color:red;'>No hay historial de enfrentamientos.</p>"
126
+ )
127
+
128
+ # ✅ Calcular promedio de goles en los enfrentamientos
129
+ goles_equipo_A = enfrentamientos.apply(
130
+ lambda row: row["Goles_Local"] if row["Equipo_Local"] == equipo_local else row["Goles_Visitante"], axis=1
131
+ )
132
+ goles_equipo_B = enfrentamientos.apply(
133
+ lambda row: row["Goles_Local"] if row["Equipo_Local"] == equipo_visitante else row["Goles_Visitante"], axis=1
134
+ )
135
+ promedio_goles_equipo_A = goles_equipo_A.mean() if not goles_equipo_A.empty else 0
136
+ promedio_goles_equipo_B = goles_equipo_B.mean() if not goles_equipo_B.empty else 0
137
+
138
+
139
+
140
+
141
+ ultimos_10_local = df[df["Equipo_Local"] == equipo_local].sort_values(by="Fecha", ascending=False).head(10)
142
+ ultimos_10_visitante = df[df["Equipo_Visitante"] == equipo_visitante].sort_values(by="Fecha", ascending=False).head(10)
143
+
144
+ prom_goles_local = ultimos_10_local["Goles_Local"].mean()
145
+ prom_tiros_local = ultimos_10_local["Tiros_Puerta_Local"].mean()
146
+ prom_corners_local = ultimos_10_local["Corners_Local"].mean()
147
+
148
+ prom_goles_visitante = ultimos_10_visitante["Goles_Visitante"].mean()
149
+ prom_tiros_visitante = ultimos_10_visitante["Tiros_Puerta_Visitante"].mean()
150
+ prom_corners_visitante = ultimos_10_visitante["Corners_Visitante"].mean()
151
+
152
+
153
+ # ✅ Calcular la efectividad de gol (% de tiros que terminan en gol)
154
+ efectividad_local = ( prom_goles_local / prom_tiros_local * 100) if prom_tiros_local > 0 else 0
155
+ efectividad_visitante = (prom_goles_visitante / prom_tiros_visitante * 100) if prom_tiros_visitante > 0 else 0
156
+
157
+ resultado_max = "Victoria Local" if prob_max > 50 else "Victoria Visitante"
158
+ color_resultado = "green" if prob_max > 50 else "red"
159
+
160
+ resultado_html = f"""
161
+ <div style='display:flex; align-items:center; justify-content:center;'>
162
+ <div style='text-align:center;'>
163
+ {obtener_escudo(equipo_local)}<br>{equipo_local}
164
+ </div>
165
+ <div style='margin:0 20px;color:{color_resultado};font-size:20px;'>
166
+ <b>{resultado_max}: {prob_max:.2f}%</b>
167
+ </div>
168
+ <div style='text-align:center;'>
169
+ {obtener_escudo(equipo_visitante)}<br>{equipo_visitante}
170
+ </div>
171
+ </div>
172
+ """
173
+
174
+ estadisticas_html = f"""
175
+ <div style='padding:10px;'>
176
+ <p><b>🏟️ Estadio:</b> {estadios[equipo_local]['estadio']}</p>
177
+ <p><b>📊 Capacidad:</b> {estadios[equipo_local]['capacidad']} espectadores</p>
178
+ <hr style='width:60%;text-align:left;margin-left:0;'>
179
+ ⚽ <b>Promedio Goles Últimos 10 Partidos entre ellos:</b> {promedio_goles_equipo_A:.2f} | {promedio_goles_equipo_B:.2f}<br>
180
+ 🎯 <b>Promedio Tiros a Puerta (Últimos 10 Partidos como Local/Visitante)</b> {prom_tiros_local:.2f} | {prom_tiros_visitante:.2f}<br>
181
+ 🏳️ <b>Promodio Corners (Últimos 10 Partidos como Local/Visitante:</b> {prom_corners_local:.2f} | {prom_corners_visitante:.2f}<br>
182
+ 🎯 <b>Efectividad Gol(Últimos 10 Partidos como Local/Visitante)</b> {efectividad_local:.2f}% | {efectividad_visitante:.2f}%
183
+
184
+ """
185
+
186
+ enfrentamientos["Resultado"] = enfrentamientos.apply(
187
+ lambda x: f"<span style='color:{asignar_color_resultado(x['Goles_Local'], x['Goles_Visitante'])};font-weight:bold'>{x['Goles_Local']} - {x['Goles_Visitante']}</span>",
188
+ axis=1
189
+ )
190
+
191
+ tabla_historial_html = enfrentamientos[['Fecha','Equipo_Local','Resultado','Equipo_Visitante']].rename(
192
+ columns={"Equipo_Local": "Local", "Equipo_Visitante": "Visitante"}
193
+ ).to_html(index=False, escape=False)
194
+
195
+ # ✅ Guardar la predicción en el diccionario para no cambiar en el futuro
196
+ predicciones_guardadas[clave_partido] = (prob_max, resultado_max, resultado_html, estadisticas_html, tabla_historial_html)
197
+
198
+ return resultado_html, estadisticas_html, tabla_historial_html
199
+
200
+
201
+ # Interfaz Gradio corregida completamente
202
+ with gr.Blocks() as app:
203
+ gr.Markdown("## ⚽ Predicción de Partidos Premier League")
204
+
205
+ equipos = list(estadios.keys())
206
+
207
+ with gr.Row():
208
+ with gr.Column(scale=1):
209
+ equipo_local = gr.Dropdown(label="Local", choices=equipos, value=equipos[0])
210
+ equipo_visitante = gr.Dropdown(label="Visitante", choices=[e for e in equipos if e != equipos[0]])
211
+ boton_predecir = gr.Button("Predecir Resultado")
212
+
213
+ resultado_html = gr.HTML()
214
+
215
+ with gr.Row():
216
+ estadisticas_html = gr.HTML()
217
+ tabla_historial_html = gr.HTML()
218
+
219
+ def actualizar_visitante(equipo_local):
220
+ return gr.update(choices=[e for e in equipos if e != equipo_local])
221
+
222
+ equipo_local.change(
223
+ actualizar_visitante,
224
+ inputs=equipo_local,
225
+ outputs=equipo_visitante
226
+ )
227
+
228
+ boton_predecir.click(
229
+ predecir,
230
+ inputs=[equipo_local, equipo_visitante],
231
+ outputs=[resultado_html, estadisticas_html, tabla_historial_html]
232
+ )
233
+
234
+ app.launch(debug=True)
235
+
236
+
237
+ # In[ ]:
238
+
239
+
240
+ ## Ejecuta el notebook como un script
241
+ import os
242
+ os.system("jupyter nbconvert --to script --execute app.ipynb")
243
+
244
+
245
+ # In[ ]:
246
+
247
+
248
+
249
+