Pular para conteúdo

siopy

License siopy PyPI

Orçamento Federal e emendas parlamentares em pandas, a partir de fontes públicas:

  • SIOP Dados Abertos (SOF/MPO) — endpoint SPARQL do RDF da LOA (2001–2026, com execução: PLOA, LOA, lei + créditos, empenhado, liquidado, pago) e CSVs oficiais (cadastro de ações, créditos, acompanhamento físico, regionalização). Sem credencial.
  • Portal da Transparência (CGU) — API REST de emendas parlamentares (autor, número, valores por emenda) e documentos de despesa (empenhos, pagamentos, favorecidos). Requer chave gratuita: https://portaldatransparencia.gov.br/api-de-dados/cadastrar-email.

Pacote irmão em R: siopr. Documentação: https://strategicprojects.github.io/siop/siopy/ (site do monorepo: https://strategicprojects.github.io/siop/).

Instalação

pip install siopy-br         # o import continua: import siopy
pip install -e ".[dev]"      # desenvolvimento, a partir deste diretório

No PyPI o pacote se chama siopy-br (o nome siopy é recusado por colidir com o projeto slopy na normalização do PyPI, que trata i≡l); o pacote importável segue sendo siopy, espelho do siopr.

Uso

import siopy

# Emendas na LOA 2025 (RP 6 = individuais, 7 = bancada, 8 = comissão, 9 = relator)
em = siopy.siop_emendas(2025, tipo=["individual", "bancada"])
em.groupby("tipo_emenda")[["loa", "empenhado", "pago"]].sum()

# Só o Ministério da Saúde, função 10
siopy.siop_emendas(2025, tipo="individual", orgao="36000", funcao="10")

# Orçamento inteiro de um órgão (qualquer RP)
siopy.siop_orcamento(2025, orgao="26000")

# Quando foi a última carga do RDF?
siopy.siop_ultima_atualizacao()

# SPARQL cru (CSV por padrão; o Virtuoso limita ORDER BY+OFFSET a 10k linhas)
siopy.siop_sparql("PREFIX loa: <http://vocab.e.gov.br/2013/09/loa#> SELECT ... ")

# CSVs oficiais (cache em disco; refresh=True para baixar de novo)
siopy.siop_cadastro_acoes(2025, "localizadores")
siopy.siop_creditos(2025)
siopy.siop_catalogo()  # tudo que está publicado na página de Dados Abertos

# Portal da Transparência — export PORTAL_TRANSPARENCIA_API_KEY=...
# As funções pt_* aceitam listas e devolvem um único DataFrame: dos autores
# (acentos normalizados sozinhos) aos documentos SIAFI de cada emenda.
deputados = siopy.camara_deputados(uf="PE")
emendas = siopy.pt_emendas(2025, autor=list(deputados["nome"]))
docs = siopy.pt_emenda_documentos(list(emendas["codigo_emenda"]))
pagamentos = siopy.pt_despesa_documento(
    docs.loc[docs["fase"] == "Pagamento", "codigo_documento"].unique()
)

# Tudo junto: 1 linha por documento, com favorecido/UG/UO
siopy.emendas_execucao(2025, autor="NOME DO PARLAMENTAR")

Colunas em snake_case, códigos como texto (zeros à esquerda preservados), valores em R$ como float. O RDF do SIOP não traz autor nem número de emenda — isso vem do Portal da Transparência:

Como as duas fontes se completam

Arquitetura

Arquitetura de siopr/siopy

Atualização das fontes

Fonte Periodicidade Como verificar
RDF/SPARQL SIOP recarga a cada poucos dias (exercício corrente) e reprocessamento periódico dos anteriores siop_ultima_atualizacao()
CSVs SIOP publicações pontuais (data no nome do arquivo) siop_catalogo()
PT – Tesouro Gerencial (emendas, despesas) diária página Origem dos Dados do portal
PT – Apoios/Solicitações (SLCN) semanal idem

Testes

pytest                 # offline, com fixtures
SIOPY_LIVE=true pytest # inclui chamadas reais (precisa de rede e da chave para pt_*)

Licença

MIT. Dados: SIOP/SOF (CC BY-NC 4.0 para a documentação; dados abertos) e Portal da Transparência (Decreto 8.777/2016).