Lâmina FIF — leitura¶
Leitura (← CVM) do membro lamina_fi_AAAAMM.csv do dump mensal da Lâmina
(lamina_fi_AAAAMM.zip), publicado no
portal de dados abertos da CVM.
Veja também: Referência da API para cada símbolo público · Uso para instalação e o conceito geral.
Descrição¶
LaminaReader baixa o ZIP mensal, extrai todos os membros, lê a lâmina propriamente dita,
valida o contrato (as 78 colunas obrigatórias + coluna de CNPJ coercível), aplica os tipos
declarados — nunca a inferência do pandas — e devolve uma linha por classe de fundo.
É o fact sheet que a CVM publica: objetivo, política de investimento, taxas, condições de resgate, rentabilidade de cinco anos, exemplos de custo e contatos do SAC.
Dois leitores, o mesmo ZIP¶
LaminaCarteiraReader lê um membro diferente do mesmo arquivo — a
alocação por tipo de ativo. Ambos são baixados juntos, então um path_raw gravado por qualquer um
dos dois serve ao outro sem novo download.
Por que QUOTE_NONE é essencial aqui¶
Os campos de texto livre (OBJETIVO, POLIT_INVEST, TAXA_ADM_OBS, …) contêm aspas " soltas e
desbalanceadas. Com o quoting padrão do pandas, uma dessas aspas abre um campo que engole o
delimitador e o fim da linha, fundindo dois registros em um — no lamina_fi_202504.csv real
isso produz uma linha de 142 campos e um ParserError. Com QUOTE_NONE, as 1.325 linhas são lidas
com exatamente 78 campos cada. A CVM não emite quoting algum, e o delimitador nunca aparece
dentro de um campo.
| Coluna | Tipo | Observação |
|---|---|---|
DT_COMPTC, DT_INI_DESPESA, DT_FIM_DESPESA, DT_INI_ATIV_5ANO |
date |
Vazios viram NaT. |
ID_SUBCLASSE |
str |
Preenchido em apenas 5 das 1.324 linhas de 2025-04; vazio permanece nulo. |
CNPJ_FUNDO_CLASSE |
str |
Mascarado na origem; deve ter ao menos um CNPJ válido. |
| Todas as demais (74) | str |
Texto exato da CVM — nunca float. Inclui VL_PATRIM_LIQ, TAXA_ADM, PR_*. |
O mapa de tipos é derivado do contrato, não redigitado, de modo que os dois não podem divergir.
Exemplos¶
Ler o mês de referência¶
from datetime import date
from filings_cvm.ingestion.fi import LaminaReader
df_ = LaminaReader(date_ref=date(2025, 4, 15)).read()
print(df_[["DENOM_SOCIAL", "TAXA_ADM", "VL_PATRIM_LIQ"]].head())
Converter valores no ponto de cálculo¶
from decimal import Decimal
# As colunas monetárias vêm como texto exato; converta apenas onde for calcular.
df_["PL"] = df_["VL_PATRIM_LIQ"].dropna().map(Decimal)
Persistir o artefato bruto (camada bronze)¶
from pathlib import Path
df_ = LaminaReader(
date_ref=date(2025, 4, 15),
path_raw=Path("/data/bronze/cvm/lamina/202504"),
).read()
O ZIP e todos os CSVs extraídos são mantidos — não só o membro lido — para que a carteira reproduza os mesmos bytes.
Timeout¶
O read levanta OSError (falha de download), ContractError (CSV viola o contrato) ou
ValueError (o ZIP não contém o membro lamina_fi_AAAAMM.csv) — falha cedo, sem devolver dados
corrompidos.