Cours de 3e année à l’ENSAE
2025/2026

Tendance à la spécialisation : data analyst, data engineer, ML Engineer…
Rôle d’interface entre métier et équipes techniques
Origine : communauté des développeurs logiciels
Constats :
Conséquence : un ensemble de règles informelles, conventionnellement acceptées comme produisant des logiciels fiables, évolutifs et maintenables
L’activité du datascientist tend à se rapprocher de celle du développeur :
projets intenses en code
projets collaboratifs et de grande envergure
complexification des données et des infrastructures
déploiement d’applications pour valoriser les modèles
Linux (Linux 101)Git (Git refresher)GitYAMLTout le contenu du cours est en open-source
Python
1️⃣ Travail collaboratif avec Git
2️⃣ Qualité du code
3️⃣ Structure des projets
4️⃣ Traitement des données volumineuses
5️⃣ Favoriser la portabilité d’une application
Git

Que versionne-t-on ?
.html, .pdf, modèles…)Note
Pour définir des règles qui évitent de committer tel ou tel fichier, on utilise un fichier nommé .gitignore.
Si on mélange du code et des éléments annexes (output, données…) dans un même dossier, il faut consacrer du temps à ce fichier.
N’hésitez pas à y ajouter des règles conservatrices (par exemple *.csv, *.parquet).
Format des commits

Git facilite le travail collaboratif
Git : modèle des branchesGitHub / GitLab : Issues, Pull Requests, Forks

Issue : soumettre un problème ou une suggestion aux développeurs d’un projet
Pull Request : proposer aux développeurs d’un projet d’intégrer des modifications
Fork : faire la copie d’un projet existant dans son espace personnel
Description plus détaillée : ici
D’une vision utilitariste du code à une vision du code comme outil de communication
Favoriser la lisibilité et la maintenabilité
Faciliter la réutilisation
Adopter les standards communautaires
Utiliser des fonctions
(Auto-)documenter son code
“Good coding style is like correct punctuation: you can manage without it, butitsuremakesthingseasiertoread”
Astuce
Règle d’or
Il faut utiliser une fonction dès qu’on utilise une même portion de code plus de deux fois (don’t repeat yourself (DRY))
Règles pour écrire des fonctions pertinentes
Documenter le pourquoi plutôt que le comment
Privilégier l’auto-documentation via des nommages pertinents
Comment bien documenter un script ?
Favoriser la lisibilité et la maintenabilité
Enjeux spécifiques à la data science
Favoriser une structure modulaire selon l’état du projet
Adopter les standards communautaires
(Auto-)documenter son projet
Premier niveau : structuration du code
Adopter une structure type package
main) orchestre les traitements
├── report.ipynb
├── correlation.png
├── data.csv
├── data2.csv
├── fig1.png
├── figure 2 (copy).png
├── report.pdf
├── partial data.csv
├── script.py
└── script_final.py
├── data
│ ├── raw
│ │ ├── data.csv
│ │ └── data2.csv
│ └── interim
│ └── partial data.csv
├── notebooks
│ └── report.ipynb
├── src
| ├── script.py
│ └── script_final.py
└── reports
├── report.pdf
└── figures
├── fig1.png
├── figure 2 (copy).png
├── figure10.png
└── correlation.png
├── data
│ ├── raw
│ │ ├── dpe_logement_202103.csv
│ │ └── dpe_logement_202003.csv
│ └── interim
│ └── dpe_logement_merged_preprocessed.csv
├── notebooks
│ └── report.ipynb
├── src
| ├── main.R
| ├── preprocessing.R
│ └── generate_plots.R
└── reports
├── report.pdf
└── figures
├── histogram_energy_diagnostic.png
├── barplot_consumption_pcs.png
├── correlation_matrix.png
└── correlation.png
Favoriser l’auto-documentation via des nommages pertinents
Inclure un fichier README.md à la racine du projet
Si open-source : inclure une licence


Historiquement : stockage dans des bases de données
80’s : essor des bases de données relationnelles






Innovations matérielles (serveurs, CPUs, RAM)
Formats de données plus efficients (Parquet)
Des outils de traitement larger-than-memory

