# 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']])