--- title: api-noticia emoji: 📈 colorFrom: blue colorTo: green sdk: docker pinned: false --- # Datalake de Notícias Esportivas — Bolão AI Pipeline de coleta, transformação e previsão de resultados de bolão (**1 / X / 2**) com notícias esportivas, modelos estatísticos (Dixon-Coles + logística), motor tático **KXL** e interface web React. ## Documentação completa **Índice central:** [docs/README.md](docs/README.md) | Guia | Descrição | |------|-----------| | [Visão geral](docs/visao-geral.md) | Objetivo, fluxos, capacidades | | [Arquitetura](docs/arquitetura.md) | Camadas, pastas, integrações | | [Instalação](docs/instalacao-e-configuracao.md) | Setup, `.env`, troubleshooting | | [API REST](docs/api-referencia.md) | Todos os endpoints + exemplos | | [Modelos ML](docs/modelos-preditivos.md) | Dixon-Coles, logística, KXL, EV | | [Datalake](docs/datalake-e-pipelines.md) | Pipelines e CLIs | | [Frontend](docs/frontend.md) | UI React, rotas, componentes | | [KXL Colisão](docs/kxl-colisao.md) | Fórmulas táticas detalhadas | | [Glossário](docs/glossario.md) | Termos e siglas | ## Início rápido ```bash pip install -e ".[dev]" cp .env.example .env import-world-cup --missing-only ./scripts/dev-api.sh # terminal 1 cd frontend && npm run dev # terminal 2 ``` - API: http://localhost:8000/docs - UI: http://localhost:5173 ## Arquitetura ```mermaid flowchart LR subgraph Fontes GE[Globo Esporte] ESPN[ESPN BR] UOL[UOL Esporte] LANCE[Lance!] end subgraph Ingestão RSS[Coletor RSS] end subgraph Datalake B[Bronze\nJSON/Parquet bruto] S[Silver\nArtigos normalizados] G[Gold\nContexto por jogo] end subgraph ML DS[Dataset JSONL] LM[Fine-tuning LM] API[FastAPI] end GE & ESPN & UOL & LANCE --> RSS --> B --> S --> G --> DS --> LM --> API ``` ### Camadas | Camada | Conteúdo | Formato | |--------|----------|---------| | **Bronze** | Feed RSS bruto + metadados | Parquet particionado por fonte/data | | **Silver** | Artigos limpos, times mencionados, sentimento | Parquet | | **Gold** | Contexto agregado por confronto (bolão) | Parquet + JSONL para treino | ## Fontes (RSS) Configuradas em **`data/sources.yaml`** — adicione novas fontes sem editar código: ```yaml sources: - id: minha_fonte name: Minha Fonte url: https://exemplo.com/rss.xml ``` Fontes ativas: | ID | Portal | |----|--------| | `globo_esporte` | Globo Esporte | | `espn_br` | ESPN Brasil | | `uol_esporte` | UOL Esporte | | `fogaonet` | Fogaonet | | `gazeta_esportiva` | Gazeta Esportiva | ```bash collect-news --list-sources # ver todas as fontes ativas ``` > Priorizamos RSS por ser legal, estável e respeitar robots.txt. Scraping de HTML completo é opcional (`--fetch-body`). ## Setup ```bash python -m venv .venv source .venv/bin/activate pip install -e ".[dev]" cp .env.example .env ``` ## Uso ### 1. Coletar notícias (contínuo) ```bash daily-sync # coleta + silver (use 2-3x/dia) collect-news # só bronze ``` Agende com cron (`scripts/cron_collect.sh`) ou GitHub Actions (`.github/workflows/daily-collect.yml`). ### 2. Importar resultados do Brasileirão (ground truth) ```bash import-brasileirao # temporadas 2022, 2023, 2024 import-brasileirao --seasons 2024 # temporada específica ``` Fonte: [openfootball/south-america](https://github.com/openfootball/south-america) (domínio público). ### 2b. Base histórica da Copa do Mundo ```bash import-world-cup --list # edições na fonte vs lake local import-world-cup --missing-only # importa só o que falta (1930–2022) import-world-cup --seasons 1970 1982 2022 import-world-cup --force # reimporta todas as edições ``` Fonte: [openfootball/worldcup](https://github.com/openfootball/worldcup) (1930 a 2022). Após importar, **reinicie a API** para os modelos WC recarregarem os jogos. ### 2c. Baselines táticos KXL (Copa 2026) Perfis vetoriais por seleção em `data/wc/team_baselines.json` (48 times). O palpite WC mistura 75% ensemble histórico + 25% DNA KXL e inclui matchup setorial no `context`. ```bash python3 scripts/import_wc_baselines.py "/caminho/DADOS PARCEIAIS ... COPA.txt" ``` **Fase 3 — motor de colisão:** `pipelines/wc_kxl_collision.py` e fórmulas em [docs/kxl-colisao.md](docs/kxl-colisao.md) (Vcar, Vesc, TBRTL, colisão setorial, **letalidade×GK** cabeça/fora/área/BP, **EACP**). UI: gramado interativo + painel Letalidade×Goleiro. **Fase 2 — entrada dinâmica (opcional no `POST /worldcup/predict`):** exemplo completo em `data/wc/kxl_match_example.json`. Campos alinhados ao PDF: `previsao_chuva_pct`, `estado_gramado`, `mandante_titulares_notas` (goleiro/defensores/meio/atacantes), `impacto_nota_elenco`, `contexto_peso_caos`. ```json { "home_team": "Brasil", "away_team": "Marrocos", "phase": "group", "kxl_match": { "fecl": { "previsao_chuva_pct": 55, "estado_gramado": "Molhado" }, "feju": { "perfil": "punitivista", "indice_cartao_falta": 0.28 }, "fede": { "desfalques_visitante": [ { "jogador": "Ziyech", "impacto_nota_elenco": -0.8 } ] }, "fept": { "esquema_mandante": "4-3-3", "mandante_titulares_notas": { "goleiro": { "nome": "Alisson", "nota_sofascore": 7.1 }, "atacantes": [{ "nome": "Vini Jr", "nota_sofascore": 7.9 }] } }, "feem": { "contexto_peso_caos": 1.25, "jogo_decisivo": true } } } ``` **Calibração holdout (ensemble vs blend KXL 25%):** ```bash python3 scripts/wc_kxl_calibrate.py --season 2022 ``` ### 3. Rodar pipeline de transformação ```bash run-pipeline silver # bronze → silver run-pipeline gold --season 2024 # silver + fixtures → gold com labels run-pipeline export # exporta JSONL para treino ``` ### 4. Palpites da rodada atual Edite `data/rounds/current.json` com os jogos da rodada e execute: ```bash predict-round predict-round --json # saída JSON ``` Ou via API: `GET /round/predict` ### 5. Exportar dataset para treino ```python from models.dataset import export_jsonl export_jsonl("data/training/bolao_train.jsonl") ``` Adicione o campo `label` nos jogos gold (`1`, `X` ou `2`) com resultados históricos antes de treinar. ### 6. Treinar LM ```bash pip install -e ".[ml]" python -m models.train ``` Integração recomendada com [Unsloth](https://github.com/unslothai/unsloth) para fine-tuning eficiente. ### 7. Subir API ```bash uvicorn api.main:app --reload --host 0.0.0.0 --port 8000 ``` Endpoints principais (detalhes em [docs/api-referencia.md](docs/api-referencia.md)): - `GET /health` — status - `GET /news/feed`, `POST /news/sync` — notícias - `POST /context`, `POST /predict` — Brasileirão + notícias - `GET /round/predict` — rodada Brasileirão - `POST /worldcup/predict` — palpite WC (ensemble + KXL opcional) - `GET /worldcup/round`, `GET /worldcup/teams` — rodada e seleções - `GET /worldcup/editions`, `POST /worldcup/validate` — backtest histórico - `POST /worldcup/value/live` — value bets (requer `ODDS_API_KEY`) ### 8. Frontend web ```bash cd frontend && npm install && npm run dev ``` Ver [docs/frontend.md](docs/frontend.md). ### 9. Odds reais + EV (Copa) Configure `ODDS_API_KEY` no `.env` e execute: ```bash fetch-wc-odds --schedule-file data/rounds/wc_2026.json --output-file data/rounds/wc_2026_odds.json value-wc-odds --odds-file data/rounds/wc_2026_odds.json --min-edge 0.03 ``` Fluxo: - `fetch-wc-odds` busca odds em tempo real (The Odds API) e sobrescreve o JSON de odds. - `value-wc-odds` cruza probabilidades do modelo com odds reais e mostra apenas entradas com EV positivo. ### 10. Benchmark de modelos + visual (MLflow) Para comparar modelos e reduzir erro com validação temporal: ```bash benchmark-wc-models --eval-season 2022 benchmark-wc-models --eval-season 2022 --mlflow mlflow-ui ``` Saídas: - Relatório JSON em `data/lake/reports/wc_benchmark_report.json` - Opcional: métricas no MLflow (`accuracy`, `brier`, `log_loss` por modelo), experimento `api-noticia/wc-benchmark` em `mlflow.db` Use sempre `mlflow-ui` (não `mlflow ui` puro) para a UI ler o mesmo backend SQLite do benchmark. URL padrão: http://127.0.0.1:5001 (porta 5001 evita conflito com AirPlay no macOS). ## Estrutura do projeto ``` api_noticia/ ├── ingest/ # Coleta RSS + storage bronze + odds ├── pipelines/ # Transformações silver, gold, WC, KXL ├── schemas/ # Contratos Pydantic ├── models/ # Dixon-Coles, logística, baseline, EV ├── api/ # FastAPI ├── frontend/ # React + TypeScript (Bolão AI) ├── docs/ # Documentação detalhada ├── tests/ ├── config.py └── data/lake/ # Datalake local (gitignored) ``` ## Próximos passos 1. **Ground truth** — importar resultados históricos (Brasileirão, Copa do Brasil) para labels 2. **NER de jogadores** — substituir heurística por modelo de entidades 3. **BigQuery/GCS** — escalar para GCP com `pip install -e ".[gcp]"` 4. **Orquestração** — Prefect ou Cloud Composer para coleta diária 5. **Fine-tuning** — conectar Unsloth ao JSONL gold 6. **Odds e estatísticas** — enriquecer gold com APIs esportivas (API-Football, etc.) ## Formato bolão | Código | Significado | |--------|-------------| | `1` | Vitória do mandante | | `X` | Empate | | `2` | Vitória do visitante | ## Licença Uso interno / pesquisa. Respeite os termos de uso dos portais de notícias.