Este projeto implementa um pipeline ETL (Extract, Transform, Load) completo para análise de dados de vendas, incluindo processamento de produtos, vendas e empregados, com geração de relatórios em PDF e exportação para formato Parquet.
arquivos_teste_dados_bus2/
├── bases-de-dados/ # Arquivos CSV de entrada
│ ├── produtos.csv
│ ├── vendas.csv
│ └── empregados.csv
├── create-user-database/ # Criação de usuário e banco
│ └── create_user_database.py
├── extract-transform-data/ # Processamento ETL
│ ├── et_produtos.py
│ ├── et_vendas.py
│ └── et_empregados.py
├── load-data/ # Carregamento no banco
│ ├── l_produtos.py
│ ├── l_vendas.py
│ └── l_empregados.py
├── save-data/ # Exportação e relatórios
│ ├── save_data_parquet.py
│ └── save_data_pdf_report.py
├── parquet-files/ # Arquivos Parquet gerados
├── pdf-files/ # Relatórios PDF
├── logs/ # Logs de execução
└── pipeline.py # Pipeline principal
- Python 3.8+
- PostgreSQL 12+
- Bibliotecas Python (instalar via
pip install -r requirements.txt)
python pipeline.py# Criar usuário e banco
python create-user-database/create_user_database.py
# Processar produtos
python extract-transform-data/et_produtos.py
# Processar vendas
python extract-transform-data/et_vendas.py
# Processar empregados
python extract-transform-data/et_empregados.py
# Gerar relatório PDF
python save-data/save_data_pdf_report.py
# Exportar para Parquet
python save-data/save_data_parquet.pyFormato: CSV com separador ; e encoding UTF-8
Colunas:
id_produto: Identificador único do produtonome: Nome do produtopreco: Preço unitário (decimal)categoria: Categoria do produto
Critérios de Tratamento:
- ✅ Remoção de duplicatas por
id_produto - ✅ Padronização de nomes para formato "Produto {id_produto}"
- ✅ Validação de preços (deve ser > 0)
- ✅ Categorização automática baseada no nome do produto
- ✅ Tratamento de valores nulos com valores padrão
Formato: CSV com separador ; e encoding UTF-8
Colunas:
id_venda: Identificador único da vendaid_produto: Referência ao produtoid_empregado: Referência ao empregadoquantidade: Quantidade vendidavalor_unitario: Valor unitário da vendavalor_total: Valor total da vendadata: Data da venda (formato DD/MM/YYYY)
Critérios de Tratamento:
- ✅ Validação de integridade referencial com produtos e empregados
- ✅ Tratamento inteligente de datas ausentes (imputação por mediana)
- ✅ Cálculo automático de valores (quantidade × valor_unitario)
- ✅ Remoção de vendas inválidas (valores negativos ou zero)
- ✅ Flags de rastreabilidade para dados imputados
- ✅ Tratamento de valores inconsistentes
Formato: CSV com separador ; e encoding UTF-8
Colunas:
id_empregado: Identificador único do empregadonome: Nome do empregadoidade: Idade do empregadocargo: Cargo/função do empregado
Critérios de Tratamento:
- ✅ Remoção de duplicatas por
id_empregado - ✅ Correção de nomes ausentes com padrão "Funcionário {id}"
- ✅ Imputação de idades ausentes usando cascata de estratégias
- ✅ Validação de idades (18-70 anos)
- ✅ Preenchimento de IDs ausentes com sequência numérica
- ✅ Padronização de cargos
- Vendas → Produtos: Todas as vendas devem referenciar produtos válidos
- Vendas → Empregados: Todas as vendas devem referenciar empregados válidos
- Chaves primárias: Validação de unicidade em todas as tabelas
- Datas: Imputação inteligente usando mediana por funcionário e global
- Nomes: Padronização com padrão "Entidade {ID}"
- Idades: Cascata de estratégias (mediana por cargo → mediana global → valor padrão)
- IDs: Preenchimento sequencial para manter integridade
- Preços: Deve ser > 0
- Quantidades: Deve ser > 0
- Idades: Deve estar entre 18-70 anos
- Datas: Formato DD/MM/YYYY válido
- Valores totais: Consistência com quantidade × valor_unitario
- Flags de imputação: Identificação de dados tratados
- Logs detalhados: Registro de todas as operações
- Estatísticas: Contagem de registros processados e tratados
- Host: localhost
- Porta: 5432
- Usuário: bus2
- Senha: testebus2
- Banco: bus2
- produtos (id_produto, nome, preco, categoria)
- empregados (id_empregado, nome, idade, cargo)
- vendas (id_venda, id_produto, id_empregado, quantidade, valor_unitario, valor_total, data)
Seções incluídas:
- Total de vendas por funcionário (tabela + resumo)
- Ticket médio por produto (tabela + resumo)
- Vendas por categoria de produto (tabela + gráfico de barras horizontais)
- Top 5 funcionários (tabela + gráfico de barras)
- Evolução de vendas por período (tabela + gráfico de linha + observação sobre imputação)
Características técnicas:
- Biblioteca: ReportLab (suporte Unicode completo)
- Fontes: DejaVu/Arial Unicode com fallback para Helvetica
- Gráficos: Matplotlib integrado (sem arquivos PNG intermediários)
- Layout: Páginas organizadas com espaçamentos otimizados
- resumo-vendas.parquet: Dados de vendas tratados
- produtos.parquet: Dados de produtos tratados
- empregados.parquet: Dados de empregados tratados
- Arquivo:
logs/pipeline_etl.log - Formato: Timestamp - Nível - Mensagem
- Encoding: UTF-8
- Rotação: Append mode (acumula execuções)
- Tempo de execução por etapa
- Contagem de registros processados
- Dados tratados (duplicatas, valores ausentes, etc.)
- Erros e exceções com stack trace completo
- Volume total por funcionário
- Ticket médio por produto
- Distribuição por categoria
- Ranking de funcionários
- Evolução temporal
- Taxa de completude por campo
- Identificação de outliers
- Consistência entre tabelas
- Impacto das imputações
- Tempo de processamento por etapa
- Uso de memória otimizado
- Eficiência de consultas SQL
- Variação potencial: Até 15% nos dados temporais devido à imputação
- Estratégia: Mediana por funcionário → mediana global → data padrão
- Rastreabilidade: Flags indicam dados imputados
- Dependência do PostgreSQL para execução completa
- Arquivos CSV devem estar no formato especificado
- Credenciais do banco devem estar corretas
- SQLAlchemy para evitar warnings do pandas
- Processamento em memória para gráficos (sem arquivos PNG)
- Tratamento robusto de caracteres especiais
- Modularização completa do código
- Python 3.8+
- Pandas (manipulação de dados)
- SQLAlchemy (ORM e conexões)
- Psycopg2 (driver PostgreSQL)
- Matplotlib (criação de gráficos)
- ReportLab (geração de PDFs)
- PostgreSQL 12+
- SQL (consultas e DDL)
- CSV (entrada)
- Parquet (saída otimizada)
- PDF (relatórios)
Para dúvidas ou problemas:
- Verificar logs em
logs/pipeline_etl.log - Confirmar conectividade com PostgreSQL
- Validar formato dos arquivos CSV de entrada
- Verificar permissões de escrita nos diretórios de saída
- Autor: Jeferson Andrade | j-90
- LinkedIn: https://www.linkedin.com/in/jeferson-andrade90/
- Email: jandrademelo90@gmail.com
- Data de Criação: 26/08/2025 às 17:33 PM -03
- v1.0.0 (26/08/2025): Versão inicial com pipeline ETL funcional.
- Certifique-se de que o arquivo
empregados.csv,produtos.csvevendas.csvcontém as colunas esperadas.
Desenvolvido com foco em qualidade de dados, rastreabilidade e boas práticas de ETL.