Cursus
La qualité des données et leur cohérence sont les fondations d'une maison : sans base solide, tout ce que vous construisez au-dessus risque de s'effondrer. C'est là que la validation des données joue un rôle clé. Elle vous aide à vous assurer que vos données sont exactes, cohérentes et fiables.
Great Expectations est un outil open source de validation des données qui permet de détecter tôt les anomalies et de garantir que vos données respectent les normes de qualité requises.
Dans ce guide, nous vous expliquons pas à pas comment utiliser Great Expectations pour valider des données, à l'aide d'un exemple pratique de bout en bout pour vous lancer.
Qu'est-ce que Great Expectations ?
Great Expectations (GX) est un framework open source devenu référence pour gérer et automatiser la validation des données dans les pipelines de données modernes.
Son framework basé sur Python aide les équipes data à garantir la qualité et la cohérence de leurs données. Les utilisateurs peuvent définir des « expectations » : des règles ou tests qui décrivent à quoi devraient ressembler des données valides, et valider automatiquement si les données respectent ces standards.
Parmi les avantages de Great Expectations :
- Validation automatisée des données – Great Expectations automatise la validation, réduit les tâches manuelles et limite les risques d'erreurs. Il s'assure que les données respectent en continu des standards prédéfinis.
- Intégration aux pipelines de données – Il s'intègre facilement à de nombreuses sources et plateformes, y compris les bases de données SQLs, le stockage cloud et les outils ETL, permettant la validation à chaque étape de votre pipeline.
- Résultats clairs et actionnables – L'outil fournit des résultats transparents, ce qui facilite l'identification rapide des problèmes de qualité et leur résolution.
- Documentation des données – Great Expectations peut générer une documentation détaillée et accessible de vos processus de validation, facilitant l'alignement des équipes sur les standards de qualité et servant de référence pour l'avenir.
- Scalabilité et flexibilité – En tant qu'outil open source, Great Expectations est hautement personnalisable et s'adapte à la montée en charge de vos besoins de validation, avec la flexibilité nécessaire pour couvrir divers cas d'usage sans coûts élevés.
Passons maintenant à un exemple de bout en bout !
Devenez ingénieur en données
Configurer Great Expectations
Dans ce tutoriel, vous apprendrez à utiliser GX Core, la version open source de Great Expectations, pour valider un DataFrame Pandas. Nous verrons comment créer un contexte, enregistrer une source de données Pandas, définir des expectations et valider des lots de données.
Remarque : nous vous recommandons de suivre avec le notebook DataLab, mais vous pouvez également créer votre propre script Python.
1. Installer Great Expectations
Prérequis
- Python 3.9 à 3.12 installé.
- Pour éviter les conflits, il est fortement recommandé d'installer Great Expectations dans un environnement virtuel (avertissement : la configuration des environnements virtuels dépasse le cadre de cet article).
- Un jeu de données d'exemple.
Remarque : si vous utilisez le notebook DataLab fourni, ces prérequis sont déjà remplis. Vous pouvez les passer.
Utilisez la commande suivante pour installer GX via pip :
pip install great_expectations
Cette commande installe le package principal et toutes les dépendances nécessaires.
2. Initialiser le contexte de données
Great Expectations requiert un contexte de données pour gérer les configurations. Nous utilisons ici un contexte éphémère pour éviter de persister les configurations.
import great_expectations as gx
# Get the Ephemeral Data Context
context = gx.get_context()
assert type(context).__name__ == "EphemeralDataContext"
Créer votre première suite de validation
Maintenant que GX est configuré, créons une suite de validation.
1. Se connecter à une source de données et créer un asset
Une source de données relie Great Expectations à vos données, tandis qu'un asset représente un sous-ensemble spécifique (par ex. : une table, un DataFrame ou un fichier).
Dans notre cas, nous allons tout préparer pour nous connecter à un DataFrame appelé inventory_parts_df. Le jeu de données d'exemple est disponible dans le DataLab fourni et est créé lorsque nous exécutons le bloc SQL :

Si vous n'utilisez pas DataLab, créez votre propre DataFrame avec des données d'exemple.
Créez maintenant votre source et votre asset :
# Add a Pandas Data Source
data_source = context.data_sources.add_pandas(name="inventory_parts")
# Add a Data Asset to the Data Source
data_asset = data_source.add_dataframe_asset(name="inventory_parts_asset")
2. Ajouter une définition de lot (batch)
Une définition de lot identifie et organise vos données pour la validation. Ici, nous ajoutons une définition qui couvre l'intégralité du DataFrame :
# Define the Batch Definition name
batch_definition_name = "inventory_parts_batch"
# Add the Batch Definition
batch_definition = data_asset.add_batch_definition_whole_dataframe(batch_definition_name)
assert batch_definition.name == batch_definition_name
3. Récupérer un lot
Un lot est un ensemble de données lié à une définition de lot. Pour valider, vous devez récupérer le lot et le lier à votre DataFrame, ici inventory_parts_df :
# Define the Batch Parameters
batch_parameters = {"dataframe": inventory_parts_df}
# Retrieve the Batch
batch = batch_definition.get_batch(batch_parameters=batch_parameters)
4. Créer une suite et définir des expectations
Les expectations sont des règles de validation. Dans cet exemple, nous allons définir deux expectations simples :
- S'assurer que les valeurs de
inventory_idne sont pas nulles. - S'assurer que les valeurs de
part_numsont uniques.
# Create an Expectation Suite
expectation_suite_name = "inventory_parts_suite"
suite = gx.ExpectationSuite(name=expectation_suite_name)
# Add Expectations
suite.add_expectation(
gx.expectations.ExpectColumnValuesToNotBeNull(column="inventory_id")
)
suite.add_expectation(
gx.expectations.ExpectColumnValuesToBeUnique(column="part_num")
)
# Add the Expectation Suite to the Context
context.suites.add(suite)
Vous pouvez explorer toutes les expectations disponibles dans la galerie d'expectations. N'hésitez pas à en ajouter d'autres !
Après la définition, GX génère la configuration de la suite :
{
"name": "inventory_parts_suite",
"id": "b2de0b69-0869-4163-8dde-6c09884483f7",
"expectations": [
{
"type": "expect_column_values_to_not_be_null",
"kwargs": {
"column": "inventory_id"
},
"meta": {},
"id": "53d6c42a-d190-412f-a113-783b706531f4"
},
{
"type": "expect_column_values_to_be_unique",
"kwargs": {
"column": "part_num"
},
"meta": {},
"id": "362a2bdc-616d-4b3a-b7f0-c73808caee78"
}
],
"meta": {
"great_expectations_version": "1.2.4"
},
"notes": null
}
La suite comprend les éléments suivants :
- Nom et ID de la suite : un nom unique (
inventory_parts_suite) et un identifiant pour suivre et gérer la suite. - Expectations : chaque règle précise :
- Le type de contrôle (par ex. : absence de valeurs nulles ou unicité des entrées).
- Les paramètres, comme la colonne validée.
- Des métadonnées et un ID unique pour faciliter le suivi et la personnalisation.
- Métadonnées : informations de version de Great Expectations pour assurer la compatibilité.
- Notes : un emplacement pour ajouter des commentaires descriptifs sur la suite (optionnel).
Cette sortie structurée sert à la fois de documentation et de configuration réutilisable pour valider votre jeu de données : vos expectations sont définies clairement, traçables et prêtes pour un usage futur.
5. Valider les données
Validez enfin le lot par rapport aux expectations définies et évaluez les résultats.
# Validate the Data Against the Suite
validation_results = batch.validate(suite)
# Evaluate the Results
print(validation_results)
Après l'exécution, Great Expectations fournit un rapport détaillé indiquant si le jeu de données respecte les expectations définies :
{
"success": false,
"results": [
{
"success": true,
"expectation_config": {
"type": "expect_column_values_to_not_be_null",
"kwargs": {
"batch_id": "inventory_parts-inventory_parts_asset",
"column": "inventory_id"
},
"meta": {},
"id": "53d6c42a-d190-412f-a113-783b706531f4"
},
"result": {
"element_count": 580069,
"unexpected_count": 0,
"unexpected_percent": 0.0,
"partial_unexpected_list": [],
"partial_unexpected_counts": [],
"partial_unexpected_index_list": []
},
"meta": {},
"exception_info": {
"raised_exception": false,
"exception_traceback": null,
"exception_message": null
}
},
{
"success": false,
"expectation_config": {
"type": "expect_column_values_to_be_unique",
"kwargs": {
"batch_id": "inventory_parts-inventory_parts_asset",
"column": "part_num"
},
"meta": {},
"id": "362a2bdc-616d-4b3a-b7f0-c73808caee78"
},
"result": {
"element_count": 580069,
"unexpected_count": 568352,
"unexpected_percent": 97.98006788847535,
"partial_unexpected_list": [
"48379c01",
"paddle",
"11816pr0005",
"2343",
"3003",
"30176",
"3020",
"3022",
"3023",
"30357",
"3039",
"3062b",
"3068b",
"3069b",
"3069b",
"33291",
"33291",
"3795",
"3941",
"3960"
],
"missing_count": 0,
"missing_percent": 0.0,
"unexpected_percent_total": 97.98006788847535,
"unexpected_percent_nonmissing": 97.98006788847535,
"partial_unexpected_counts": [
{
"value": "3069b",
"count": 2
},
{
"value": "33291",
"count": 2
},
{
"value": "11816pr0005",
"count": 1
},
{
"value": "2343",
"count": 1
},
{
"value": "3003",
"count": 1
},
{
"value": "30176",
"count": 1
},
{
"value": "3020",
"count": 1
},
{
"value": "3022",
"count": 1
},
{
"value": "3023",
"count": 1
},
{
"value": "30357",
"count": 1
},
{
"value": "3039",
"count": 1
},
{
"value": "3062b",
"count": 1
},
{
"value": "3068b",
"count": 1
},
{
"value": "3795",
"count": 1
},
{
"value": "3941",
"count": 1
},
{
"value": "3960",
"count": 1
},
{
"value": "48379c01",
"count": 1
},
{
"value": "paddle",
"count": 1
}
],
"partial_unexpected_index_list": [
0,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21
]
},
"meta": {},
"exception_info": {
"raised_exception": false,
"exception_traceback": null,
"exception_message": null
}
}
],
"suite_name": "inventory_parts_suite",
"suite_parameters": {},
"statistics": {
"evaluated_expectations": 2,
"successful_expectations": 1,
"unsuccessful_expectations": 1,
"success_percent": 50.0
},
"meta": {
"great_expectations_version": "1.2.4",
"batch_spec": {
"batch_data": "PandasDataFrame"
},
"batch_markers": {
"ge_load_time": "20241129T122532.416424Z",
"pandas_data_fingerprint": "84a1e1939091fcf54324910def3b89cd"
},
"active_batch_definition": {
"datasource_name": "inventory_parts",
"data_connector_name": "fluent",
"data_asset_name": "inventory_parts_asset",
"batch_identifiers": {
"dataframe": "<DATAFRAME>"
}
}
},
"id": null
}
Ce rapport détaille la qualité de vos données, en mettant en évidence les succès et les échecs. Voici une lecture simplifiée des résultats :
Validation globale : le résultat est partiellement réussi : 50 % des expectations sont validées, 50 % échouent. Un échec indique un problème de qualité à corriger. Ici, une colonne ne respecte pas la règle définie.
Expectation 1 : inventory_id ne doit comporter aucune valeur manquante
- Résultat : réussi
- Explication : chaque valeur de la colonne
inventory_idest présente, sans entrées nulles ou manquantes. Cela indique une bonne complétude des données pour cette colonne.
Expectation 2 : part_num doit contenir des valeurs uniques
- Résultat : échec
- Explication : la colonne
part_numcontient 97,98 % de valeurs dupliquées, ce qui signifie que très peu de valeurs sont uniques. - Points saillants :
- Exemples de doublons : « 3069b » et « 33291 ».
- L'outil indique aussi leur fréquence et leurs positions, ce qui facilite la localisation et la correction.
Bien sûr, il s'agit d'un jeu d'exemple, et nous avons inclus volontairement une expectation réussie et une échouée pour illustrer les deux cas.
Et voilà ! Vous avez exécuté une validation de données de bout en bout.
Intégrer Great Expectations dans les pipelines de données
En production, les validations doivent être intégrées directement au workflow pour surveiller en continu la qualité des données à chaque étape.
Dans cette section, nous voyons comment intégrer Great Expectations à vos pipelines de données.
Ces exemples visent à vous donner une idée ; des configurations supplémentaires peuvent être nécessaires. Consultez la documentation de chaque outil pour une syntaxe à jour !
Intégration avec des outils ETL
Intégrer Great Expectations avec des outils ETL populaires comme Apache Airflow ou Prefect est relativement simple. En plaçant des étapes de validation directement dans les processus ETL, vous décelez et corrigez les problèmes en temps réel avant qu'ils n'affectent les analyses en aval.
Voyons un exemple simple d'intégration de Great Expectations avec Prefect pour exécuter une validation dans le cadre d'un ETL automatisé :
from prefect import task, Flow
import great_expectations as ge
# Define a task to run Great Expectations validation
@task
def validate_data():
context = ge.data_context.DataContext()
batch_kwargs = {"path": "path/to/your/datafile.csv", "datasource": "your_datasource"}
batch = context.get_batch(batch_kwargs, suite_name="your_expectation_suite")
results = context.run_validation_operator("action_list_operator", assets_to_validate=[batch])
# Check validation results and raise an alert if validation fails
if not results["success"]:
raise ValueError("Data validation failed!")
# Define your ETL flow
with Flow("ETL_with_GE_Validation") as flow:
validation = validate_data()
# Execute the flow
flow.run()
Dans cet exemple, nous définissons un flow Prefect avec une tâche qui exécute la validation Great Expectations.
La tâche validate_data() charge le contexte, récupère le lot de données et applique la suite d'expectations.
Si les données ne respectent pas les critères, la tâche lève une alerte, stoppe le workflow et évite les erreurs en aval.
Validation continue des données
Vous pouvez planifier des validations avec différents outils, comme cron sur les systèmes Unix, ou des services managés comme Apache Airflow. Ci-dessous, un exemple de planification avec Airflow, idéal pour orchestrer des pipelines.
Voici comment configurer un DAG Airflow (Directed Acyclic Graph) pour exécuter quotidiennement des validations Great Expectations :
from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from datetime import datetime
import great_expectations as ge
# Define the DAG and set the schedule to run daily
default_args = {
'owner': 'airflow',
'start_date': datetime(2024, 1, 1),
'retries': 1,
}
dag = DAG(
'great_expectations_validation',
default_args=default_args,
schedule_interval='@daily', # Runs once a day
)
# Define the function to run the validation
def run_validation():
context = ge.data_context.DataContext()
batch = context.get_batch(batch_kwargs, suite_name="your_expectation_suite")
results = context.run_validation_operator("action_list_operator", assets_to_validate=[batch])
return results
# Set up the task in Airflow
validation_task = PythonOperator(
task_id='run_great_expectations_validation',
python_callable=run_validation,
dag=dag,
)
# Set the task in the DAG
validation_task
Dans cet exemple, nous définissons un DAG qui planifie une exécution quotidienne (@daily).
La fonction run_validation() charge le contexte Great Expectations et exécute la suite d'expectations sur les données.
Bonnes pratiques pour la validation avec Great Expectations
Suivre les bonnes pratiques est essentiel pour la scalabilité et l'efficacité ; c'est aussi vrai pour la validation des données avec Great Expectations.
Commencez petit et itérez
Démarrez par des contrôles fondamentaux puis étendez progressivement. Il vaut mieux se concentrer d'abord sur des expectations basiques pour éviter de complexifier inutilement : l'intégration sera plus fluide et le dépannage plus simple. Au fur et à mesure que vous comprenez mieux le jeu de données, ajoutez des validations plus avancées.
Collaborez entre équipes
La qualité des données n'est pas qu'un sujet technique. Collaborez avec les équipes métier pour définir les expectations et garantir qu'elles reflètent la logique et les objectifs business. Cette approche transverse assure que les données servent leur finalité et répondent aux besoins de toutes les parties prenantes.
Automatisez dès que possible
Automatisez la validation dans vos pipelines autant que possible. Des contrôles automatisés permettent une surveillance continue de la qualité, sans intervention manuelle, et améliorent significativement l'efficacité.
Conclusion
Bravo ! Vous savez désormais configurer et valider des données avec Great Expectations. Ces techniques vous aideront à maintenir une haute qualité et une transparence accrue dans vos workflows.
Pour continuer à développer vos compétences, consultez ces ressources :
- ETL and ELT in Python : apprenez à transformer et déplacer les données efficacement.
- Introduction to Data Quality : découvrez les fondamentaux de la gestion de la qualité des données.
- Cleaning Data in Python : maîtrisez les techniques de nettoyage pour garantir l'exactitude et la cohérence.
- Data Quality Dimensions Cheat Sheet : un aide-mémoire des dimensions de la qualité des données.
Devenez ingénieur en données
FAQs
Comment Great Expectations se compare-t-il aux autres outils de validation des données ?
Great Expectations est open source, flexible et s'intègre bien aux pipelines de données modernes. Il se distingue par sa vaste bibliothèque d'expectations et sa documentation de qualité.
Dois-je connaître Python pour utiliser Great Expectations ?
Des notions de base en Python sont utiles, mais Great Expectations propose une CLI conviviale et une documentation abondante, ce qui le rend accessible aux non-programmeurs.
Quels types de sources de données sont pris en charge par Great Expectations ?
Great Expectations prend en charge un large éventail de sources de données, notamment :
- Des bases relationnelles comme PostgreSQL, MySQL et SQL Server.
- Des stockages cloud comme AWS S3, Google Cloud Storage et Azure Blob Storage.
- Des formats de fichiers comme CSV, Parquet et Excel.
- Des frameworks big data comme Apache Spark et Databricks. Vous pouvez connecter facilement Great Expectations à ces sources via la configuration adaptée de votre datasource.
Puis-je utiliser Great Expectations avec des données en streaming ?
Great Expectations est principalement conçu pour la validation par lots. Bien qu'il ne prenne pas nativement en charge le streaming, vous pouvez l'intégrer à des frameworks comme Apache Kafka ou Spark Structured Streaming en validant périodiquement des snapshots ou micro-lots.
Est-il possible de versionner les expectations et les résultats de validation ?
Oui. Vous pouvez versionner les expectations et configurations en les stockant en YAML ou JSON dans un dépôt Git. Pour les résultats de validation, mettez en place une base de données ou un stockage de fichiers pour les suivre dans le temps et les intégrer à vos pipelines CI/CD pour une surveillance continue.
Comment Great Expectations gère-t-il l'évolution du schéma des jeux de données ?
Great Expectations gère l'évolution de schéma grâce à son cadre d'expectations flexible. Si votre schéma change, vous pouvez :
- Utiliser
expect_table_columns_to_match_setou des expectations similaires pour valider dynamiquement les noms de colonnes. - Modifier ou créer de nouvelles suites d'expectations pour s'adapter au nouveau schéma.
- Exploiter des outils d'inférence de schéma pour mettre à jour automatiquement les expectations des colonnes ajoutées.
Thalia Barrera est rédactrice senior en science des données chez DataCamp. Elle est titulaire d'un master en informatique et a plus de dix ans d'expérience dans l'ingénierie des logiciels et des données. Thalia aime simplifier les concepts techniques pour les ingénieurs et les scientifiques des données à travers des articles de blog, des tutoriels et des cours vidéo.

