Pular para o conteúdo principal

Tutorial de Grandes Esperanças: Validação de dados com Python

Saiba como validar seus dados com o Great Expectations em Python com este tutorial de ponta a ponta!
Actualizado 29 de nov. de 2024  · 20 min de leitura

A qualidade e a consistência dos dados são como os alicerces de uma casa - sem uma base sólida, tudo o que for construído em cima corre o risco de desmoronar. É nesse ponto que a validação de dados desempenha um papel importante. A validação de dados ajuda você a garantir que seus dados sejam precisos, consistentes e confiáveis.

Great Expectations é uma ferramenta de validação de dados de código aberto que permite que você identifique problemas de dados antecipadamente e garante que seus dados atendam aos padrões de qualidade exigidos.

Neste guia, orientaremos você no processo de uso do Great Expectations para validação de dados, com um exemplo prático de ponta a ponta para ajudá-lo a começar!

O que é Great Expectations?

Great Expectations (GX) é uma estrutura de código aberto que se tornou popular para gerenciar e automatizar a validação de dados em pipelines de dados modernos.

Sua estrutura baseada em Python foi projetada para ajudar as equipes de dados a garantir a qualidade e a consistência de seus dados. Os usuários podem definir "expectativas" - regras ou testes que descrevem como devem ser os dados válidos - que validam automaticamente se os dados atendem a esses padrões.

Alguns benefícios de Great Expectations incluem:

  • Validação automatizada de dados - A Great Expectations automatiza o processo de validação de dados, reduzindo o esforço manual e minimizando o risco de erros. Ele garante que os dados atendam consistentemente aos padrões predefinidos.
  • Integração com pipelines de dados - Integra-se facilmente a várias fontes e plataformas de dados, incluindo bancos de dados SQL, armazenamento em nuvem e ferramentas ETL, permitindoa validação de dados em diferentes estágios do pipeline.
  • Resultados de validação claros e acionáveis - A ferramenta fornece resultados de validação transparentes, o que facilita a identificação de problemas de qualidade de dados e a rápida solução dos mesmos.
  • Documentação de dados - A Great Expectations pode gerar uma documentação detalhada e acessível dos seus processos de validação de dados, ajudando as equipes a se alinharem aos padrões de qualidade e fornecendo uma referência para uso futuro.
  • Escalabilidade e flexibilidade - Como uma ferramenta de código aberto, o Great Expectations é altamente personalizável e pode ser dimensionado de acordo com suas necessidades de validação de dados, oferecendo flexibilidade para se ajustar a vários casos de uso sem altos custos.

Agora, vamos dar uma olhada em um exemplo de ponta a ponta!

Torne-se um engenheiro de dados

Desenvolva habilidades em Python para se tornar um engenheiro de dados profissional.
Comece a Usar Gratuitamente

Criando grandes expectativas

Neste tutorial, você aprenderá a usar o GX Core, a versão de código aberto do Great Expectations, para validar um DataFrame do Pandas. Você verá como configurar um contexto, registrar uma fonte de dados do Pandas, definir expectativas e validar lotes de dados.

Observação: Recomendamos que você acompanhe o notebook do DataLab, mas também pode criar seu próprio script Python.

Pré-requisitos

  • Python 3.9 a 3.12 instalados.
  • Para evitar conflitos, é altamente recomendável que você instale o Great Expectations em um ambiente virtual (isenção de responsabilidade: a configuração de ambientes virtuais está além do escopo deste artigo).
  • Um conjunto de dados de amostra.

Observação: Se você estiver usando o notebook DataLab fornecido, esses pré-requisitos já foram atendidos. Você pode ignorá-las.

Use o seguinte comando para instalar o GX via pip:

pip install great_expectations

Esse comando instala o pacote principal e todas as dependências necessárias.

O Great Expectations requer um contexto de dados para gerenciar as configurações. Usamos um contexto de dados efêmero para evitar a persistência das configurações.

import great_expectations as gx

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

Criando seu primeiro conjunto de validação de dados

Agora que o GX está configurado, vamos criar um conjunto de validação de dados.

