""" Script para concatenar y normalizar datasets de features de partido. Lee dos CSV existentes en: - ~/Documents/Racing/Datasets/match_post_1row.csv - ~/Documents/Racing/Datasets/match_post_1row__20260210_112234.csv Hace lo siguiente: - Normaliza las columnas clave de identificación de partido/equipos para que ambos datasets tengan el mismo esquema: matchId, fecha, competencia, temporada, home_team_id, away_team_id, equipo_local, equipo_visitante, ... - Se queda solo con las columnas que existen en ambos datasets. - Concatena fila a fila. - Elimina las columnas que quedan completamente vacías (todo NaN). - Guarda el resultado en: - data/match_features.parquet - opcionalmente data/match_features.csv (para inspección rápida). """ from pathlib import Path import pandas as pd PROJECT_ROOT = Path(__file__).resolve().parents[1] DOCS_DATASETS_DIR = Path.home() / "Documents" / "Racing" / "Datasets" SRC_FILES = [ DOCS_DATASETS_DIR / "match_post_1row.csv", DOCS_DATASETS_DIR / "match_post_1row__20260210_112234.csv", ] OUTPUT_PARQUET = PROJECT_ROOT / "data" / "match_features.parquet" OUTPUT_CSV = PROJECT_ROOT / "data" / "match_features.csv" def load_and_normalize_first() -> pd.DataFrame: """ Carga el primer dataset (match_post_1row.csv) y renombra las columnas clave para alinearlas con nombres genéricos. Este archivo tiene cabeceras tipo: home_matchId, home_competencia, home_temporada, home_equipo_local, ... """ path = SRC_FILES[0] df = pd.read_csv(path) rename_map = { "home_matchId": "matchId", "home_fecha_x": "fecha", "home_competencia": "competencia", "home_temporada": "temporada", "home_teamId": "home_team_id", "away_teamId": "away_team_id", "home_equipo_local": "equipo_local", "home_equipo_visitante": "equipo_visitante", } cols_to_rename = {k: v for k, v in rename_map.items() if k in df.columns} df = df.rename(columns=cols_to_rename) return df def load_and_normalize_second() -> pd.DataFrame: """ Carga el segundo dataset (match_post_1row__20260210_112234.csv), que ya tiene las columnas clave con nombres "limpios": matchId, fecha, competencia, temporada, home_team_id, away_team_id, equipo_local, equipo_visitante, ... """ path = SRC_FILES[1] df = pd.read_csv(path) return df def build_match_features() -> pd.DataFrame: """ Construye el dataset concatenado de features de partido. - Intersección de columnas entre ambos datasets. - Concatena. - Elimina columnas con todo NaN. """ df1 = load_and_normalize_first() df2 = load_and_normalize_second() common_cols = sorted(set(df1.columns).intersection(df2.columns)) df1_common = df1[common_cols].copy() df2_common = df2[common_cols].copy() df_all = pd.concat([df1_common, df2_common], ignore_index=True) # Eliminar columnas que quedan completamente vacías en el conjunto unido df_all = df_all.dropna(axis=1, how="all") return df_all def main(save_csv: bool = True) -> None: df_all = build_match_features() OUTPUT_PARQUET.parent.mkdir(parents=True, exist_ok=True) df_all.to_parquet(OUTPUT_PARQUET, index=False) if save_csv: df_all.to_csv(OUTPUT_CSV, index=False) print(f"Dataset concatenado guardado en: {OUTPUT_PARQUET}") if save_csv: print(f"También se guardó CSV en: {OUTPUT_CSV}") print(f"Filas totales: {len(df_all)}, columnas: {len(df_all.columns)}") if __name__ == "__main__": main()