Ir al contenido principal

Tutorial de Great Expectations: validación de datos con Python

¡Aprende a validar tus datos con Great Expectations en Python con este tutorial de principio a fin!
Actualizado 22 jul 2026  · 8 min leer

Explorar con IA

Abrir en ChatGPTAbrir en ClaudeAbrir en Perplexity

La calidad y la consistencia de los datos son como los cimientos de una casa: sin una base sólida, todo lo que construyas encima corre el riesgo de venirse abajo. Ahí es donde entra la validación de datos. Validar datos te ayuda a asegurarte de que tu información sea precisa, coherente y fiable.

Great Expectations es una herramienta de validación de datos de código abierto que te permite detectar problemas a tiempo y garantizar que tus datos cumplan los estándares de calidad necesarios.

En esta guía, te explicamos paso a paso cómo usar Great Expectations para validar datos, con un ejemplo práctico de principio a fin para que puedas empezar cuanto antes.

¿Qué es Great Expectations?

Great Expectations (GX) es un framework de código abierto que se ha popularizado para gestionar y automatizar la validación de datos en pipelines de datos modernos.

Su framework basado en Python está diseñado para ayudar a los equipos de datos a garantizar la calidad y la coherencia de su información. Los usuarios pueden definir "expectations" (reglas o tests que describen cómo deben ser los datos válidos) que validan automáticamente si los datos cumplen esos estándares.

Algunas ventajas de Great Expectations son:

  • Validación de datos automatizada – Great Expectations automatiza la validación de datos, reduce el trabajo manual y minimiza el riesgo de errores. Garantiza que los datos cumplan de forma constante los estándares definidos.
  • Integración con pipelines de datos – Se integra fácilmente con distintas fuentes y plataformas, incluidas bases de datos SQLs, almacenamiento en la nube y herramientas ETL, lo que permite la validación de datos en diferentes etapas del pipeline.
  • Resultados claros y accionables – La herramienta ofrece resultados de validación transparentes, lo que facilita detectar problemas de calidad y solucionarlos rápido.
  • Documentación de datos – Great Expectations puede generar documentación detallada y accesible de tus procesos de validación, ayudando a alinear al equipo en los estándares de calidad y sirviendo como referencia futura.
  • Escalabilidad y flexibilidad – Al ser de código abierto, Great Expectations es altamente personalizable y escala con tus necesidades de validación, ofreciendo flexibilidad para adaptarse a múltiples casos de uso sin costes elevados.

Ahora, veamos un ejemplo de principio a fin.

Conviértete en Ingeniero de Datos

Desarrolla tus habilidades en Python para convertirte en un ingeniero de datos profesional.
Empieza Gratis

Configuración de Great Expectations

En este tutorial, aprenderás a usar GX Core, la versión de código abierto de Great Expectations, para validar un DataFrame de Pandas. Veremos cómo configurar un contexto, registrar una fuente de datos de Pandas, definir expectativas y validar lotes de datos.

Nota: te recomendamos seguirlo con el notebook de DataLab, aunque también puedes crear tu propio script en Python.

Requisitos previos

  • Python 3.9 a 3.12 instalado.
  • Para evitar conflictos, es muy recomendable instalar Great Expectations en un entorno virtual (aviso: la configuración de entornos virtuales queda fuera del alcance de este artículo).
  • Un conjunto de datos de ejemplo.

Nota: si usas el notebook de DataLab proporcionado, estos requisitos ya están cubiertos. Puedes saltártelos.

Usa el siguiente comando para instalar GX con pip:

pip install great_expectations

Este comando instala el paquete principal y todas las dependencias necesarias.

Great Expectations necesita un contexto de datos para gestionar configuraciones. Usamos un contexto efímero para evitar persistir configuraciones.

import great_expectations as gx

# Get the Ephemeral Data Context
context = gx.get_context()
assert type(context).__name__ == "EphemeralDataContext"

