R Markdown

Estou fazendo esse exemplo de dowload de dados da CVM considerando apenas dois anos 2021 e 2022. Faço isso por conta do custo computacional.

Carregando as bibliotecas necessárias

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(purrr)
library(stringr)
library(httr)
library(readr)
# Definindo os anos de interesse
anos <- 2021:2022

# URL base dos dados da CVM
url_base <- "https://dados.cvm.gov.br/dados/CIA_ABERTA/DOC/DFP/DADOS/"

# Baixando os arquivos zip
for (ano in anos) {
  url <- paste0(url_base, "dfp_cia_aberta_", ano, ".zip")
  GET(url, write_disk(paste0("dfp_cia_aberta_", ano, ".zip")))
}

# Lista para armazenar as demonstrações financeiras
lista_demonstracoes_2021_2022 <- list()

# Percorrendo os arquivos zip e lendo as demonstrações
files <- list.files()
for (arquivo in files) {
  if (arquivo != ".ipynb_checkpoints") {
    arquivo_zip <- unzip(arquivo, exdir = ".")
    planilhas <- unzip(arquivo)
    planilhas <- planilhas[str_detect(planilhas, ".csv$")]
    
    demonstracoes <- planilhas %>%
      map(function(file) {
        read_csv(file, col_types = cols(.default = col_character(), ORDEM_EXERC = col_factor()), locale = locale(encoding = "ISO-8859-1"))
      }) %>%
      bind_rows()
    
    
    lista_demonstracoes_2021_2022 <- append(lista_demonstracoes_2021_2022, list(demonstracoes))
  }
}
# Concatenando as demonstrações em um único dataframe
base_dados <- bind_rows(lista_demonstracoes_2021_2022)
############### ajustes claudiano neto

# ajustando base
base_1 <- base_dados %>% 
  select(1) %>% 
  tidyr::separate( col = `CNPJ_CIA;DT_REFER;VERSAO;DENOM_CIA;CD_CVM;CATEG_DOC;ID_DOC;DT_RECEB;LINK_DOC`,
                   into = c("CNPJ_CIA","DT_REFER", "VERSAO", "DENOM_CIA", "CD_CVM", 
                             "CATEG_DOC", "ID_DOC", "DT_RECEB", "LINK_DOC"), sep = ";")

# ajustando segunda parte


base_2 <- base_dados %>% 
  select(2) %>% 
  tidyr::separate( col = `CNPJ_CIA;DT_REFER;VERSAO;DENOM_CIA;CD_CVM;GRUPO_DFP;MOEDA;ESCALA_MOEDA;ORDEM_EXERC;DT_FIM_EXERC;CD_CONTA;DS_CONTA;VL_CONTA;ST_CONTA_FIXA`,
                   into = c("CNPJ_CIA", "DT_REFER", "VERSAO", "DENOM_CIA", "CD_CVM", "GRUPO_DFP", "MOEDA", "ESCALA_MOEDA", "ORDEM_EXERC", "DT_FIM_EXERC", 
                            "CD_CONTA", "DS_CONTA", "VL_CONTA", "ST_CONTA_FIXA"), sep = ";")

# ajustando terceira parte

base_3 <- base_dados %>% 
  select(3) %>%  
  tidyr::separate( col = `CNPJ_CIA;DT_REFER;VERSAO;DENOM_CIA;CD_CVM;GRUPO_DFP;MOEDA;ESCALA_MOEDA;ORDEM_EXERC;DT_INI_EXERC;DT_FIM_EXERC;CD_CONTA;DS_CONTA;VL_CONTA;ST_CONTA_FIXA`
,
                   into = c("CNPJ_CIA", "DT_REFER", "VERSAO", "DENOM_CIA", "CD_CVM", 
                            "GRUPO_DFP", "MOEDA", "ESCALA_MOEDA", "ORDEM_EXERC", "DT_INI_EXERC", "DT_FIM_EXERC",
                            "CD_CONTA", "DS_CONTA", "VL_CONTA", "ST_CONTA_FIXA"), sep = ";")

# ajustando quarta parte

base_4 <- base_dados %>% 
  select(4) %>% 
  tidyr::separate( col = `CNPJ_CIA;DT_REFER;VERSAO;DENOM_CIA;CD_CVM;GRUPO_DFP;MOEDA;ESCALA_MOEDA;ORDEM_EXERC;DT_INI_EXERC;DT_FIM_EXERC;COLUNA_DF;CD_CONTA;DS_CONTA;VL_CONTA;ST_CONTA_FIXA`
                   ,
                   into = c("CNPJ_CIA","DT_REFER","VERSAO","DENOM_CIA","CD_CVM","GRUPO_DFP","MOEDA",
                            "ESCALA_MOEDA","ORDEM_EXERC","DT_INI_EXERC","DT_FIM_EXERC",
                            "COLUNA_DF","CD_CONTA","DS_CONTA","VL_CONTA","ST_CONTA_FIXA"), sep = ";")

## testando bind_rows
base_dados_merged <- bind_rows(base_1, base_2, base_3, base_4)
#### retomando script do sullivan

# Dividindo a coluna GRUPO_DFP em 'con_ind' e 'tipo_dem'
base_dados_merged_splited <- base_dados_merged %>%
  mutate(con_ind = str_split(GRUPO_DFP, "-", simplify = TRUE)[, 1],
         tipo_dem = str_split(GRUPO_DFP, "-", simplify = TRUE)[, 2]) %>%
  mutate(con_ind = str_trim(con_ind),
         tipo_dem = str_trim(tipo_dem))

Filtrando as linhas onde ORDEM_EXERC não é “PENÚLTIMO”

base_dados_penultimo <- base_dados_merged_splited %>%
  filter(ORDEM_EXERC != "PENÚLTIMO")

Obtendo a lista de tipos de demonstrações únicas

lista_dem <- unique(base_dados_penultimo$tipo_dem)

Lista dos tipos de demonstrações unicas

lista_dem
## [1] "Balanço Patrimonial Ativo"                       
## [2] "Balanço Patrimonial Passivo"                     
## [3] "Demonstração do Fluxo de Caixa (Método Direto)"  
## [4] "Demonstração do Fluxo de Caixa (Método Indireto)"
## [5] "Demonstração de Resultado Abrangente"            
## [6] "Demonstração do Resultado"                       
## [7] "Demonstração de Valor Adicionado"                
## [8] "Demonstração das Mutações do Patrimônio Líquido"

Filtrando os dados para a empresa “WEG S.A.” e a conta específica “Receita de Venda de Bens e/ou Serviços”

weg_dre <- base_dados_penultimo %>%
  filter(DENOM_CIA == "WEG S.A.",
         tipo_dem == "Demonstração do Resultado",
         DS_CONTA == "Receita de Venda de Bens e/ou Serviços",
         con_ind == "DF Consolidado") %>%
  select(DT_REFER, VL_CONTA)

weg_dre
## # A tibble: 2 × 2
##   DT_REFER   VL_CONTA           
##   <chr>      <chr>              
## 1 2021-12-31 23563338.0000000000
## 2 2022-12-31 29904722.0000000000