"""Teste de equivalência entre fontes do SIM: FTP do DATASUS (.dbc por UF) e OpenDataSUS (CSV nacional). Conta os óbitos de 2020 pelas duas fontes com a mesma função (preparar.registrar) e compara célula a célula. Usado para justificar o uso dos CSVs do OpenDataSUS em 2015–2019, quando o FTP do DATASUS ficou indisponível (03–04/10/2026). """ import sys sys.path.insert(0, __import__("os").path.dirname(__file__)) from collections import Counter from concurrent.futures import ProcessPoolExecutor from preparar import processar, processar_csv from config import BRUTOS, UFS def por_grupo(c): g = Counter() for (m, s, f, gr), n in c.items(): g[gr] += n return g if __name__ == "__main__": dbc, ddbc = Counter(), Counter() with ProcessPoolExecutor() as ex: for _, c, d in ex.map(processar, [BRUTOS / "sim" / f"DO{uf}2020.dbc" for uf in UFS]): dbc.update(c); ddbc.update(d) _, csv, dcsv = processar_csv(BRUTOS / "sim_csv" / "Mortalidade_Geral_2020.csv") a, b = por_grupo(dbc), por_grupo(csv) print(f"{'grupo':24s} {'FTP (DBC)':>10s} {'OpenDataSUS':>12s} {'dif':>7s}") for g in sorted(set(a) | set(b), key=lambda x: -a.get(x, 0)): print(f"{g:24s} {a.get(g,0):>10,} {b.get(g,0):>12,} {b.get(g,0)-a.get(g,0):>+7}") chaves = set(dbc) | set(csv) iguais = sum(1 for k in chaves if dbc.get(k, 0) == csv.get(k, 0)) print(f"\nCélulas município×sexo×faixa×grupo idênticas: {iguais:,} de {len(chaves):,} ({100*iguais/len(chaves):.3f}%)") print("descartes DBC:", dict(ddbc), "| CSV:", dict(dcsv))