Crea tu primera suite de validación de datos

Ahora que GX está configurado, vamos a crear una suite de validación.

Una fuente de datos conecta Great Expectations con tus datos, mientras que un data asset representa un subconjunto específico (por ejemplo, una tabla, un DataFrame o un archivo).

En este caso, prepararemos todo para conectarnos a un DataFrame llamado inventory_parts_df. El dataset de ejemplo está disponible en el DataLab proporcionado y se crea al ejecutar el bloque de SQL:

Si no usas DataLab, crea tu propio DataFrame con datos de ejemplo.

Ahora crea la fuente de datos y el 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")

Una definición de lote identifica y organiza los datos para su validación. Aquí añadimos una que cubre todo el 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

Un lote es un conjunto de datos asociado a una definición de lote. Para validar, tendrás que recuperar y enlazar el lote con tu DataFrame, en este caso 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)

Las expectativas son reglas para validar datos. En este ejemplo, definiremos estas expectativas sencillas:

  1. Asegurar que los valores de inventory_id no sean nulos.
  2. Asegurar que los valores de part_num sean únicos.
# 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)

Puedes explorar todas las expectativas disponibles en la Expectation Gallery. ¡Te animamos a añadir unas cuantas más!

Después de definirlas, GX devuelve la configuración de la suite de expectativas:

