Skip to content

Refactor: Mini-Projeto 2 — Análise da Tábua das Marés para Surfar - #4

Draft
luigischmitt wants to merge 9 commits into
mainfrom
refactor/mini-projeto2
Draft

Refactor: Mini-Projeto 2 — Análise da Tábua das Marés para Surfar#4
luigischmitt wants to merge 9 commits into
mainfrom
refactor/mini-projeto2

Conversation

@luigischmitt

Copy link
Copy Markdown
Collaborator

Substitui o escopo anterior do mini-projeto 2 (Termômetro Eleitoral 2026)
pela nova proposta: análise da tábua das marés de João Pessoa para
classificar as melhores condições de surf
.

Spec completo em docs/superpowers/specs/2026-06-05-surf-tabuademares-design.md.

Motivação

Mini-projeto da Trilha UFPB (1 semana, alunos de 1º período) cobrindo as três
etapas pedagógicas obrigatórias: ETL, EDA e ML. A história: ajudar Felipe e
Nicholas a decidir quando voltar a João Pessoa para surfar.

O que está incluído

Etapa 1 — Web Scraping + ETL (src/scrape.py)

  • Scraping de tabuademares.com
    com requests + BeautifulSoup
  • Coleta:
    • Tábua de marés: jan–dez de 2025 inteiro (POST mensal com fecha=)
    • Mês corrente: marés do mês atual (para casar com a previsão)
    • Ondas: previsão horária (~6 dias)
    • Vento: previsão horária (~7 dias)
  • Saída: 4 CSVs em data/raw/

Etapa 2 — EDA (notebooks/eda.ipynb)

  • Limpeza, conversão de tipos, construção de datahora
  • Exploração de cada dataset isoladamente
  • Junção horária ondas + vento + maré (interpolação linear)
  • Features derivadas (mare_subindo, periodo_dia, dia_semana, coeficiente)
  • Visualizações: boxplots, série anual de coeficiente, heatmaps, scatter
  • Saída: data/processed/dataset.csv (~144 linhas, zero NaN)

Etapa 3 — Machine Learning (notebooks/ml.ipynb)

  • Label heurística RUIM/BOM/ÓTIMO (baseada em altura de onda, vento e maré)
  • Treina três classificadores built-in do sklearn:
    • DecisionTreeClassifier (com plot da árvore)
    • RandomForestClassifier (com feature_importances_)
    • KNeighborsClassifier (para comparação)
  • Avaliação: classification_report, matriz de confusão, cross_val_score (5-fold)
  • Aplicação: ranking dos melhores dias e horários da janela
  • Saída: data/processed/dataset_rotulado.csv

Stack

  • Python 3.14 + uv
  • requests, beautifulsoup4, lxml, pandas
  • matplotlib, seaborn
  • scikit-learn (modelos built-in apenas)
  • jupyter + jupytext (dev)

Princípios pedagógicos

  • Built-in only na Etapa 3 (alunos não implementam modelos do zero)
  • Código simples, comentado em português, focado em ensinar
  • Sem orquestrador, sem banco, sem dashboard — KISS
  • Limitações documentadas explicitamente (janela curta de previsão,
    heurística como proxy) — comunicar restrições é parte do aprendizado

Notas

  • Status draft: aberto para revisão antes do merge.
  • Diretórios data/ e reports/ ficam gitignored (gerados pelos pipelines).

🤖 Generated with Claude Code

luigischmitt and others added 9 commits June 4, 2026 14:58
Defines the full refactor of mini-projeto 2 from the previous audio
emotion classification (RAVDESS) to political sentiment analysis on
2026 brazilian presidential candidates.

- Stage 1 (engenharia de dados): twikit-based collector script
- Stage 2 (ciência de dados): EDA in notebook
- Stage 3 (machine learning): pysentimiento for PT sentiment

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Clearing the slate for the termometro eleitoral 2026 refactor (see
docs/superpowers/specs/2026-06-04-termometro-eleitoral-design.md).

Removed:
- app.py (streamlit RAVDESS demo)
- requirements.txt (librosa/tensorflow stack)
- README.md (audio emotion docs)
- notebooks/ (eda + feature extraction + modelling)
- .gitignore (will be rewritten for the new stack)