CSVCSV

Parquet : propriétésParquet : partitionnement
Parquet ne résout pas tout
Pandas, dplyr en R, etc.)
ParquetParquet
DuckDB : un connecteur interopérable entre sources de données
Choisir une infrastructure adaptée aux besoins
Utiliser un format de données adapté (Parquet)
Utiliser des outils de traitement adaptés
DuckDB)Spark)On a construit un projet lisible, structuré et versionné
Peut-on partager notre projet ?

Python sur son posteConflits de version : différents projets peuvent requérir des versions différentes d’un même package
Version de Python fixe, celle de l’installation système
Reproductibilité limitée : difficile de dire quel projet nécessite quel package
Portabilité limitée : difficile de fixer dans un fichier les dépendances spécifiques à un projet
Python et des packages
Python : venv
virtualenv, pipenv, etc.)venv + pipPythonuv : un outil pour les gouverner tous
uv : utilisationuv init <nom_du_projet>
uv add scikit-learn
venv)uv run script.py
Python de l’environnement virtuelDévelopper dans un environnement virtuel est une bonne pratique
Favorise la reproductibilité
uv met à jour le fichier uv.lock qui spécifie toutes les dépendancesuv sync -> recrée l’environnement completFavorise la portabilité
uv maj le fichier pyproject.yaml qui spécifie les packages nécessairesGit pour distribuer la “recette” de l’environnementSource : docker.com
Docker est largement prédominant
Docker : installationDocker : outil en ligne de commande (CLI)

DockerfileDocker : fonctionnementSource : k21academy.com
Docker en pratiqueDockerSource : ibm.com

DataOps : construction de pipelines de données
MLOps : déploiement et maintenance de modèles de ML
6️⃣ Introduction au format YAML
7️⃣ Déploiement
8️⃣ MLOps
YAMLYAML ?YAML ?YAML vs. JSONYAML est un superset de JSON
JSON valide est un fichier YAML valideYAMLExtension : .yaml ou .yml
Structure hiérarchique basée sur des paires clé-valeur
Différents types à disposition (numériques, strings, booléens, listes)
YAML et l’approche GitOpsYAML (paradigme infrastructure as code)Git (approche GitOps)
Une API (application programming interface) est une interface logicielle qui permet de « connecter » un logiciel ou un service à un autre logiciel ou service afin d’échanger des données et des fonctionnalités.

GET, POST, etc.)Exemple : https://api-adresse.data.gouv.fr/search/?q=comédie&type=street
JSON
Dépend essentiellement de l’infrastructure à disposition
Propriétés recherchées :
Solution : utiliser un orchestrateur de conteneurs
SSP Cloud : Kubernetes
Kubernetes s’assure en continu qu’il correspond à l’état réel
GitHub : GitHub ActionsGitLab : GitLab CI/CDSSP Cloud : ArgoCD.yaml qui paramétrise le runner
.github/workflows/.github/workflows/ci.yaml
name: Build Docker image
on:
push:
branches:
- main
tags:
jobs:
docker:
runs-on: ubuntu-latest
steps:
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: ensae-reproductibilite/api-titanic
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v5
with:
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}Kubernetes


Reproductibilité
Contrôle de version
Automatisation
Collaboration
Monitoring
SSP Cloud : MLFlowMLflow :
KubernetesMLFlow : vue d’ensemble
MLFlow : Tracking server
MLFlow : Models
MLFlow : Model registry
MLFlow)MLFlow)Surveiller une application est partie intégrante de l’approche DevOps
Contrôle technique de l’API :
Surveiller un modèle ML est partie intégrante de l’approche MLOps
Contrôle méthodologique du modèle
Performance en temps réel du modèle souvent impossible, utilisation de proxys :
Intégration de logs dans l’API
Récupération et mise en forme des logs
Suivi de métriques de ML
Mise en place d’un système d’alertes
Source: martinfowler.com
MLFlowBonnes pratiques pour la mise en production des projets de data science (retour homepage)
Comment favoriser la portabilité ?
Constuire des “bulles” plus ou moins isolées autour de son projet afin de packager l’environnement nécessaire
Des outils dédiés :