Uma fonte de dados conecta o Great Expectations aos seus dados, enquanto um ativo de dados representa um subconjunto específico de dados (por exemplo, uma tabela, DataFrame ou arquivo).

Nesse caso, prepararemos tudo para que você se conecte a um DataFrame chamado inventory_parts_df. O conjunto de dados de amostra está disponível no DataLab fornecido e é criado quando executamos o bloco SQL:

Se você não estiver usando o DataLab, crie seu próprio DataFrame com dados de amostra.

Agora, crie sua fonte de dados e seu ativo:

# 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")

Uma definição de lote identifica e organiza seus dados para validação. Aqui, adicionamos uma definição de lote que abrange todo o 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

Um lote é uma coleção de dados vinculados a uma definição de lote. Para validar os dados, você precisará recuperar e vincular o lote ao seu DataFrame, neste 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)

As expectativas são regras para validar dados. Neste exemplo, definiremos as seguintes expectativas simples:

  1. Certifique-se de que os valores de inventory_id não sejam nulos.
  2. Certifique-se de que os valores de part_num sejam exclusivos.
# 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)

Você pode explorar todas as expectativas disponíveis na Galeria de expectativas. Incentivamos você a acrescentar mais alguns!

Depois de definir as expectativas, o GX gera a configuração do conjunto 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
}

A suíte inclui os seguintes detalhes:

  1. Nome e ID da suíte: Um nome exclusivo (inventory_parts_suite) e um identificador para rastrear e gerenciar a suíte.
  2. Expectativas: Cada regra especifica:
    • O tipo de verificação (por exemplo, garantir que uma coluna não tenha valores nulos ou entradas exclusivas).
    • Parâmetros, como a coluna que está sendo validada.
    • Metadados e um ID exclusivo para cada expectativa, o que facilita o rastreamento e a personalização.
  3. Metadata: Informações sobre a versão de Great Expectations, garantindo a compatibilidade com a ferramenta.
  4. Observações: Um espaço reservado para adicionar comentários descritivos sobre a suíte (opcional).

Esse resultado estruturado funciona como documentação e como uma configuração reutilizável para validar seu conjunto de dados, de modo que suas expectativas sejam claramente definidas, rastreáveis e prontas para uso futuro.

5. Validação dos dados

Por fim, valide o lote de acordo com as expectativas definidas e avalie os resultados.

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

Depois de executar a validação, o Great Expectations fornece um relatório detalhado sobre se o conjunto de dados atende às 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
}

Esse relatório detalha a qualidade de seus dados, destacando os sucessos e as falhas. Aqui está uma explicação simplificada dos resultados:

Validação geral: O resultado da validação foi parcialmente bem-sucedido: 50% das expectativas foram aprovadas e 50% foram reprovadas. Uma expectativa fracassada indica um problema de qualidade de dados que precisa de atenção. Nesse caso, uma coluna não atendia à regra definida.

Expectativa 1: inventory_id não deve ter valores faltantes

  • Resultado: Aprovado
  • Explicação: Todos os valores da coluna inventory_id estão presentes, sem entradas nulas ou ausentes. Isso indica uma boa integridade dos dados para essa coluna.

Expectativa 2: part_num deve ter valores exclusivos

  • Resultado: Falha
  • Explicação: A coluna part_num contém 97,98% de valores duplicados, o que significa que apenas alguns valores são exclusivos.
  • Destaques:
    • Exemplos de valores duplicados incluem "3069b" e "33291".
    • A ferramenta também mostra a frequência com que essas duplicatas aparecem e suas posições nas linhas, facilitando a localização e a correção dos problemas.

Obviamente, esse é apenas um conjunto de dados de amostra, e incluímos propositalmente uma expectativa de aprovação e uma de reprovação para que você possa ver os dois resultados de validação.

É isso aí! Você executou com sucesso validações de dados de ponta a ponta.

Integração de grandes expectativas aos pipelines de dados

Em um ambiente de produção, as validações devem ser incorporadas diretamente ao fluxo de trabalho para monitorar continuamente a qualidade dos dados em cada estágio. 

Nesta seção, discutiremos como você pode integrar o Great Expectations aos seus pipelines de dados.

