{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":106680,"databundleVersionId":13374319,"sourceType":"competition"},{"sourceId":13929627,"sourceType":"datasetVersion","datasetId":8876672}],"dockerImageVersionId":31192,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# ----------------------------------------------------------------------\n# ANCIENNE CELLULE 1 - LOGIQUE DE CONSOLIDATION DÉPLACÉE\n#\n# Ce bloc de code a été exécuté une fois dans un notebook séparé pour :\n# 1. Rechercher tous les fichiers metadata.csv dans les 8 datasets.\n# 2. Déterminner l'ensemble maximal des 19 colonnes (y compris les 12 HLA et les 4 cliniques).\n# 3. Aligner toutes les structures en remplissant les colonnes manquantes avec des NaN (pour Datasets 1 à 7).\n# 4. Consolider les 3610 répertoires dans le fichier unique 'all_train_metadata_consolidated.csv'.\n#\n# Le fichier 'all_train_metadata_consolidated.csv' a été téléchargé et\n# ré-uploadé dans le répertoire d'entrée pour un chargement simple et rapide.\n# Ce code est maintenant commenté.\n# ----------------------------------------------------------------------\n#\n# import pandas as pd\n# from glob import glob\n# import os\n# import sys\n# import numpy as np # Import nécessaire pour les valeurs manquantes\n#\n# # --- Configuration des Chemins ---\n# ROOT_DIR = \"/kaggle/input/adaptive-immune-profiling-challenge-2025\"\n# TARGET_CSV_FOLDER = f\"{ROOT_DIR}/train_datasets/train_datasets\" \n# OUTPUT_METADATA_NAME = 'all_train_metadata_consolidated.csv'\n# MISSING_META_VALUE = np.nan # Valeur standard pour les colonnes manquantes\n# # ---------------------------------\n#\n# print(\"🔍 Étape 1 : Recherche et détermination de la structure MAXIMALE\")\n# ... (le reste du code de consolidation est omis ici pour la clarté) ...\n#\n# ----------------------------------------------------------------------\n# 🚀 NOUVEAU CHARGEMENT SIMPLE ET RAPIDE DU FICHIER CONSOLIDÉ\n#\n# import pandas as pd\n# import os\n#\n# # --- Configuration des Chemins ---\n# TRAIN_METADATA_PATH = 'all_train_metadata_consolidated.csv' \n# ROOT_DIR = \"/kaggle/input/adaptive-immune-profiling-challenge-2025\"\n# # ---------------------------------\n#\n# # 1. Chargement du fichier consolidé (Corrigé pour éviter le décalage de colonnes)\n# all_meta = pd.read_csv(\n#     TRAIN_METADATA_PATH, \n#     sep=',', \n#     skipinitialspace=True\n# )\n#\n# # 2. Reconstruction du chemin du fichier TSV original\n# all_meta['filename'] = all_meta.apply(\n#     lambda row: os.path.join(ROOT_DIR, 'train_datasets', 'train_datasets', row['dataset'], row['repertoire_id'] + '.tsv'),\n#     axis=1\n# )\n#\n# # 3. Indexation et Définition de la Cible\n# all_meta = all_meta.set_index('repertoire_id').reset_index()\n# TARGET_LABEL_COLUMN = 'label_positive' \n#\n# print(f\"✅ CONSOLIDATION BYPASSÉE. {len(all_meta)} répertoires chargés à partir du fichier consolidé.\")\n# print(f\"La table de métadonnées contient maintenant {all_meta.shape[1]} colonnes (y compris les IDs et les NaN).\")\n#\n# display(all_meta.head(2))\n# display(all_meta.tail(2))\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport os\n\n# --- Configuration des Chemins ---\n# ATTENTION : Le chemin vers le fichier consolidé est mis à jour\nTRAIN_METADATA_PATH = '/kaggle/input/airr-all-train-metadata-consolidation/all_train_metadata_consolidated.csv' \nROOT_DIR = \"/kaggle/input/adaptive-immune-profiling-challenge-2025\"\n# ---------------------------------\n\n# 1. Chargement du fichier consolidé\nall_meta = pd.read_csv(\n    TRAIN_METADATA_PATH, \n    sep=',', \n    skipinitialspace=True\n)\n\n# 2. Reconstruction du chemin du fichier TSV original (nécessaire pour charger les données AIRR plus tard)\nall_meta['filename'] = all_meta.apply(\n    lambda row: os.path.join(ROOT_DIR, 'train_datasets', 'train_datasets', row['dataset'], row['repertoire_id'] + '.tsv'),\n    axis=1\n)\n\n# 3. Indexation et Définition de la Cible\nall_meta = all_meta.set_index('repertoire_id').reset_index()\nTARGET_LABEL_COLUMN = 'label_positive' \n\nprint(f\"✅ Chargement réussi. {len(all_meta)} répertoires chargés.\")\nprint(f\"Colonnes chargées : {all_meta.columns.tolist()}\")\n\ndisplay(all_meta.head(2))","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\n# NOTE: Cette cellule suppose que 'all_meta' a été chargé correctement dans la Cellule 1\n\n## 1. Séparation des Features de Métadonnées (X_meta) et de la Cible (y)\n# Nous extrayons toutes les colonnes qui ne sont pas des identifiants (repertoire_id, filename, dataset)\n# ni la cible (label_positive).\nIDENTIFIER_COLS = ['repertoire_id', 'filename', 'dataset']\nTARGET_COL = 'label_positive'\nALL_META_FEATURES = [col for col in all_meta.columns if col not in IDENTIFIER_COLS + [TARGET_COL]]\n\nX_meta = all_meta[ALL_META_FEATURES].copy() # Utilisation de .copy() pour éviter SettingWithCopyWarning\ny = all_meta[TARGET_COL].astype(int)\n\nprint(f\"✅ Features de Métadonnées (X_meta) extraites. Total de {X_meta.shape[1]} features.\")\nprint(f\"✅ Cible (y) extraite et binarisée. Total de {len(y)} répertoires.\")\n\n# ---\nprint(\"\\n### 2. Inspection du Taux de Valeurs Manquantes (NaN) ###\")\n# Identifier les colonnes avec le plus de NaN (HLA, age, etc.)\nmissing_ratio = X_meta.isnull().sum().sort_values(ascending=False) / len(X_meta)\nmissing_ratio = missing_ratio[missing_ratio > 0]\n\nif not missing_ratio.empty:\n    plt.figure(figsize=(14, 6))\n    # Utilisation d'un graphique à barres pour visualiser le ratio de NaN\n    sns.barplot(x=missing_ratio.index, y=missing_ratio.values, palette=\"viridis\")\n    plt.xticks(rotation=45, ha='right')\n    plt.title(\"Ratio de Valeurs Manquantes (NaN) par Feature de Métadonnée\")\n    plt.ylabel(\"Ratio (NaN / Total Répertoires)\")\n    plt.grid(axis='y', linestyle='--', alpha=0.7)\n    plt.show()\n    \n    print(\"\\n⚠️ Taux de NaN le plus élevé :\")\n    print(missing_ratio) # Affichons tous les ratios > 0 pour être complet\n    print(\"\\nCes colonnes, particulièrement les colonnes HLA (DRB, DQA, etc.), sont manquantes dans la majorité des datasets (1-7), ce qui confirme le risque de Data Leakage.\")\nelse:\n    print(\"👍 Aucune valeur manquante détectée dans les features de métadonnées.\")\n\n# ---\nprint(\"\\n### 3. Type de Données et Nettoyage Initial (HLA & Âge) ###\")\n# Conversion de la colonne d'âge en numérique\nif 'age' in X_meta.columns:\n    X_meta['age'] = pd.to_numeric(X_meta['age'], errors='coerce')\n\n# Aperçu des types de données pour identifier les prochaines étapes de pré-traitement\nprint(\"\\nTypes de données des features de métadonnées après nettoyage initial :\")\nprint(X_meta.dtypes)","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}