Loading repository data…
Loading repository data…
vbluuiza / repository
📄 Tutorial prático de Engenharia de Dados para YouTube. Pipeline ETL completo com Airflow, Python e PostgreSQL que coleta dados meteorológicos de São Paulo, aplica transformações e persiste em banco de dados. Containerizado com Docker para fácil reprodução. @vbluuiza
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 |
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.
git clone https://github.com/vbluuiza/pipeline_etl_weather_data_tutorial_youtube.git
cd pipeline_etl_weather_data_tutorial_youtube
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 -d
Aguarde alguns minutos para todos os serviços iniciarem.
docker-compose ps
Você deve ver todos os serviços com status healthy ou running:
Abra seu navegador em: http://localhost:8080
Credenciais padrão:
airflowairflowyoutube_weather_pipelineArquivo: src/extract_data.py
O que faz:
data/weather_data.jsonDados coletados:
Arquivo: src/transform_data.py
O que faz:
pd.json_normalize()weather vem como lista de dicionáriosweather_id, weather_main, weather_description, weather_iconcolumns_to_drop = ['weather', 'weather_icon', 'sys.type']
Padronização para nomes claros em inglês:
main.temp → temperaturemain.humidity → humiditycoord.lon → longitudesys.sunrise → sunriseColunas 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
)
SELECT COUNT(*) para verificar total de registrosArquivo: 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?
Solução:
# Verifique os logs do scheduler
docker-compose logs airflow-scheduler
# Reinicie os serviços
docker-compose restart
Verificações:
docker-compose ps postgres
Causa: API Key inválida ou não configurada
Solução:
config/.env existeAPI_KEY está corretahttps://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.py
Nota: O arquivo
main.pyestá comentado por padrão. Descomente-o para usar.
docker-compose down
docker-compose down -v
docker-compose down
rm -rf logs/*
vbluuiza | luuiza.empresarial@gmail.com
Se este projeto te ajudou, não esquece de:
Feito com ❤️ por @vbluuiza