O Schiphol ETL é um projeto de engenharia de dados desenvolvido em Python com o objetivo de extrair, transformar e carregar (ETL) dados públicos do Aeroporto de Schiphol (Amsterdam Airport Schiphol) para um banco de dados relacional, seguindo boas práticas de arquitetura, separação por camadas e validação de dados.
O projeto foi pensado para ser modular, extensível e profissional, simulando um cenário real de pipeline de dados utilizado em ambientes corporativos.
O Amsterdam Airport Schiphol (AMS) é um dos maiores e mais importantes aeroportos da Europa, servindo como hub internacional para voos comerciais, cargas e conexões globais.
A API pública do Schiphol disponibiliza informações como:
✈️ Voos (chegadas e partidas)- 🛫 Tipos de aeronaves
- 🏢 Companhias aéreas
- 🌎 Destinos
Esses dados são ideais para estudos de ETL, modelagem de dados, validação, observabilidade e persistência.
O projeto segue uma arquitetura inspirada em Clean Architecture / DDD, separando responsabilidades em camadas bem definidas:
src/
├── app/ # Ponto de entrada da aplicação
├── domain/ # Regras de negócio e entidades
├── pipeline/ # Orquestração do ETL (extract, transform, load)
├── infrastructure/ # Banco de dados, ORM, schemas e conexões
├── settings/ # Configurações, logging e observabilidade
Camada mais importante do projeto.
- Entities: modelos de domínio (não dependem de banco ou framework)
- Interfaces: contratos para extract / transform / load
- Exceptions: exceções específicas do pipeline
Aqui está a regra de ouro: o domínio não conhece infraestrutura.
O projeto utiliza um conjunto de bibliotecas modernas e amplamente usadas em engenharia de dados e back-end em Python:
Linguagem principal do projeto.
Utilizado principalmente para:
- Exploração inicial dos dados
- Prototipação do ETL (notebooks)
- Manipulação e normalização de dados tabulares
O uso de Pandas está concentrado na fase exploratória, evitando dependência excessiva no pipeline final.
Utilizado para:
- Validação rigorosa dos dados vindos da API do Schiphol
- Garantia de tipagem forte
- Conversão segura de dados externos
Responsabilidades principais:
- Garantir que campos obrigatórios não sejam
None - Validar estruturas complexas (dicts, listas, datas)
- Evitar dados inconsistentes chegando ao banco
Responsável pela camada de persistência:
- Mapeamento ORM (models)
- Definição de entidades de banco
- Criação e gerenciamento de sessões
- Integração com PostgreSQL
A separação é clara:
- Schemas: representação dos dados
- Models: mapeamento ORM
- Connections: conexão com o banco
A biblioteca Alembic já está incluída no projeto, com o objetivo de:
- Versionamento de schema
- Controle de migrações de banco de dados
⚠️ No estado atual do projeto, as migrações ainda não foram implementadas. A criação de tabelas é feita via script Python.
Utilizado para:
- Consumo da API pública do Schiphol
- Comunicação HTTP de forma simples e explícita
Bibliotecas auxiliares:
- types-requests → tipagem estática
- pandas-stubs → tipagem estática para DataFrames
- Tipagem explícita em entidades, schemas e interfaces
Banco de dados relacional utilizado para persistência dos dados.
Driver:
- psycopg2-binary
Utilizado para:
- Gerenciamento de variáveis de ambiente
- Separação entre código e credenciais sensíveis
O projeto utiliza Logfire para observabilidade:
- Rastreamento de execuções
- Logs estruturados
- Monitoramento do pipeline
Ao rodar o projeto, um link de observabilidade é gerado automaticamente:
Logfire project URL: https://logfire-us.pydantic.dev/deezinn/schiphol-etl
Embora o projeto tenha uma estrutura compatível com orquestração, o Apache Airflow ainda não foi aplicado.
A arquitetura atual facilita uma futura integração com:
- DAGs
- Schedulers
- Observabilidade avançada
Responsável pela camada de persistência:
- Mapeamento ORM (models)
- Criação de tabelas
- Conexão com PostgreSQL
A separação é clara:
- Schemas: representação dos dados
- Models: mapeamento ORM
- Connections: conexão com o banco
O projeto utiliza Logfire para observabilidade:
- Rastreamento de execuções
- Logs estruturados
- Monitoramento do pipeline
Ao rodar o projeto, um link de observabilidade é gerado automaticamente:
Logfire project URL: https://logfire-us.pydantic.dev/deezinn/schiphol-etl
O projeto já está preparado para execução em containers:
- Banco de dados PostgreSQL
- Ambiente isolado
- Facilidade de deploy
O pipeline segue o fluxo clássico:
-
Extract
- Consome dados da API do Schiphol
-
Transform
- Normalização
- Conversão de tipos
- Validação com Pydantic
- Mapeamento domínio → persistência
-
Load
- Inserção no PostgreSQL via SQLAlchemy
A pasta notebooks/ contém prototipações iniciais do ETL, usadas para:
- Explorar os dados da API
- Testar transformações
- Validar modelos
Eles serviram como base para a implementação final do pipeline.
git clone <repo-url>
cd Schiphol-etlpython3 -m venv .venv
source .venv/bin/activatepip install -r requirements.txtEdite o arquivo:
src/infrastructure/security/credentials.py
Inclua:
- Credenciais da API do Schiphol
- Dados de conexão com o PostgreSQL
docker-compose up -dpython3 -m src.settings.create_tablepython3 -m src.app.mainOs logs são armazenados em:
logs/
└── teste.log
Além disso, toda a execução pode ser acompanhada pelo Logfire.
Este projeto foi desenvolvido com foco em:
- Engenharia de Dados profissional
- Arquitetura limpa
- Validação forte de dados
- Observabilidade
- Escalabilidade
É um excelente exemplo de pipeline realista para:
- Portfólio
- Estudos avançados de ETL
- Base para orquestração com Airflow futuramente
Este projeto está licenciado sob a licença MIT. Consulte o arquivo LICENSE para mais detalhes.
Projeto desenvolvido por André Luiz, com foco em boas práticas de engenharia de dados, Python moderno e arquitetura de software.