Spaces:
Sleeping
Sleeping
File size: 3,491 Bytes
c12fb2b e1edad9 53ed85e c12fb2b 53ed85e c12fb2b 53ed85e c12fb2b 53ed85e c12fb2b 91e6c31 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()
|