Esses são exemplos para que você tenha uma ideia, e configurações adicionais não incluídas aqui podem ser necessárias. Consulte a documentação de cada ferramenta para obter a sintaxe atualizada!

Integração com ferramentas de ETL

A integração do Great Expectations com ferramentas ETL populares, como o Apache Airflow ou o Prefect, é relativamente simples. A incorporação de etapas de validação diretamente nos processos de ETL permitirá que você detecte e resolva problemas de dados em tempo real, antes que eles afetem a análise downstream.

Vamos examinar um exemplo simples de integração do Great Expectations com o Prefect para executar a validação de dados como parte de um fluxo de trabalho de 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()

Neste exemplo, definimos um fluxo Prefect com uma tarefa para executar a validação de Great Expectations.

A tarefa validate_data() carrega o contexto do Great Expectations, recupera o lote de dados e aplica o conjunto de expectativas. 

Se os dados não atenderem aos critérios de validação, a tarefa emitirá um alerta, interrompendo o fluxo de trabalho e evitando erros posteriores.

Validação contínua de dados

Você pode agendar trabalhos de validação usando várias ferramentas, como trabalhos cron em sistemas baseados em Unix ou serviços gerenciados como o Apache Airflow. Para este exemplo, demonstraremos como agendar execuções de validação usando o Airflow, que é adequado para orquestrar pipelines de dados.

Veja como você pode configurar um DAG(Directed Acyclic Graph) do Airflow para executar diariamente as validações do 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

Neste exemplo, definimos um DAG que agenda uma execução de validação uma vez por dia (@daily). 

A função run_validation() executa a validação carregando o contexto de Grandes Expectativas e executando o conjunto de expectativas definido em relação aos dados.

Práticas recomendadas para validação de dados com grandes expectativas

Seguir as práticas recomendadas é sempre mais aconselhável para a escalabilidade e a eficiência, e isso não é diferente para a validação de dados com o Great Expectations.

Comece pequeno e repita

Comece com verificações básicas da qualidade dos dados e expanda gradualmente. É melhor que você se concentre inicialmente nas expectativas básicas, pois isso ajuda a evitar a complicação excessiva do processo, o que facilita a integração e a solução de problemas. À medida que seu conhecimento do conjunto de dados for melhorando, você poderá adicionar validações mais complexas.

Colaboração entre equipes

A qualidade dos dados não é apenas uma preocupação técnica. Colabore com as equipes comerciais para definir as expectativas e garantir que a validação implementada esteja alinhada com a lógica e as metas comerciais subjacentes. Essa abordagem multifuncional garante que os dados sirvam à finalidade pretendida e atendam aos requisitos de todas as partes interessadas.

Automatize sempre que possível

Automatize o processo sempre que possível para integrar a validação de dados aos pipelines de dados. A integração de verificações de validação automatizadas permite o monitoramento contínuo da qualidade dos dados sem intervenção manual, o que melhora significativamente a eficiência.

Conclusão

Excelente trabalho! Você aprendeu a configurar e validar dados em Great Expectations. Essas técnicas ajudarão a manter a alta qualidade dos dados e a transparência em seus fluxos de trabalho.

Para continuar desenvolvendo suas habilidades, confira estes recursos:

Torne-se um engenheiro de dados

Comprove suas habilidades como engenheiro de dados pronto para o trabalho.

Perguntas frequentes

Como o Great Expectations se compara a outras ferramentas de validação de dados?

O Great Expectations é de código aberto, flexível e se integra bem aos pipelines de dados modernos. Ele se destaca por sua extensa biblioteca de expectativas e documentação sólida.

Você precisa saber Python para usar o Great Expectations?

Embora o conhecimento básico de Python seja útil, o Great Expectations oferece uma CLI fácil de usar e ampla documentação, tornando-o acessível a não programadores.

Que tipos de fontes de dados são compatíveis com o Great Expectations?

O Great Expectations oferece suporte a uma ampla variedade de fontes de dados, incluindo:

  • Bancos de dados relacionais como PostgreSQL, MySQL e SQL Server.
  • Soluções de armazenamento em nuvem, como AWS S3, Google Cloud Storage e Azure Blob Storage.
  • Formatos de arquivo como CSV, Parquet e Excel.
  • Estruturas de Big Data, como Apache Spark e Databricks. Você pode conectar facilmente o Great Expectations a essas fontes usando a configuração apropriada para sua fonte de dados.

