Great Expectations: Validação e Qualidade de Dados para Pipelines de Machine Learning

O que é o Great Expectations?
O Great Expectations (GX) é uma biblioteca open-source Python para validação, documentação e profiling de dados. Criada em 2018 pela Superconductive, a ferramenta se tornou o padrão-ouro para garantia de qualidade de dados em pipelines de dados e machine learning — equivalente ao que testes unitários representam para o desenvolvimento de software.
Em vez de confiar em scripts ad-hoc de validação espalhados pelo código, o Great Expectations oferece uma abordagem declarativa: você define expectations (expectativas) sobre seus dados, executa validações automaticamente e gera documentação rica e interativa sobre a qualidade dos seus datasets.
Conceitos Fundamentais
O Great Expectations é construído sobre quatro conceitos principais:
- Expectation (Expectativa): Uma afirmação verificável sobre seus dados. Exemplos:
expect_column_values_to_not_be_null,expect_column_values_to_be_between,expect_table_row_count_to_be_between. Existem mais de 50 expectations nativas. - Expectation Suite (Suíte): Um conjunto organizado de expectations que define o perfil de qualidade esperado para um determinado dataset.
- Data Source (Fonte de Dados): Conectores para diversas fontes — Pandas DataFrames, Spark DataFrames, bancos SQL (PostgreSQL, Snowflake, BigQuery), e arquivos (CSV, Parquet, Excel).
- Data Docs (Documentação de Dados): Documentação HTML interativa gerada automaticamente, mostrando o resultado das validações com gráficos, estatísticas e exemplos de falhas.
Primeiros Passos na Prática
Vamos configurar o Great Expectations em um pipeline real:
# Instalação\npip install great_expectations\n\n# Inicializar um projeto GX\ngreat_expectations initCom o projeto inicializado, crie sua primeira suíte de expectations:
import great_expectations as gx\n\n# Conectar a uma fonte de dados\ncontext = gx.get_context()\n\n# Adicionar validações\nsuite = context.suites.add(gx.ExpectationSuite("vendas_suite"))\n\nsuite.add_expectation(\n gx.expectations.ExpectColumnValuesToNotBeNull(\n column="valor_total"\n )\n)\nsuite.add_expectation(\n gx.expectations.ExpectColumnValuesToBeBetween(\n column="quantidade",\n min_value=1,\n max_value=1000\n )\n)\nsuite.add_expectation(\n gx.expectations.ExpectColumnValuesToBeInSet(\n column="status",\n value_set=["PENDENTE", "PAGO", "CANCELADO", "REEMBOLSADO"]\n )\n)\nsuite.add_expectation(\n gx.expectations.ExpectTableRowCountToBeBetween(\n min_value=1_000,\n max_value=10_000_000\n )\n)Validando Dados em Produção
Com as expectations definidas, você pode validar qualquer dataset contra a suíte:
import pandas as pd\nimport great_expectations as gx\n\n# Carregar dados\ndf = pd.read_parquet("vendas_2026_06_17.parquet")\n\n# Criar validador\nvalidator = context.sources.pandas_default.add_dataframe_asset(\n name="vendas", dataframe=df\n)\n\n# Executar validação\nresultados = validator.validate(suite)\n\n# Verificar resultado\nif not resultados["success"]:\n print(f"Falhas encontradas: {resultados['statistics']['unsuccessful_expectations']}")\n for resultado in resultados["results"]:\n if not resultado["success"]:\n print(f" - {resultado['expectation_config']['expectation_type']}: "\n f"{resultado['expectation_config']['kwargs']}")\nelse:\n print("✓ Todos os dados passaram nas validações!")Integração com Pipelines de Dados
O Great Expectations se integra nativamente com as principais ferramentas de orquestração de dados:
Com Apache Airflow
from airflow import DAG\nfrom airflow.operators.python import PythonOperator\nfrom datetime import datetime\nimport great_expectations as gx\n\ndef validar_vendas():\n context = gx.get_context()\n df = ... # carregar dados\n \n validator = context.sources.pandas_default.add_dataframe_asset(\n name="vendas", dataframe=df\n )\n suite = context.suites.get("vendas_suite")\n resultados = validator.validate(suite)\n \n if not resultados["success"]:\n raise ValueError("Dados não passaram nas validações!")\n\nwith DAG(\n "pipeline_vendas",\n start_date=datetime(2026, 1, 1),\n schedule="@daily",\n catchup=False\n) as dag:\n validar = PythonOperator(\n task_id="validar_qualidade",\n python_callable=validar_vendas\n )Com dbt
O Great Expectations complementa o dbt perfeitamente. Enquanto o dbt valida a lógica de transformação SQL, o GX valida os dados brutos na origem e os dados finais nas tabelas:
# No seu projeto dbt, use GX para validar tabelas materializadas\nimport great_expectations as gx\nfrom sqlalchemy import create_engine\n\nengine = create_engine("postgresql://user:pass@host:5432/warehouse")\ncontext = gx.get_context()\n\n# Validar tabela final do dbt\nsuite = context.suites.get("dbt_mart_vendas")\nvalidator = context.sources.sql.add_sql_data_source(\n name="warehouse", connection_string=str(engine.url)\n)\n\nbatch = validator.get_batch(\n data_source="warehouse",\n data_asset_name="marts.vendas_final"\n)\nresultados = batch.validate(suite)Expectations Avançadas
Além das expectations básicas, o Great Expectations oferece validações sofisticadas:
# Validações estatísticas\nsuite.add_expectation(\n gx.expectations.ExpectColumnMeanToBeBetween(\n column="valor",\n min_value=50.0,\n max_value=500.0\n )\n)\n\n# Validações de distribuição\nsuite.add_expectation(\n gx.expectations.ExpectColumnQuantileValuesToBeBetween(\n column="valor",\n quantile_ranges=[\n {"quantile": 0.25, "min_value": 10, "max_value": 100},\n {"quantile": 0.50, "min_value": 50, "max_value": 200},\n {"quantile": 0.75, "min_value": 100, "max_value": 500},\n ]\n )\n)\n\n# Validações entre colunas\nsuite.add_expectation(\n gx.expectations.ExpectColumnPairValuesAToBeGreaterThanB(\n column_A="data_fim",\n column_B="data_inicio"\n )\n)\n\n# Validação de regex\nsuite.add_expectation(\n gx.expectations.ExpectColumnValuesToMatchRegex(\n column="email",\n regex=r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"\n )\n)\n\n# Validação de distribuição categórica\nsuite.add_expectation(\n gx.expectations.ExpectColumnDistinctValuesToContainSet(\n column="categoria",\n value_set=["Eletrônicos", "Roupas", "Alimentos", "Livros"]\n )\n)Data Docs: Documentação Automática de Qualidade
Um dos recursos mais impressionantes do Great Expectations são os Data Docs — documentação HTML interativa gerada automaticamente a partir das validações:
- Visão geral do dataset: Estatísticas descritivas de cada coluna — contagem, valores nulos, valores únicos, distribuição.
- Resultados de validação: Expectativas que passaram (verde) vs. que falharam (vermelho), com detalhes sobre cada falha.
- Exemplos de falhas: Amostras dos dados que violaram cada expectation, facilitando a depuração.
- Comparação entre execuções: Acompanhamento da evolução da qualidade dos dados ao longo do tempo.
Data Quality as Code na Prática
O Great Expectations permite tratar qualidade de dados como código — versionando sua suíte de expectations no Git, revisando em Pull Requests e aplicando em CI/CD:
# .github/workflows/data_quality.yml\nname: Validar Qualidade dos Dados\non:\n pull_request:\n paths:\n - "data/**"\n - "expectations/**"\n\njobs:\n validate:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n - uses: actions/setup-python@v5\n with:\n python-version: "3.12"\n - run: pip install great_expectations\n - run: |\n great_expectations checkpoint run meu_checkpointIsso significa que nenhum dado de baixa qualidade chega aos modelos de machine learning ou aos dashboards sem ser detectado — exatamente como nenhum código com bugs chega à produção sem ser pego pelos testes.
Casos de Uso Reais
Empresas como Airbnb, Adobe, Cigna, Dow Jones, Etsy, Fidelity, JP Morgan, Roblox, Stitch Fix, Thrivent e Walmart usam Great Expectations em produção para:
- Data Lakes: Validar a qualidade de dados ingeridos de dezenas de fontes diferentes antes de disponibilizar para consumo analítico.
- Pipelines de ML: Garantir que features de modelos em produção continuem dentro das distribuições esperadas (detecção de data drift).
- Migração de dados: Verificar que dados migrados entre sistemas mantiveram integridade e consistência.
- Contratos de dados: Estabelecer SLAs de qualidade entre times produtores e consumidores de dados.
Conclusão
O Great Expectations representa uma mudança cultural fundamental na engenharia de dados: assim como nenhum desenvolvedor responsável deploya código sem testes, nenhum engenheiro de dados deveria confiar em dados não validados. Com sua abordagem declarativa, integração nativa com o ecossistema de dados e documentação automática, o GX se tornou uma ferramenta indispensável para qualquer organização que leva qualidade de dados a sério.
Em 2026, com volumes de dados crescendo exponencialmente e modelos de IA cada vez mais dependentes da qualidade dos dados de treinamento, investir em qualidade de dados com Great Expectations não é mais opcional — é um requisito fundamental para qualquer pipeline de dados confiável.







