amarorn / README.md
beAnalytic's picture
feat: sync main with feature/superbet-live-inplay
16c19b8 verified
|
Raw
History Blame Contribute Delete
9.67 kB
---
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.