{
  "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 incluye los siguientes detalles:

  1. Nombre e ID de la suite: un nombre único (inventory_parts_suite) e identificador para gestionarla y hacer su seguimiento.
  2. Expectativas: cada regla especifica:
    • El tipo de comprobación (p. ej., asegurar que una columna no tenga valores nulos o que sus valores sean únicos).
    • Parámetros, como la columna que se valida.
    • Metadatos e ID único por expectativa, lo que facilita su seguimiento y personalización.
  3. Metadatos: información de versión de Great Expectations para asegurar compatibilidad.
  4. Notas: un espacio para añadir comentarios descriptivos sobre la suite (opcional).

Esta salida estructurada funciona como documentación y como configuración reutilizable para validar tu dataset, de modo que tus expectativas queden claras, trazables y listas para usarlas en el futuro.

5. Validar los datos

Por último, valida el lote con las expectativas definidas y evalúa los resultados.

# Validate the Data Against the Suite
validation_results = batch.validate(suite)
# Evaluate the Results
print(validation_results)

Tras ejecutar la validación, Great Expectations ofrece un informe detallado sobre si el conjunto de datos cumple las expectativas definidas:

{
  "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
}

Este informe detalla la calidad de tus datos, señalando aciertos y fallos. Aquí tienes una explicación simplificada de los resultados:

Validación general: el resultado fue parcialmente satisfactorio: el 50% de las expectativas pasaron y el 50% fallaron. Una expectativa fallida indica un problema de calidad que requiere atención. En este caso, una columna no cumple la regla definida.

Expectativa 1: inventory_id no debe tener valores ausentes

  • Resultado: aprobado
  • Explicación: todos los valores de la columna inventory_id están presentes, sin nulos ni ausencias. Indica buena completitud de datos en esta columna.

Expectativa 2: part_num debe tener valores únicos

  • Resultado: no aprobado
  • Explicación: la columna part_num contiene un 97,98% de valores duplicados, es decir, muy pocos son únicos.
  • Destacados:
    • Ejemplos de duplicados: "3069b" y "33291".
    • La herramienta también muestra la frecuencia de estos duplicados y sus posiciones de fila, lo que facilita localizarlos y corregirlos.

Por supuesto, este es solo un dataset de ejemplo e incluimos a propósito una expectativa aprobada y otra no aprobada para que veas ambos resultados.

¡Listo! Has ejecutado validaciones de datos de principio a fin.

Integrar Great Expectations en pipelines de datos

En producción, las validaciones deben integrarse directamente en el flujo de trabajo para monitorizar la calidad de los datos de forma continua en cada etapa.

En esta sección, veremos cómo integrar Great Expectations en tus pipelines de datos.

Son ejemplos para orientarte; puede que necesites configuraciones adicionales no incluidas aquí. Consulta la documentación de cada herramienta para la sintaxis actualizada.

Integración con herramientas ETL

Integrar Great Expectations con herramientas ETL populares como Apache Airflow o Prefect es relativamente sencillo. Incluir pasos de validación directamente en los procesos ETL te permitirá detectar y resolver problemas en tiempo real antes de que afecten a los análisis posteriores.

Veamos un ejemplo sencillo de integración con Prefect para ejecutar validaciones como parte de un ETL automatizado:

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()

En este ejemplo definimos un flujo de Prefect con una tarea para ejecutar la validación de Great Expectations.

La tarea validate_data() carga el contexto de Great Expectations, recupera el lote de datos y aplica la suite de expectativas.

Si los datos no cumplen los criterios de validación, la tarea lanza una alerta, detiene el flujo y evita errores aguas abajo.

Validación continua de datos

Puedes programar validaciones con diversas herramientas, como cron en sistemas Unix o servicios gestionados como Apache Airflow. En este ejemplo, mostraremos cómo programarlas con Airflow, ideal para orquestar pipelines de datos.

Así puedes configurar un DAG de Airflow (Directed Acyclic Graph) para ejecutar validaciones de Great Expectations a diario:

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

En este ejemplo definimos un DAG que programa una validación una vez al día (@daily).

La función run_validation() ejecuta la validación cargando el contexto de Great Expectations y aplicando la suite de expectativas definida a los datos.

Buenas prácticas para validar datos con Great Expectations

Seguir buenas prácticas siempre es aconsejable para escalar y ser eficiente, y con Great Expectations no es diferente.

Empieza poco a poco e itera

Comienza con comprobaciones básicas de calidad y amplía gradualmente. Es mejor centrarse primero en expectativas fundamentales para no complicar en exceso el proceso, lo que facilita la integración y el diagnóstico. A medida que entiendas mejor el dataset, podrás añadir validaciones más complejas.

Colabora entre equipos

La calidad de datos no es solo un asunto técnico. Colabora con equipos de negocio para definir expectativas y asegurarte de que la validación implementada esté alineada con la lógica y los objetivos del negocio. Este enfoque transversal garantiza que los datos cumplan su propósito y las necesidades de todos los stakeholders.

Automatiza siempre que puedas

Automatiza el proceso siempre que sea posible para integrar la validación en los pipelines. Incluir comprobaciones automáticas permite monitorizar la calidad de forma continua sin intervención manual, lo que mejora mucho la eficiencia.

Conclusión

¡Buen trabajo! Has aprendido a configurar y validar datos en Great Expectations. Estas técnicas te ayudarán a mantener una alta calidad y transparencia en tus flujos de trabajo.

Para seguir desarrollando tus habilidades, consulta estos recursos:

Conviértete en Ingeniero de Datos

Demuestra tus habilidades como ingeniero de datos preparado para el trabajo.

FAQs

¿Cómo se compara Great Expectations con otras herramientas de validación de datos?

Great Expectations es de código abierto, flexible y se integra bien con los pipelines de datos modernos. Destaca por su amplia biblioteca de expectativas y su sólida documentación.

¿Necesito saber Python para usar Great Expectations?

Aunque tener nociones básicas de Python ayuda, Great Expectations ofrece una CLI fácil de usar y documentación extensa, por lo que también es accesible para personas sin perfil técnico.

¿Qué tipos de fuentes de datos admite Great Expectations?

Great Expectations admite una amplia variedad de fuentes de datos, entre ellas:

  • Bases de datos relacionales como PostgreSQL, MySQL y SQL Server.
  • Almacenamiento en la nube como AWS S3, Google Cloud Storage y Azure Blob Storage.
  • Formatos de archivo como CSV, Parquet y Excel.
  • Frameworks de big data como Apache Spark y Databricks. Puedes conectar Great Expectations fácilmente a estas fuentes usando la configuración adecuada de tu datasource.

¿Puedo usar Great Expectations con datos en streaming?

Great Expectations está pensado principalmente para validación por lotes. Aunque no soporta de forma nativa pipelines de streaming, puedes integrarlo con frameworks como Apache Kafka o Spark Structured Streaming validando instantáneas o microbatches de datos periódicamente.

¿Se pueden versionar las expectativas y los resultados de validación?

Sí. Puedes versionar expectativas y configuraciones guardándolas como archivos YAML o JSON en un repositorio Git. Para los resultados de validación, puedes configurar un almacén en base de datos o basado en archivos para hacer seguimiento en el tiempo e integrarlos en tus pipelines de CI/CD para monitorización continua.

¿Cómo gestiona Great Expectations la evolución del esquema en los datasets?

Great Expectations gestiona la evolución de esquemas gracias a su marco flexible de expectativas. Si tu esquema cambia, puedes:

  • Usar expect_table_columns_to_match_set u otras expectativas similares para validar dinámicamente los nombres de columnas.
  • Modificar o crear nuevas suites de expectativas para adaptarte al nuevo esquema.
  • Aprovechar herramientas de inferencia de esquemas para actualizar automáticamente las expectativas de columnas añadidas.

Kurtis Pykes 's photo
Author
Kurtis Pykes
LinkedIn

Thalia Barrera's photo
Author
Thalia Barrera

Thalia Barrera es Editora Senior de Ciencia de Datos en DataCamp, con un máster en Informática y más de una década de experiencia en ingeniería de software y datos. Thalia disfruta simplificando conceptos tecnológicos para ingenieros y científicos de datos a través de publicaciones en blogs, tutoriales y cursos en vídeo.

Temas

¡Sigue aprendiendo data engineering con estos cursos!

programa

Ingeniero de datos en Python

40 h
Adquiere habilidades demandadas para ingerir, limpiar y gestionar datos de forma eficaz, así como para programar y supervisar canalizaciones, lo que te diferenciará en el campo de la ingeniería de datos.
Ver detallesRight Arrow
Iniciar Curso
Ver másRight Arrow
Relacionado

Tutorial

Tutorial de Excel en Python: La guía definitiva

Aprende a leer e importar archivos Excel en Python, a escribir datos en estas hojas de cálculo y a encontrar los mejores paquetes para hacerlo.
Natassha Selvaraj's photo

Natassha Selvaraj

Tutorial

Funciones en Python: cómo llamar y escribir funciones

Descubre cómo escribir funciones en Python reutilizables y eficientes. Domina los parámetros, las sentencias return y temas avanzados como las funciones lambda. Organiza mejor tu código con main() y otras buenas prácticas.
Karlijn Willems's photo

Karlijn Willems

Tutorial

Tutorial de pandas en Python: La guía definitiva para principiantes

¿Estás preparado para comenzar tu viaje de pandas? Aquí tienes una guía paso a paso sobre cómo empezar.
Vidhi Chugh's photo

Vidhi Chugh

Tutorial

Tutorial de visualización de datos con Python y Tableau

Aprende a utilizar Python para ampliar las funciones de visualización de datos de Tableau.
Abid Ali Awan's photo

Abid Ali Awan

Tutorial

Tutorial de Python String format()

Aprende a formatear cadenas en Python.
DataCamp Team's photo

DataCamp Team

Tutorial

Tutorial de Estructuras de Datos en Python

Introdúcete en las estructuras de datos de Python: aprende más sobre tipos de datos y estructuras de datos primitivas y no primitivas, como cadenas, listas, pilas, etc.
Sejal Jaiswal's photo

Sejal Jaiswal

Ver MásVer Más