import joblib import numpy as np import re df = joblib.load("./data/app_test_clean_v2.joblib") def sanitize(name: str) -> str: """ Transforme un nom de colonne en identifiant Python valide. """ # Remplacer tout caractère non alphanumérique par un underscore name = re.sub(r'[^0-9a-zA-Z_]', '_', name) # Si le nom commence par un chiffre → préfixer if re.match(r'^[0-9]', name): name = f"col_{name}" return name df.columns = [sanitize(c) for c in df.columns] example = df.sample(1).iloc[0].to_dict() for k, v in example.items(): if isinstance(v, float) and (np.isnan(v)): example[k] = None fields = [] for col, dtype in df.dtypes.items(): clean_col = sanitize(col) if dtype == bool or df[col].dropna().isin([0, 1, True, False]).all(): py_type = "Optional[bool]" elif "int" in str(dtype): py_type = "Optional[int]" elif "float" in str(dtype): py_type = "Optional[float]" else: py_type = "Optional[str]" fields.append(f" {clean_col}: {py_type} = None") model_code = f""" from pydantic import BaseModel from typing import Optional class ClientFeatures(BaseModel): {chr(10).join(fields)} """ with open("App/models.py", "w") as f: f.write(model_code) print("✔️ Modèle Pydantic généré dans App/models.py") mapping = {sanitize(c): c for c in joblib.load("./data/app_test_clean_v2.joblib").columns} import json with open("App/column_mapping.json", "w") as f: json.dump(mapping, f, indent=4)