Posso usar o Great Expectations com dados de streaming?

O Great Expectations foi projetado principalmente para validação de dados em lote. Embora não ofereça suporte nativo a pipelines de dados de streaming, você pode integrá-lo a estruturas como Apache Kafka ou Spark Structured Streaming validando instantâneos ou micro-lotes de dados periodicamente.

É possível controlar a versão das expectativas e dos resultados da validação?

Sim, você pode controlar as expectativas e as configurações da versão armazenando-as como arquivos YAML ou JSON em um repositório Git. Para resultados de validação, você pode configurar um banco de dados ou um armazenamento baseado em arquivo para rastrear os resultados ao longo do tempo e integrá-los aos pipelines de CI/CD para monitoramento contínuo.

Como o Great Expectations lida com a evolução do esquema em conjuntos de dados?

O Great Expectations lida com a evolução do esquema por meio de sua estrutura flexível de expectativas. Se o esquema for alterado, você poderá:

  • Use expect_table_columns_to_match_set ou expectativas semelhantes para validar dinamicamente os nomes das colunas.
  • Modifique ou crie novos conjuntos de expectativas para se adaptar ao novo esquema.
  • Aproveite as ferramentas de inferência de esquema para atualizar automaticamente as expectativas de colunas recém-adicionadas.

Kurtis Pykes 's photo
Author
Kurtis Pykes
LinkedIn

Thalia Barrera's photo
Author
Thalia Barrera

Thalia Barrera é editora sênior de ciência de dados da DataCamp, com mestrado em ciência da computação e mais de uma década de experiência em engenharia de software e dados. Thalia gosta de simplificar conceitos de tecnologia para engenheiros e cientistas de dados por meio de publicações em blogs, tutoriais e cursos em vídeo.

Temas

Saiba mais sobre engenharia de dados com estes cursos!

programa

Engenheiro de dados

40 horas hr
Adquira habilidades sob demanda para ingerir, limpar e gerenciar dados com eficiência, além de programar e monitorar pipelines, destacando você no campo da engenharia de dados.
Ver DetalhesRight Arrow
Iniciar Curso
Certificação disponível

curso

ETL e ELT em Python

4 hr
15.1K
Aprenda a criar pipelines de dados eficazes, eficientes e confiáveis usando os princípios de extração, transformação e carregamento.
Ver maisRight Arrow
Relacionado

tutorial

Tutorial de funções Python

Um tutorial sobre funções em Python que aborda como escrever funções, como chamá-las e muito mais!
Karlijn Willems's photo

Karlijn Willems

14 min

tutorial

Tutorial do Python pandas: O guia definitivo para iniciantes

Você está pronto para começar sua jornada com os pandas? Aqui está um guia passo a passo sobre como você pode começar.
Vidhi Chugh's photo

Vidhi Chugh

15 min

tutorial

Tutorial do Python Excel: O guia definitivo

Saiba como ler e importar arquivos do Excel em Python, gravar dados nessas planilhas e encontrar os melhores pacotes para fazer isso.
Natassha Selvaraj's photo

Natassha Selvaraj

30 min

tutorial

Tutorial de execução de scripts Python no Power BI

Descubra as diferentes maneiras de usar o Python para otimizar a análise, a visualização e a modelagem de dados no Power BI.
Joleen Bothma's photo

Joleen Bothma

9 min

tutorial

21 ferramentas essenciais do Python

Aprenda sobre as ferramentas Python essenciais para o desenvolvimento de software, raspagem e desenvolvimento da Web, análise e visualização de dados e aprendizado de máquina.
Abid Ali Awan's photo

Abid Ali Awan

6 min

tutorial

Tutorial de manipulação de dados categóricos de aprendizado de máquina com Python

Aprenda os truques comuns para lidar com dados categóricos e pré-processá-los para criar modelos de aprendizado de máquina!
Moez Ali's photo

Moez Ali

28 min

See MoreSee More