File size: 3,491 Bytes
c12fb2b
 
 
 
 
 
 
 
 
e1edad9
 
 
100ddbe
 
 
 
 
 
c12fb2b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
100ddbe
 
c12fb2b
 
 
 
 
 
 
 
 
 
100ddbe
c12fb2b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
100ddbe
c12fb2b
 
 
 
 
 
 
be68e43
 
 
c12fb2b
 
 
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
import sys
import os

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from dotenv import load_dotenv
load_dotenv()

import pandas as pd
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

db_url = (
    f"postgresql+psycopg2://{os.getenv('DB_USER')}:{os.getenv('DB_PASSWORD')}"
    f"@{os.getenv('DB_HOST')}:{os.getenv('DB_PORT')}/{os.getenv('DB_NAME')}"
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=create_engine(db_url))

from app.db.models import Employee, Prediction
from ml_model.loader import load_pipeline


def stats_employees(session):
    total = session.query(Employee).count()
    print(f"\n--- Employés en base ---")
    print(f"Total : {total}")

    quittes = session.query(Employee).filter(Employee.a_quitte_l_entreprise == True).count()
    print(f"Ont quitté : {quittes} ({round(quittes / total * 100, 1)}%)")


def apercu_employees(session, n=5):
    rows = session.query(Employee).limit(n).all()
    print(f"\n--- Aperçu ({n} premiers employés) ---")
    for e in rows:
        print(f"  id={e.id} | {e.poste} | {e.statut_marital} | quitte={e.a_quitte_l_entreprise}")


def predict_from_db(session, employee_id: int):
    pipeline, threshold = load_pipeline()

    emp = session.query(Employee).filter(Employee.id == employee_id).first()
    if not emp:
        print(f"Employé id={employee_id} introuvable.")
        return

    data = {col: getattr(emp, col) for col in [
        "age", "genre", "statut_marital", "poste", "domaine_etude",
        "niveau_education", "departement", "niveau_hierarchique_poste",
        "nombre_experiences_precedentes", "annee_experience_totale",
        "annees_dans_l_entreprise", "annees_dans_le_poste_actuel",
        "annees_sous_responsable_actuel", "annees_depuis_la_derniere_promotion",
        "note_evaluation_actuelle", "note_evaluation_precedente",
        "augmentation_salaire_precedente", "nb_formations_suivies",
        "nombre_participation_pee", "satisfaction_employee_environnement",
        "satisfaction_employee_nature_travail", "satisfaction_employee_equipe",
        "satisfaction_employee_equilibre_pro_perso", "heure_supplementaires",
        "frequence_deplacement", "distance_domicile_travail", "revenu_mensuel",
    ]}

    df = pd.DataFrame([data])
    proba = float(pipeline.predict_proba(df)[0][1])
    prediction = int(proba >= threshold)
    label = "Quitte" if prediction == 1 else "Reste"

    print(f"\n--- Prédiction pour l'employé id={employee_id} ---")
    print(f"  Poste : {emp.poste} | Réel : {'Quitte' if emp.a_quitte_l_entreprise else 'Reste'}")
    print(f"  Prédit : {label} (probabilité : {round(proba, 4)})")


def stats_predictions(session):
    total = session.query(Prediction).count()
    print(f"\n--- Prédictions loggées en base ---")
    print(f"Total : {total}")
    if total > 0:
        derniere = session.query(Prediction).order_by(Prediction.id.desc()).first()
        print(f"Dernière : id={derniere.id} | {'Quitte' if derniere.prediction == 1 else 'Reste'} | proba={derniere.probabilite} | {derniere.created_at}")


if __name__ == "__main__":
    session = SessionLocal()
    try:
        stats_employees(session)
        apercu_employees(session, n=5)
        first_employee = session.query(Employee).first()
        if first_employee:
            predict_from_db(session, employee_id=first_employee.id)
        stats_predictions(session)
    finally:
        session.close()