quinielas/scripts/predecir_jornada_mejorado.py

84 lines
3.1 KiB
Python

# predecir_jornada_mejorado.py
"""
Predice resultados de la quiniela usando features de la clasificación actual.
"""
import pandas as pd
import os
import joblib
from sklearn.ensemble import RandomForestClassifier
MODEL_PATH = os.path.join(os.path.dirname(__file__), '../models/modelo_rf.pkl')
DATA_PATH = os.path.join(os.path.dirname(__file__), '../data/espana/partidos_todos.csv')
PARTIDOS_PATH = os.path.join(os.path.dirname(__file__), '../partidos_jornada.txt')
CLASIF_PATH = os.path.join(os.path.dirname(__file__), '../data/clasificacion2026.csv')
# Cargar datos históricos y clasificación
clasif = pd.read_csv(CLASIF_PATH)
clasif.set_index('equipo', inplace=True)
df_hist = pd.read_csv(DATA_PATH)
# Cargar modelo entrenado o entrenar si no existe
if os.path.exists(MODEL_PATH):
clf = joblib.load(MODEL_PATH)
else:
df_hist['dif_goles'] = df_hist['goles_local'] - df_hist['goles_visitante']
X = df_hist[['dif_goles']]
y = df_hist['resultado']
clf = RandomForestClassifier(n_estimators=100, random_state=42)
clf.fit(X, y)
joblib.dump(clf, MODEL_PATH)
# Leer partidos desde archivo
def leer_partidos(path):
partidos = []
with open(path, 'r', encoding='utf-8') as f:
for linea in f:
linea = linea.strip()
if not linea or '-' not in linea:
continue
local, visitante = [x.strip() for x in linea.split('-', 1)]
partidos.append({'local': local, 'visitante': visitante})
return partidos
partidos = leer_partidos(PARTIDOS_PATH)
# Generar features usando la clasificación
features = []
for p in partidos:
local = p['local']
visitante = p['visitante']
# Si el equipo no está en la clasificación, usar valores medios
if local in clasif.index:
pos_local = clasif.loc[local, 'posicion']
pts_local = clasif.loc[local, 'Pts']
dg_local = clasif.loc[local, 'DG']
else:
pos_local = clasif['posicion'].mean()
pts_local = clasif['Pts'].mean()
dg_local = clasif['DG'].mean()
if visitante in clasif.index:
pos_visit = clasif.loc[visitante, 'posicion']
pts_visit = clasif.loc[visitante, 'Pts']
dg_visit = clasif.loc[visitante, 'DG']
else:
pos_visit = clasif['posicion'].mean()
pts_visit = clasif['Pts'].mean()
dg_visit = clasif['DG'].mean()
features.append({
'local': local,
'visitante': visitante,
'dif_puntos': pts_local - pts_visit,
'dif_posicion': pos_visit - pos_local, # positivo si local va mejor
'dif_dg': dg_local - dg_visit
})
# Predecir usando el modelo (por ahora solo con dif_goles, pero mostramos features para extender)
df_pred = pd.DataFrame(features)
# Usar solo dif_puntos como feature para el modelo actual (puedes reentrenar el modelo con más features luego)
df_pred['dif_goles'] = df_pred['dif_puntos'] # placeholder para compatibilidad
predicciones = clf.predict(df_pred[['dif_goles']])
df_pred['prediccion'] = predicciones
print("Predicciones para la jornada (con features de clasificación):")
print(df_pred[['local', 'visitante', 'dif_puntos', 'dif_posicion', 'dif_dg', 'prediccion']])