# PostgreSQL connection via SQLAlchemy
engine = create_engine(
"postgresql://analyst:****@192.168.1.42:5432/recruitment_db"
)
query = """
SELECT m.*, p.acceptance_date, p.candidate_id,
h.amount_excl_tax AS fees, c.sector_experience,
s.label AS sector_label
FROM missions m
LEFT JOIN job_placements p ON p.mission_id = m.id
LEFT JOIN fees h ON h.placement_id = p.id
LEFT JOIN candidates c ON c.id = p.candidate_id
LEFT JOIN secteurs_ref s ON s.code = m.secteur
WHERE m.open_date BETWEEN '2023-01-01' AND '2025-12-31'
"""
df = pd.read_sql(query, engine)
print(f"Shape : {df.shape}")
print(f"Columns : {list(df.columns)}")
df.head(3)
Shape : (1 847, 18)
Columns : ['id', 'open_date', 'sector', 'job_level', 'consultant_id', 'client_id', 'salary_min', 'salary_max', 'nb_interviews', 'status', 'close_date', 'acceptance_date', 'candidate_id', 'fees', 'sector_experience', 'sector_label', 'delay_days', 'placed']
|
id |
open_date |
secteur |
job_level |
nb_interviews |
delay_days |
fees |
placed |
| 0 | 1001 | 2023-01-15 | TECH | Senior Exec. | 3 | 34 | 6 200 | 1 |
| 1 | 1002 | 2023-01-23 | FIN | Manager | 4 | 47 | 8 100 | 1 |
| 2 | 1003 | 2023-02-03 | COM | Manager | 6 | 72 | 4 800 | 0 |