Back

ETL - Exemplo prático

Uma das abordagens mais robustas para construir pipelines de dados é a estrutura medallion, que organiza os dados em diferentes camadas para garantir qualidade e acessibilidade ao longo do processo de análise.

O que é a estrutura medallion?

A estrutura medallion organiza os dados em três camadas distintas:

  1. Bronze (dados brutos): A primeira camada, onde os dados são armazenados exatamente como foram recebidos, sem nenhuma transformação. Esses dados podem vir de diversas fontes, como arquivos CSV, bancos de dados, APIs, entre outros. Eles servem como uma cópia fiel das fontes originais.
  2. Silver (dados filtrados e limpos): Na camada Silver, os dados da camada Bronze são processados e transformados para corrigir erros, remover duplicatas e padronizar formatos. Aqui, os dados já estão prontos para análises mais profundas, embora ainda possam conter informações redundantes.
  3. Gold (dados agregados e prontos para análise): A última camada é onde os dados são refinados e preparados para análises finais, relatórios e dashboards. Nesta etapa, os dados são agregados, sumarizados e otimizados para consultas rápidas.

Exemplo prático de um pipeline em Python

Imagine que você tem um arquivo CSV com dados de vendas de uma empresa, e deseja processá-los utilizando a estrutura medallion.

1. Extração (Extract) - Camada Bronze

Nesta etapa, os dados brutos são extraídos do arquivo CSV e diretamente armazenados na camada Bronze, que pode ser um banco de dados.

import pandas as pd
from sqlalchemy import create_engine

# Configurando a conexão com o banco de dados
engine = create_engine('sqlite:///data_pipeline.db')

# Extraindo os dados brutos do CSV
bronze_data = pd.read_csv('vendas_brutas.csv')

# Salvando na camada Bronze (no banco de dados/data warehouse)
bronze_data.to_sql('bronze_vendas', con=engine, if_exists='replace', index=False)

2. Transformação (Transform) - Camada Silver

Agora, os dados brutos são transformados, realizando limpeza e padronização na camada Silver. Isso pode incluir a remoção de valores nulos, a padronização de datas e a correção de formatos.

# Carregando os dados da camada Bronze para transformação
bronze_data = pd.read_sql('bronze_vendas', con=engine)

# Limpeza e transformação dos dados

## Removendo duplicatas
silver_data = bronze_data.drop_duplicates()

## Formatando o campo de data
silver_data['Data'] = pd.to_datetime(silver_data['Data'], format='%Y-%m-%d')

## Removendo caracteres
silver_data['Valor'] = silver_data['Valor'].str.replace(',', '').astype(float)

# Salvando na camada Silver (no banco de dados)
silver_data.to_sql('silver_vendas', con=engine, if_exists='replace', index=False)

3. Carregamento (Load) - Camada Gold

Finalmente, os dados transformados são carregados na camada Gold, prontos para análises avançadas.

# Carregando os dados da camada Silver para agregação e análise
silver_data = pd.read_sql('silver_vendas', con=engine)

# Agregando os dados para análises
gold_data = silver_data.groupby(['Produto', 'Região']).agg({'Valor': 'sum', 'Quantidade': 'sum'}).reset_index()

# Salvando na camada Gold (no banco de dados)
gold_data.to_sql('gold_vendas', con=engine, if_exists='replace', index=False)

Como estruturar essa arquitetura no banco de dados?

Para implementar a estrutura Medallion em um banco de dados, você pode organizar suas tabelas em diferentes schemas e manter uma hierarquia clara que reflita as camadas bronze, silver e gold. No exemplo anterior, apenas indicamos no nome das tabelas, mas o ideal é organizar os schemas.

Veja os exemplos abaixo:

1. Schemas

  • Schema bronze: Armazena os dados brutos.
  • Schema silver: Armazena os dados limpos e transformados.
  • Schema gold: Armazena os dados prontos para análise e relatórios.

2. Hierarquia das Tabelas

Dentro de cada schema, você pode ter tabelas específicas para armazenar os dados correspondentes. Aqui está um exemplo detalhado, considerando diferentes fontes de dados:

  • Camada Bronze:
    • Tabela de vendas do sistema 1: bronze.bronze_vendas_sistema1
    • Tabela de clientes do CRM: bronze.bronze_clientes_crm
  • Camada Silver:
    • Tabela de vendas do sistema 1 transformada: silver.silver_vendas_sistema1
    • Tabela de clientes transformada: silver.silver_clientes
  • Camada Gold:
    • Tabela agregada de vendas: gold.gold_vendas
    • Tabela agregada de clientes: gold.gold_clientes
    • Tabela agregada de entregas: gold.gold_entregas

Estrutura do pipeline de dados no projeto Python

project/
│
├── bronze/
│   ├── sistema1/
│   │   ├── extraction/
│   │   ├── transformation/
│   │   └── loading/
│   ├── sistema2/
│   │   ├── extraction/
│   │   ├── transformation/
│   │   └── loading/
│   └── ...
│
├── silver/
│   ├── sistema1/
│   │   ├── extraction/
│   │   ├── transformation/
│   │   └── loading/
│   ├── sistema2/
│   │   ├── extraction/
│   │   ├── transformation/
│   │   └── loading/
│   └── ...
│
└── gold/
    ├── sistema1/
    │   ├── extraction/
    │   ├── transformation/
    │   └── loading/
    ├── sistema2/
    │   ├── extraction/
    │   ├── transformation/
    │   └── loading/
    └── ...