""" Schémas de données Pydantic pour l'API de prédiction du churn employé. Contient les modèles de validation des données entrantes et sortantes. """ from typing import Literal from pydantic import BaseModel, ConfigDict, Field # MODÈLES DE DONNÉES D'ENTRÉE class DonneesEmploye(BaseModel): """ Modèle des données d'un employé en entrée de l'API. Chaque champ représente une caractéristique de l'employé. La validation Pydantic rejette automatiquement les valeurs invalides. """ model_config = ConfigDict(extra="forbid") # rejette les champs inconnus # INFORMATIONS PERSONNELLES id_employee: int = Field(..., ge=1, description="ID unique de l'employé") age: int = Field( ..., ge=18, le=65, description="Âge de l'employé (entre 18 et 65 ans)" ) genre: Literal["M", "F"] = Field(..., description="Genre: M=Homme, F=Femme") revenu_mensuel: int = Field( ..., gt=0, lt=20000, description="Salaire mensuel en euros" ) statut_marital: Literal["Célibataire", "Marié(e)", "Divorcé(e)"] = Field( ..., description="Statut matrimonial" ) departement: Literal["Consulting", "Commercial", "Ressources Humaines"] = Field( ..., description="Département de l'entreprise" ) poste: Literal[ "Représentant Commercial", "Ressources Humaines", "Assistant de Direction", "Consultant", "Manager", "Cadre Commercial", "Tech Lead", "Senior Manager", "Directeur Technique", ] = Field(..., description="Intitulé du poste") # EXPÉRIENCE annee_experience_totale: int = Field( ..., ge=0, le=47, description="Années d'expérience totale" ) annees_dans_l_entreprise: int = Field( ..., ge=0, le=47, description="Années dans l'entreprise" ) # SATISFACTION (note de 1 à 4) satisfaction_employee_environnement: int = Field( ..., ge=1, le=4, description="Satisfaction concernant l'environnement de travail (1-4)", ) note_evaluation_precedente: int = Field( ..., ge=1, le=4, description="Note d'évaluation précédente (1-4)" ) satisfaction_employee_nature_travail: int = Field( ..., ge=1, le=4, description="Satisfaction concernant la nature du travail (1-4)", ) satisfaction_employee_equipe: int = Field( ..., ge=1, le=4, description="Satisfaction concernant l'équipe (1-4)" ) satisfaction_employee_equilibre_pro_perso: int = Field( ..., ge=1, le=4, description="Satisfaction équilibre pro/perso (1-4)" ) note_evaluation_actuelle: int = Field( ..., ge=1, le=4, description="Note d'évaluation actuelle (1-4)" ) # AUTRES INFORMATIONS heure_supplementaires: Literal["Oui", "Non"] = Field( ..., description="Effectue des heures supplémentaires" ) augementation_salaire_precedente: int = Field( ..., ge=0, le=100, description="Pourcentage d'augmentation salaire précédente (ex: 11 pour 11%)", ) nombre_participation_pee: int = Field( ..., ge=0, le=3, description="Nombre de participations au PEE" ) nb_formations_suivies: int = Field( ..., ge=0, description="Nombre de formations suivies" ) distance_domicile_travail: int = Field( ..., ge=0, description="Distance domicile-travail en km" ) niveau_education: int = Field( ..., ge=1, le=5, description="Niveau d'éducation (1-5)" ) frequence_deplacement: Literal["Aucun", "Occasionnel", "Frequent"] = Field( ..., description="Fréquence des déplacements professionnels" ) annees_depuis_la_derniere_promotion: int = Field( ..., ge=0, le=15, description="Années depuis la dernière promotion" ) class ResultatPrediction(BaseModel): """Modèle de réponse de l'API après une prédiction.""" prediction: str = Field( ..., description="Prédiction: 'Oui' (part) ou 'Non' (reste)" ) probabilite: float = Field(..., description="Probabilité de départ (entre 0 et 1)") classe: int = Field(..., description="Classe: 0=reste, 1=part")