Scraper PNCP usa valorGlobal (bugado na fonte) em vez de valorParcela × numeroParcelas #3

Open
opened 2026-04-30 04:04:16 -03:00 by navigator · 0 comments
Owner

Contexto

scripts/scraper_pncp_full.py:94item.get("valorGlobal", 0) direto. PNCP tem typos sistêmicos no campo valorGlobal: contratos com valores de R$ 1 trilhão, R$ 6 trilhões, etc. — encontrado em 2026-04-28 quando o site mostrava SUM = R$ 38,9 trilhões.

Análise dos api_raw mostra que valorParcela × numeroParcelas é confiável e bate com valorGlobal em ~99% dos casos. Os ~1% divergentes são os bugs.

Exemplo

Contrato pncp-53378820000188-2-000088/2025 ("Espingarda calibre 12"):

  • valorInicial: 1.034.440.001.034,44 (R$ 1 tri — bug)
  • valorParcela: 1.034.440,00 (R$ 1 mi — real)
  • numeroParcelas: 1
  • ✓ Use valorParcela × numeroParcelas

Mudança

  • scraper_pncp_full.py:94 — calcular valor = valorParcela * numeroParcelas; fallback para valorGlobal se ausente
  • Validar: se diferença > 1.5x entre os dois, logar warning e usar valorParcela
  • Reaproveitar api_raw existente para reparse de todos os 4,77M rows (script /tmp/apply_heuristic_fix.py já fez isso para a faixa R$ 100M-10bi; estender para todas as faixas)

Já feito (2026-04-29)

  • 445 outliers já quarentenados em valor_outliers_quarantine (104 cegos + 341 via heurística)
  • Soma valor_total saiu de R$ 38,94 T → R$ 1,77 T
## Contexto `scripts/scraper_pncp_full.py:94` lê `item.get("valorGlobal", 0)` direto. PNCP tem typos sistêmicos no campo `valorGlobal`: contratos com valores de R$ 1 trilhão, R$ 6 trilhões, etc. — encontrado em 2026-04-28 quando o site mostrava SUM = R$ 38,9 trilhões. Análise dos `api_raw` mostra que `valorParcela × numeroParcelas` é confiável e bate com `valorGlobal` em ~99% dos casos. Os ~1% divergentes são os bugs. ## Exemplo Contrato `pncp-53378820000188-2-000088/2025` ("Espingarda calibre 12"): - `valorInicial`: 1.034.440.001.034,44 (R$ 1 tri — bug) - `valorParcela`: 1.034.440,00 (R$ 1 mi — real) - `numeroParcelas`: 1 - ✓ Use `valorParcela × numeroParcelas` ## Mudança - [ ] `scraper_pncp_full.py:94` — calcular `valor = valorParcela * numeroParcelas`; fallback para `valorGlobal` se ausente - [ ] Validar: se diferença > 1.5x entre os dois, logar warning e usar `valorParcela` - [ ] Reaproveitar `api_raw` existente para reparse de todos os 4,77M rows (script `/tmp/apply_heuristic_fix.py` já fez isso para a faixa R$ 100M-10bi; estender para todas as faixas) ## Já feito (2026-04-29) - 445 outliers já quarentenados em `valor_outliers_quarantine` (104 cegos + 341 via heurística) - Soma `valor_total` saiu de R$ 38,94 T → R$ 1,77 T
Sign in to join this conversation.
No description provided.