Kept LICENSE.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Implements the engenharia de dados stage of the termometro eleitoral
miniprojeto.

- src/collect.py: async twikit-based collector. Reads config.yaml,
  authenticates with cookies persistence, paginates search_tweet (20/page)
  with rate-limit backoff using TooManyRequests.rate_limit_reset, and
  writes a normalized CSV at data/raw/tweets.csv.
- config.yaml: 12 presidential candidates for 2026 with handles + aliases,
  collection params (tweets_per_candidate=200, lang=pt, product=Latest,
  since=2026-01-01).
- .env.example: X credential template.
- .gitignore: excludes data/, reports/, .env, twikit cookies.
- requirements.txt: full stack for stages 1-3.
- README.md: how-to-run, schema, limitations, optional Streamlit/Next
  challenge.

Validated build_query output and config loading. The script does not
hit the network without credentials; running it requires a real X
account (recommended secondary).

Spec: docs/superpowers/specs/2026-06-04-termometro-eleitoral-design.md

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Substitui o escopo anterior (Termômetro Eleitoral) pelo novo:
análise da tábua das marés de João Pessoa para classificar as
melhores condições de surf. Mantém as 3 etapas pedagógicas
obrigatórias da Trilha (ETL, EDA, ML).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Limpa tudo do mini-projeto anterior (Termômetro Eleitoral) para começar
o novo escopo: análise da tábua das marés para surfar. Mantém apenas
LICENSE, .gitignore (atualizado) e a spec nova.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Implementa a Etapa 1 (Engenharia de Dados) do mini-projeto. O scraper
coleta três conjuntos de dados de tabuademares.com/br/paraiba/joao-pessoa:

- mares_2025.csv: 4 marés/dia para o ano de 2025 inteiro (~1410 linhas)
- ondas.csv: altura de onda horária da janela de previsão (~6 dias)
- vento.csv: velocidade do vento horária da janela de previsão (~7 dias)

A página renderiza cada mês server-side via POST com fecha=YYYY-MM-01,
o que nos permite cobrir o ano inteiro sem precisar de browser headless.
Para ondas e vento usamos as páginas /previsao/ondas e /previsao/vento.

Estrutura:
- src/scrape.py com funções pequenas, dataclasses tipadas e docstrings
  em português para alunos de 1º período
- pyproject.toml gerenciado por uv (requests, beautifulsoup4, lxml, pandas)
- README com instruções de execução e schema dos CSVs

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Drop dataclasses, use plain dicts
- Inline small helpers
- Remove emojis and overly verbose docstrings
- Drop session abstraction (just use requests directly)
- Remove month-validation guard (over-engineering)

Cuts the file from ~410 to ~165 lines without losing any functionality.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- src/scrape.py: ganha mares_previsao.csv (mes corrente) para juncao
- notebooks/eda.ipynb: carrega os 4 CSVs, faz limpeza, monta datahora,
  explora cada dataset, junta ondas+vento por datahora, interpola mare
  hora a hora, gera features (mare_subindo, periodo_dia, dia_semana,
  coeficiente diario), salva data/processed/dataset.csv
- visualizacoes: boxplot altura por tipo, coeficiente diario do ano,
  serie temporal de onda/vento, heatmap dia x hora, scatter onda x mare,
  rosa simplificada de direcao
- README atualizado com schema dos 4 CSVs e instrucoes da Etapa 2

Notebook executa end-to-end via nbconvert, dataset processado tem 144
linhas (6 dias x 24h) e zero NaN.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- notebooks/ml.ipynb: cria label heuristica (RUIM/BOM/OTIMO) com base em
  altura de onda, vento e mare; treina DecisionTree, RandomForest e KNN
  com sklearn built-in; avalia com classification_report, matriz de
  confusao e cross-val 5-fold; plota a arvore e a importancia das
  features; aplica o melhor modelo no dataset inteiro e gera ranking
  de melhores dias e horarios para surfar
- saida: data/processed/dataset_rotulado.csv
- documenta limitacoes do escopo (janela curta de previsao, heuristica
  como proxy)
- README atualizado com a Etapa 3

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant