From 7968c35bf2d8365f3d3263f0d0c768bf250894e4 Mon Sep 17 00:00:00 2001 From: Luiz Eduardo Date: Thu, 8 Aug 2024 10:47:33 -0300 Subject: [PATCH] Adicionar modelo br_rf_arrecadacao --- dbt_project.yml | 3 + .../br_rf_arrecadacao__uf.sql | 65 +++++ models/br_rf_arrecadacao/code/clean_data.py | 120 ++++++++ .../br_rf_arrecadacao/code/download_data.py | 11 + models/br_rf_arrecadacao/schema.yml | 264 ++++++++++++++++++ 5 files changed, 463 insertions(+) create mode 100644 models/br_rf_arrecadacao/br_rf_arrecadacao__uf.sql create mode 100644 models/br_rf_arrecadacao/code/clean_data.py create mode 100644 models/br_rf_arrecadacao/code/download_data.py create mode 100644 models/br_rf_arrecadacao/schema.yml diff --git a/dbt_project.yml b/dbt_project.yml index f44fd18a..678561af 100644 --- a/dbt_project.yml +++ b/dbt_project.yml @@ -300,6 +300,9 @@ models: br_poder360_pesquisas: +materialized: table +schema: br_poder360_pesquisas + br_rf_arrecadacao: + +materialized: table + +schema: br_rf_arrecadacao br_rf_cafir: +materialized: table +schema: br_rf_cafir diff --git a/models/br_rf_arrecadacao/br_rf_arrecadacao__uf.sql b/models/br_rf_arrecadacao/br_rf_arrecadacao__uf.sql new file mode 100644 index 00000000..5a9e30af --- /dev/null +++ b/models/br_rf_arrecadacao/br_rf_arrecadacao__uf.sql @@ -0,0 +1,65 @@ +{{ + config( + schema="br_rf_arrecadacao", + alias="uf", + materialized="table", + partition_by={ + "field": "ano", + "data_type": "int64", + "range": {"start": 2000, "end": 2024, "interval": 1}, + }, + cluster_by=["mes"], + ) +}} + +select + safe_cast(ano as int64) ano, + safe_cast(mes as int64) mes, + safe_cast(sigla_uf as string) sigla_uf, + safe_cast(imposto_importacao as float64) imposto_importacao, + safe_cast(imposto_exportacao as float64) imposto_exportacao, + safe_cast(ipi_fumo as float64) ipi_fumo, + safe_cast(ipi_bebidas as float64) ipi_bebidas, + safe_cast(ipi_automoveis as float64) ipi_automoveis, + safe_cast(ipi_importacoes as float64) ipi_importacoes, + safe_cast(ipi_outros as float64) ipi_outros, + safe_cast(irpf as float64) irpf, + safe_cast(irpj_entidades_financeiras as float64) irpj_entidades_financeiras, + safe_cast(irpj_demais_empresas as float64) irpj_demais_empresas, + safe_cast(irrf_rendimentos_trabalho as float64) irrf_rendimentos_trabalho, + safe_cast(irrf_rendimentos_capital as float64) irrf_rendimentos_capital, + safe_cast(irrf_remessas_exterior as float64) irrf_remessas_exterior, + safe_cast(irrf_outros_rendimentos as float64) irrf_outros_rendimentos, + safe_cast(iof as float64) iof, + safe_cast(itr as float64) itr, + safe_cast(ipmf as float64) ipmf, + safe_cast(cpmf as float64) cpmf, + safe_cast(cofins as float64) cofins, + safe_cast(cofins_financeiras as float64) cofins_entidades_financeiras, + safe_cast(cofins_demais_empresas as float64) cofins_demais_empresas, + safe_cast(pis_pasep as float64) pis_pasep, + safe_cast( + pis_pasep_entidades_financeiras as float64 + ) pis_pasep_entidades_financeiras, + safe_cast(pis_pasep_demais_empresas as float64) pis_pasep_demais_empresas, + safe_cast(csll as float64) csll, + safe_cast(csll_financeiras as float64) csll_entidades_financeiras, + safe_cast(csll_demais_empresas as float64) csll_demais_empresas, + safe_cast( + cide_combustiveis_parcela_nao_dedutivel as float64 + ) cide_combustiveis_parcela_nao_dedutivel, + safe_cast(cide_combustiveis as float64) cide_combustiveis, + safe_cast(cpsss_1 as float64) cpsss_1, + safe_cast(cpsss_2 as float64) cpsss_2, + safe_cast(contribuicoes_fundaf as float64) contribuicao_fundaf, + safe_cast(refis as float64) refis, + safe_cast(paes as float64) paes, + safe_cast(retencoes_fonte as float64) retencoes_fonte, + safe_cast(pagamento_unificado as float64) pagamento_unificado, + safe_cast(outras_receitas_ as float64) outras_receitas_rfb, + safe_cast(demais_receitas as float64) demais_receitas, + safe_cast(receita_previdenciaria as float64) receita_previdenciaria, + safe_cast(receita_previdenciaria_propria as float64) receita_previdenciaria_propria, + safe_cast(receita_previdenciaria_demais as float64) receita_previdenciaria_demais, + safe_cast(receitas_outros_orgaos as float64) receitas_outros_orgaos, +from `basedosdados-dev.br_rf_arrecadacao_staging.uf` as t diff --git a/models/br_rf_arrecadacao/code/clean_data.py b/models/br_rf_arrecadacao/code/clean_data.py new file mode 100644 index 00000000..9c65d6d8 --- /dev/null +++ b/models/br_rf_arrecadacao/code/clean_data.py @@ -0,0 +1,120 @@ +import os +import numpy as np +import pandas as pd + +file_directory = os.path.dirname(__file__) + +def read_data(): + data_directory = os.path.join(file_directory, '../input/arrecadacao-estado.csv') + return pd.read_csv(data_directory, sep=';') + +def removeEmptyRows(df): + return df.dropna(axis=0, how='all') + +def rename_columns(df): + name_dict = { + 'Ano':'ano', + 'Mês':'mes', + 'UF':'sigla_uf', + 'IMPOSTO SOBRE IMPORTAÇÃO':'imposto_importacao', + 'IMPOSTO SOBRE EXPORTAÇÃO':'imposto_exportacao', + 'IPI - FUMO':'ipi_fumo', + 'IPI - BEBIDAS':'ipi_bebidas', + 'IPI - AUTOMÓVEIS':'ipi_automoveis', + 'IPI - VINCULADO À IMPORTACAO':'ipi_importacoes', + 'IPI - OUTROS':'ipi_outros', + 'IRPF':'irpf', + 'IRPJ - ENTIDADES FINANCEIRAS':'irpj_entidades_financeiras', + 'IRPJ - DEMAIS EMPRESAS':'irpj_demais_empresas', + 'IRRF - RENDIMENTOS DO TRABALHO':'irrf_rendimentos_trabalho', + 'IRRF - RENDIMENTOS DO CAPITAL':'irrf_rendimentos_capital', + 'IRRF - REMESSAS P/ EXTERIOR':'irrf_remessas_exterior', + 'IRRF - OUTROS RENDIMENTOS':'irrf_outros_rendimentos', + 'IMPOSTO S/ OPERAÇÕES FINANCEIRAS':'iof', + 'IMPOSTO TERRITORIAL RURAL':'itr', + 'IMPOSTO PROVIS.S/ MOVIMENT. FINANC. - IPMF':'ipmf', + 'CPMF':'cpmf', + 'COFINS':'cofins', + 'COFINS - FINANCEIRAS':'cofins_financeiras', + 'COFINS - DEMAIS':'cofins_demais_empresas', + 'CONTRIBUIÇÃO PARA O PIS/PASEP':'pis_pasep', + 'CONTRIBUIÇÃO PARA O PIS/PASEP - FINANCEIRAS':'pis_pasep_entidades_financeiras', + 'CONTRIBUIÇÃO PARA O PIS/PASEP - DEMAIS':'pis_pasep_demais_empresas', + 'CSLL':'csll', + 'CSLL - FINANCEIRAS':'csll_financeiras', + 'CSLL - DEMAIS':'csll_demais_empresas', + 'CIDE-COMBUSTÍVEIS (parc. não dedutível)': 'cide_combustiveis_parcela_nao_dedutivel', + 'CIDE-COMBUSTÍVEIS':'cide_combustiveis', + 'CONTRIBUIÇÃO PLANO SEG. SOC. SERVIDORES':'cpsss_1', + 'CPSSS - Contrib. p/ o Plano de Segurid. Social Serv. Público':'cpsss_2', + 'CONTRIBUICÕES PARA FUNDAF':'contribuicoes_fundaf', + 'REFIS':'refis', + 'PAES':'paes', + 'RETENÇÃO NA FONTE - LEI 10.833, Art. 30':'retencoes_fonte', + 'PAGAMENTO UNIFICADO':'pagamento_unificado', + 'OUTRAS RECEITAS ADMINISTRADAS':'outras_receitas_', + 'DEMAIS RECEITAS':'demais_receitas', + 'RECEITA PREVIDENCIÁRIA':'receita_previdenciaria', + 'RECEITA PREVIDENCIÁRIA - PRÓPRIA':'receita_previdenciaria_propria', + 'RECEITA PREVIDENCIÁRIA - DEMAIS':'receita_previdenciaria_demais', + 'ADMINISTRADAS POR OUTROS ÓRGÃOS':'receitas_outros_orgaos' + } + + return df.rename(columns=name_dict) + +def replace_commas(value): + string_value = str(value) + num_commas = string_value.count(',') + if num_commas == 1: + return string_value.replace(',','.') + elif num_commas > 1: + return string_value.replace(',','',num_commas-1).replace(',','.') + else: + return string_value + +def remove_dots(value): + string_value = str(value) + num_dots = string_value.count('.') + if num_dots > 1: + return string_value.replace('.','',num_dots-1) + else: + return string_value + +def get_month_number(month_column): + month_numbers = { + 'Janeiro': '1', + 'Fevereiro': '2', + 'Março': '3', + 'Abril': '4', + 'Maio': '5', + 'Junho': '6', + 'Julho': '7', + 'Agosto': '8', + 'Setembro': '9', + 'Outubro': '10', + 'Novembro': '11', + 'Dezembro':'12' + } + return month_column.replace(month_numbers).astype('int') + +def change_types(df): + df['ano'] = df['ano'].astype('int') + df['mes'] = get_month_number(df['mes']) + df['sigla_uf'] = df['sigla_uf'].astype('string') + + #All remaining columns are monetary values + for col in df.columns[3:]: + df[col] = df[col].apply(replace_commas).apply(remove_dots).astype('float') + + return df + +def save_data(df): + data_directory = os.path.join(file_directory, '../output/br_rf_arrecadacao') + df.to_parquet(data_directory, partition_cols=['ano','mes']) + +if __name__ == '__main__': + df = read_data() + df = removeEmptyRows(df) + df = rename_columns(df) + df = change_types(df) + save_data(df) diff --git a/models/br_rf_arrecadacao/code/download_data.py b/models/br_rf_arrecadacao/code/download_data.py new file mode 100644 index 00000000..4735f6cb --- /dev/null +++ b/models/br_rf_arrecadacao/code/download_data.py @@ -0,0 +1,11 @@ +import requests + +def download_data(url, file_path): + response = requests.get(url) + with open(file_path, 'w') as file: + file.write(response.content.decode('latin1')) + +if __name__ == "__main__": + url = "https://www.gov.br/receitafederal/dados/arrecadacao-estado.csv" + file_path = f"input/arrecadacao-estado.csv" + download_data(url, file_path) diff --git a/models/br_rf_arrecadacao/schema.yml b/models/br_rf_arrecadacao/schema.yml new file mode 100644 index 00000000..821c1cff --- /dev/null +++ b/models/br_rf_arrecadacao/schema.yml @@ -0,0 +1,264 @@ +--- +version: 2 +models: + - name: br_rf_arrecadacao__uf + description: Contém os dados de arrecadação mensal por Unidade da Federação, contendo + receitas administradas e não administradas pela Receita Federal do Brasil. + tests: + - dbt_utils.unique_combination_of_columns: + combination_of_columns: [ano, mes, sigla_uf] + columns: + - name: ano + description: Ano de referência. + tests: + - relationships: + to: ref('br_bd_diretorios_data_tempo__ano') + field: ano.ano + - dbt_utils.not_null_proportion: + at_least: 0.95 + - name: mes + description: Mês de referência. + tests: + - relationships: + to: ref('br_bd_diretorios_data_tempo__mes') + field: mes.mes + - dbt_utils.not_null_proportion: + at_least: 0.95 + - name: sigla_uf + description: Sigla da Unidade da Federação. + tests: + - relationships: + to: ref('br_bd_diretorios_brasil__uf') + field: sigla + - dbt_utils.not_null_proportion: + at_least: 0.95 + - name: imposto_importacao + description: Imposto sobre a Importação. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.95 + - name: imposto_exportacao + description: Imposto sobre a Exportação. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.95 + - name: ipi_fumo + description: Imposto sobre Produtos Industrializado incidente sobre setor + de fumo. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.95 + - name: ipi_bebidas + description: Imposto sobre Produtos Industrializado incidente sobre setor + de bebidas. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.95 + - name: ipi_automoveis + description: Imposto sobre Produtos Industrializado incidente sobre setor + de automóveis. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.95 + - name: ipi_importacoes + description: Imposto sobre Produtos Industrializado vinculado à importação. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.95 + - name: ipi_outros + description: Imposto sobre Produtos Industrializado incidente sobre outros + produtos. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.95 + - name: irpf + description: Imposto sobre a Renda da Pessoa Física. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.95 + - name: irpj_entidades_financeiras + description: Imposto sobre a Renda da Pessoa Jurídica incidente em entidades + financeiras. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.95 + - name: irpj_demais_empresas + description: Imposto sobre a Renda da Pessoa Jurídica incidente em demais + empresas. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.95 + - name: irrf_rendimentos_trabalho + description: Imposto sobre a Renda Retido na Fonte referente à rendimentos + do trabalho. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.95 + - name: irrf_rendimentos_capital + description: Imposto sobre a Renda Retido na Fonte referente à rendimentos + do capital. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.95 + - name: irrf_remessas_exterior + description: Imposto sobre a Renda Retido na Fonte referente à remessas para + o exterior. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.95 + - name: irrf_outros_rendimentos + description: Imposto sobre a Renda Retido na Fonte referente à outros rendimentos. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.95 + - name: iof + description: Imposto sobre Operações Financeiras. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.95 + - name: itr + description: Imposto sobre a Propriedade Territorial Rural. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.95 + - name: ipmf + description: Imposto Provisório sobre Movimentação Financeira. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.06 + - name: cpmf + description: Contribuição Provisória sobre Movimentação Financeira. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.45 + - name: cofins + description: Contribuição para o Financiamento da Seguridade Social. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.12 + - name: cofins_entidades_financeiras + description: Contribuição para o Financiamento da Seguridade Social referente + à entidades financeiras. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.80 + - name: cofins_demais_empresas + description: Contribuição para o Financiamento da Seguridade Social referente + à demais empresas. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.80 + - name: pis_pasep + description: Programa de Integração Social e o Programa de Formação do Patrimônio + do Servidor Público. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.12 + - name: pis_pasep_entidades_financeiras + description: Programa de Integração Social e o Programa de Formação do Patrimônio + do Servidor Público referente à entidades financeiras. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.80 + - name: pis_pasep_demais_empresas + description: Programa de Integração Social e o Programa de Formação do Patrimônio + do Servidor Público referente à demais empresas. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.80 + - name: csll + description: Contribuição Social sobre o Lucro Líquido. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.12 + - name: csll_entidades_financeiras + description: Contribuição Social sobre o Lucro Líquido referente à entidades + financeiras. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.80 + - name: csll_demais_empresas + description: Contribuição Social sobre o Lucro Líquido referente à demais + empresas. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.80 + - name: cide_combustiveis_parcela_nao_dedutivel + description: Parcela não dedutível da Contribuição de Intervenção no Domínio + Econômico aplicada à combustíveis. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.03 + - name: cide_combustiveis + description: Contribuição de Intervenção no Domínio Econômico aplicada à combustíveis. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.75 + - name: cpsss_1 + description: Contribuição para o Plano de Seguridade Social do Servidor Público. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.12 + - name: cpsss_2 + description: Contribuição para o Plano de Seguridade Social do Servidor Público. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.50 + - name: contribuicao_fundaf + description: Contribuições para o Fundo Especial de Desenvolvimento e Aperfeiçoamento + das Atividades de Fiscalização (Fundaf). + tests: + - dbt_utils.not_null_proportion: + at_least: 0.55 + - name: refis + description: Programa de Recuperação Fiscal. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.03 + - name: paes + description: Parcelamento Especial. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.03 + - name: retencoes_fonte + description: Retenções na fonte de CSLL, Cofins e Pis/Pasep, previstas no + art. 30 da Lei nº 10.833, de 29 de dezembro de 2003. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.02 + - name: pagamento_unificado + description: Pagamentos referentes a vários tributos feitos em um único documento + de arrecadação, tipo parcelamentos, retenções, Simples etc. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.04 + - name: outras_receitas_rfb + description: Outras receitas administradas pela RFB. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.95 + - name: demais_receitas + description: Outras receitas não administradas pela RFB. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.25 + - name: receita_previdenciaria + description: Total da Receita Previdenciária. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.25 + - name: receita_previdenciaria_propria + description: Receita Previdenciária Própria. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.15 + - name: receita_previdenciaria_demais + description: Receita Previdenciária Demais. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.15 + - name: receitas_outros_orgaos + description: Receitas administradas por outros órgãos. + tests: + - dbt_utils.not_null_proportion: + at_least: 0.50