| """ |
| Modèles ORM SQLAlchemy pour la base de données PostgreSQL. |
| |
| Contient les 4 tables du schéma : |
| - employees : dataset brut d'entraînement (1470 lignes) |
| - prediction_inputs : données brutes envoyées à l'API |
| - prediction_outputs : résultat de la prédiction |
| - api_logs : traçabilité des échanges API ↔ DB |
| """ |
|
|
| from datetime import datetime |
|
|
| from sqlalchemy import Column, DateTime, Float, ForeignKey, Integer, String |
| from sqlalchemy.orm import relationship |
|
|
| from src.db.database import Base |
|
|
|
|
| class Employee(Base): |
| """Table du dataset brut (1470 employés).""" |
|
|
| __tablename__ = "employees" |
|
|
| id_employee = Column(Integer, primary_key=True) |
| age = Column(Integer, nullable=False) |
| genre = Column(String(1), nullable=False) |
| revenu_mensuel = Column(Integer, nullable=False) |
| statut_marital = Column(String(20), nullable=False) |
| departement = Column(String(20), nullable=False) |
| poste = Column(String(30), nullable=False) |
| annee_experience_totale = Column(Integer, nullable=False) |
| annees_dans_l_entreprise = Column(Integer, nullable=False) |
| satisfaction_employee_environnement = Column(Integer, nullable=False) |
| note_evaluation_precedente = Column(Integer, nullable=False) |
| satisfaction_employee_nature_travail = Column(Integer, nullable=False) |
| satisfaction_employee_equipe = Column(Integer, nullable=False) |
| satisfaction_employee_equilibre_pro_perso = Column(Integer, nullable=False) |
| note_evaluation_actuelle = Column(Integer, nullable=False) |
| heure_supplementaires = Column(String(5), nullable=False) |
| augementation_salaire_precedente = Column(Integer, nullable=False) |
| nombre_participation_pee = Column(Integer, nullable=False) |
| nb_formations_suivies = Column(Integer, nullable=False) |
| distance_domicile_travail = Column(Integer, nullable=False) |
| niveau_education = Column(Integer, nullable=False) |
| frequence_deplacement = Column(String(20), nullable=False) |
| annees_depuis_la_derniere_promotion = Column(Integer, nullable=False) |
| a_quitte_l_entreprise = Column(String(5), nullable=False) |
|
|
|
|
| class PredictionInput(Base): |
| """Données brutes envoyées à l'API (avant transformation).""" |
|
|
| __tablename__ = "prediction_inputs" |
|
|
| id = Column(Integer, primary_key=True, autoincrement=True) |
| id_employee = Column(Integer, nullable=False) |
| created_at = Column(DateTime, default=datetime.utcnow, nullable=False) |
| age = Column(Integer, nullable=False) |
| genre = Column(String(1), nullable=False) |
| revenu_mensuel = Column(Integer, nullable=False) |
| statut_marital = Column(String(20), nullable=False) |
| departement = Column(String(20), nullable=False) |
| poste = Column(String(30), nullable=False) |
| annee_experience_totale = Column(Integer, nullable=False) |
| annees_dans_l_entreprise = Column(Integer, nullable=False) |
| satisfaction_employee_environnement = Column(Integer, nullable=False) |
| note_evaluation_precedente = Column(Integer, nullable=False) |
| satisfaction_employee_nature_travail = Column(Integer, nullable=False) |
| satisfaction_employee_equipe = Column(Integer, nullable=False) |
| satisfaction_employee_equilibre_pro_perso = Column(Integer, nullable=False) |
| note_evaluation_actuelle = Column(Integer, nullable=False) |
| heure_supplementaires = Column(String(5), nullable=False) |
| augementation_salaire_precedente = Column(Integer, nullable=False) |
| nombre_participation_pee = Column(Integer, nullable=False) |
| nb_formations_suivies = Column(Integer, nullable=False) |
| distance_domicile_travail = Column(Integer, nullable=False) |
| niveau_education = Column(Integer, nullable=False) |
| frequence_deplacement = Column(String(20), nullable=False) |
| annees_depuis_la_derniere_promotion = Column(Integer, nullable=False) |
|
|
| output = relationship("PredictionOutput", back_populates="input", uselist=False) |
|
|
|
|
| class PredictionOutput(Base): |
| """Résultat de la prédiction du modèle.""" |
|
|
| __tablename__ = "prediction_outputs" |
|
|
| id = Column(Integer, primary_key=True, autoincrement=True) |
| input_id = Column( |
| Integer, ForeignKey("prediction_inputs.id"), nullable=False, unique=True |
| ) |
| prediction = Column(String(5), nullable=False) |
| probabilite = Column(Float, nullable=False) |
| classe = Column(Integer, nullable=False) |
|
|
| input = relationship("PredictionInput", back_populates="output") |
|
|
|
|
| class ApiLog(Base): |
| """Traçabilité des échanges entre l'API et la base de données.""" |
|
|
| __tablename__ = "api_logs" |
|
|
| id = Column(Integer, primary_key=True, autoincrement=True) |
| created_at = Column(DateTime, default=datetime.utcnow, nullable=False) |
| operation = Column(String(30), nullable=False) |
| table_cible = Column(String(20), nullable=False) |
| details = Column(String(255), nullable=True) |
| statut = Column(String(10), nullable=False) |
|
|