Pipeline ETL automatizado para coleta, transformação e armazenamento de dados meteorológicos em tempo real da cidade de São Paulo.
| 📚 Recurso | 🔗 Link |
|---|---|
| 📺 Vídeo no YouTube | Assistir Tutorial Completo |
| 📄 Documentação Completa | Google Docs - Conceitos e Requisitos |
| 💻 Repositório GitHub | pipeline_etl_weather_data_tutorial_youtube |
| 🎨 Padrão de Commits | Guia Completo com Emojis |
| @vbluuiza | |
| @vbluuiza |
- Sobre o Projeto
- Arquitetura do Pipeline
- Stack Tecnológica
- Estrutura do Projeto
- Pré-requisitos
- Instalação e Configuração
- Como Executar
- Detalhamento das Etapas
- Análise de Dados
- Troubleshooting
- Contribuindo
Este projeto foi desenvolvido para o canal @vbluuiza com o objetivo de demonstrar a construção de um pipeline ETL completo utilizando as melhores práticas de Engenharia de Dados.
O pipeline coleta dados meteorológicos da API OpenWeatherMap a cada hora, transforma os dados para um formato estruturado e os armazena em um banco de dados PostgreSQL para análises futuras.
- Python 3.14+ - Linguagem principal
- Apache Airflow 3.1.7 - Orquestração do pipeline
- PostgreSQL 14 - Banco de dados relacional
- Docker & Docker Compose - Containerização
- pandas - Manipulação e transformação de dados
- requests - Requisições HTTP para a API
- SQLAlchemy - ORM para interação com o banco de dados
- psycopg2 - Driver PostgreSQL
- python-dotenv - Gerenciamento de variáveis de ambiente
- Redis - Message broker para Celery
- Jupyter Notebook - Análise exploratória de dados
- UV - Gerenciador de pacotes Python rápido
git clone https://github.com/vbluuiza/pipeline_etl_weather_data_tutorial_youtube.git
cd pipeline_etl_weather_data_tutorial_youtube- Acesse OpenWeatherMap
- Crie uma conta gratuita
- Gere sua API Key no dashboard
- Guarde sua chave para o próximo passo
Crie um arquivo .env dentro da pasta config/:
# config/.env
# OpenWeatherMap API
API_KEY=sua_chave_api_aqui
# PostgreSQL (para testes locais)
user=airflow
password=airflow
database=airflow
⚠️ IMPORTANTE: Nunca commite o arquivo.envno Git!
# Crie a estrutura de pastas necessária
mkdir -p ./dags ./logs ./plugins ./config ./data ./src ./notebooks
# Configure as permissões (Linux/Mac)
echo -e "AIRFLOW_UID=$(id -u)" > .env# Inicie todos os serviços
docker-compose up -dAguarde alguns minutos para todos os serviços iniciarem.
docker-compose psVocê deve ver todos os serviços com status healthy ou running:
- airflow-apiserver
- airflow-scheduler
- airflow-worker
- airflow-triggerer
- postgres
- redis
Abra seu navegador em: http://localhost:8080
Credenciais padrão:
- Username:
airflow - Password:
airflow
- Na interface do Airflow, localize a DAG chamada
youtube_weather_pipeline - Clique no botão de Acionar/Trigger para ativá-la
- A DAG está configurada para executar a cada 1 hora
Arquivo: src/extract_data.py
O que faz:
- Faz uma requisição HTTP GET para a API do OpenWeatherMap
- Valida o status code da resposta (200 = sucesso)
- Salva os dados brutos em formato JSON em
data/weather_data.json
Dados coletados:
- Temperatura atual, mínima e máxima
- Sensação térmica
- Umidade e pressão atmosférica
- Velocidade e direção do vento
- Nível de nuvens
- Horários de nascer e pôr do sol
- Coordenadas geográficas
Arquivo: src/transform_data.py
O que faz:
- Lê o arquivo JSON
- Converte para DataFrame Pandas
- Normaliza dados aninhados usando
pd.json_normalize()
- A coluna
weathervem como lista de dicionários - Extrai:
weather_id,weather_main,weather_description,weather_icon - Concatena com o DataFrame principal
columns_to_drop = ['weather', 'weather_icon', 'sys.type']Padronização para nomes claros em inglês:
main.temp→temperaturemain.humidity→humiditycoord.lon→longitudesys.sunrise→sunrise- E outros...
Colunas convertidas de Unix timestamp para datetime:
columns_to_normalize = ['datetime', 'sunrise', 'sunset']
# Converte para datetime do fuso horário de São Paulo
df[col] = pd.to_datetime(df[col], unit='s', utc=True)
.dt.tz_convert('America/Sao_Paulo')Resultado: DataFrame limpo, estruturado e pronto para análise
Arquivo: src/load_data.py
O que faz:
engine = create_engine(
f"postgresql+psycopg2://{user}:{password}@{host}:5432/{database}"
)df.to_sql(
name='sp_weather',
con=engine,
if_exists='append', # Adiciona novos registros
index=False
)- Faz um
SELECT COUNT(*)para verificar total de registros - Loga o resultado para auditoria
Arquivo: dags/weather_dag.py
@dag(
dag_id='youtube_weather_pipeline',
schedule='0 */1 * * *', # Executa a cada 1 hora
start_date=datetime(2026, 2, 7),
catchup=False, # Não executa datas passadas
tags=['weather', 'etl', 'se inscreve no canal!']
)@task
def extract():
extract_weather_data(url)
@task
def transform():
df = data_transformations()
df.to_parquet('/opt/airflow/data/temp_data.parquet')
@task
def load():
df = pd.read_parquet('/opt/airflow/data/temp_data.parquet')
load_weather_data('sp_weather', df)
# Dependências
extract() >> transform() >> load()Por que usar Parquet entre transform e load?
- Formato binário eficiente
- Preserva tipos de dados (datetime, float, etc.)
- Evita problemas com serialização do Airflow
Solução:
# Verifique os logs do scheduler
docker-compose logs airflow-scheduler
# Reinicie os serviços
docker-compose restartVerificações:
- O container do PostgreSQL está rodando?
docker-compose ps postgres
Causa: API Key inválida ou não configurada
Solução:
- Verifique se o arquivo
config/.envexiste - Confirme se a variável
API_KEYestá correta - Teste a API no navegador:
https://api.openweathermap.org/data/2.5/weather?q=Sao Paulo,BR&appid=SUA_CHAVE
Para testar o pipeline sem Docker:
# Instale as dependências
uv pip install -e .
# Execute o script de teste
uv run main.pyNota: O arquivo
main.pyestá comentado por padrão. Descomente-o para usar.
docker-compose downdocker-compose down -vdocker-compose down
rm -rf logs/*vbluuiza | luuiza.empresarial@gmail.com
Se este projeto te ajudou, não esquece de:
- ⭐ Dar uma star no repositório
- 🔴 Se inscrever no canal @vbluuiza
- 👍 Deixar um like no vídeo
- 💬 Comentar com suas dúvidas e sugestões
Feito com ❤️ por @vbluuiza
