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.
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))
base_dados_penultimo <- base_dados_merged_splited %>%
filter(ORDEM_EXERC != "PENÚLTIMO")
lista_dem <- unique(base_dados_penultimo$tipo_dem)
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"
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