Spaces:
Running
Running
| """ | |
| 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() | |