File size: 4,838 Bytes
b666236
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
"""
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)