Pular para conteúdo

CGVN Companhias Abertas — leitura

Leitura (← CVM) do Informe sobre o Código Brasileiro de Governança Corporativa (cgvn_cia_aberta_AAAA.zip), publicado no portal de dados abertos da CVM.

Veja também: Referência da API · Uso · o IPE, o VLMO e o FCA.


Os 2 membros — índice + conteúdo (molde do VLMO)

reader membro cols linhas (2025)
CgvnCiaAbertaReader cgvn_cia_aberta.csv 12 382
CgvnCiaAbertaPraticasReader cgvn_cia_aberta_praticas.csv 11 19.980

O ZIP tem ~4 MiB, mas isso é um membro de conteúdo grande, não muitos membros: a Explicacao chega a ~6.000 caracteres. Particionado por ano — o date_ref seleciona o ano, e os dois readers baixam o mesmo arquivo.


⚠️ O índice do CGVN não repete a anomalia do FCA

índice CGVN índice FCA
CNPJ CNPJ_Companhia CNPJ_CIA
data ref. Data_Referencia DT_REFER
denominação Nome_Empresarial DENOM_CIA

O FCA é o único dataset do DOC cujo índice usa maiúsculas abreviadas. Generalizar a partir dele escreveria este errado — por isso cada dataset é fundamentado nos próprios bytes, e a divergência entre os dois contracts é pinada por teste.


⚠️ Codigo_CVM vem com zero à esquerda

No arquivo real o código é 001023. É o primeiro lugar deste portal root em que tipar como texto é load-bearing (no IPE não havia zeros à esquerda, então a tipagem era apenas convenção).

Provado por mutação: tipando a coluna como int64, a asserção falha com np.int64(1023) == '001023'os zeros simplesmente desaparecem.

ID_Item é um identificador hierárquico (1.1.1) e também fica texto exato.


Tipagem

membro colunas de data
índice 4: Data_Referencia, Data_Entrega, Data_Inicio_Exercicio_Social, Data_Fim_Exercicio_Social
conteúdo 1: Data_Referencia (as datas do exercício ficam no índice)

Todas 100% ISO no arquivo real. Todo o restante é texto exato da fonte. Motivo_Reapresentacao chega quase sempre vazio (13 de 382 linhas); Explicacao está preenchida em 11.935 das 19.980 linhas; Pratica_Adotada é Sim/Não.

⚠️ O Link_Download do índice aponta para http://www.rad.cvm.gov.br/ENETCONSULTA/…http puro e um caminho diferente do https://…/ENET/… do IPE/VLMO. É devolvido como publicado: o reader não normaliza nem segue o link.


Uso

from datetime import date
from pathlib import Path

from filings_cvm.ingestion.cia_aberta import CgvnCiaAbertaPraticasReader, CgvnCiaAbertaReader

# O índice dos informes entregues no ano:
df_indice = CgvnCiaAbertaReader(date_ref=date(2025, 6, 15)).read()

# As práticas, prática por prática, guardando o .zip cru:
df_praticas = CgvnCiaAbertaPraticasReader(
    date_ref=date(2025, 6, 15),
    path_raw=Path("/data/bronze/cvm/cgvn"),
).read()

# Quais práticas a companhia declarou NÃO adotar, e por quê:
nao_adotadas = df_praticas[df_praticas["Pratica_Adotada"] == "Não"]

O frame devolvido carrega, além das colunas da fonte, as seis colunas de proveniência.


META

A especificação da CVM sai em MetaCgvnCiaAbertaReader (o 41º Meta reader) — veja META. Os 2 membros da META (12 e 11 campos) batem exatamente com os headers reais.

⚠️ Aqui a forma padrão é a que funciona — meta_cgvn_cia_aberta.zip. As outras 3 candidatas dão 404, incluindo cgvn_cia_aberta.zip sem prefixo, que é justamente a forma correta do FCA. Cinco datasets deste sub-root, cinco medições diferentes: a URL é pinada por dataset, jamais derivada.