From da74a5b373c0b22f1d5cdd6e4c7867a63d89933f Mon Sep 17 00:00:00 2001 From: tricktx Date: Wed, 6 Nov 2024 19:34:43 -0300 Subject: [PATCH 1/3] update enem 2023 --- .../br_inep_enem/br_inep_enem__dicionario.sql | 1 + .../br_inep_enem/br_inep_enem__microdados.sql | 82 +++++ ...enem__questionario_socioeconomico_2023.sql | 30 ++ models/br_inep_enem/code/microdados.py | 308 ++++++++++++++++ .../code/questionario_socioeconomico.py | 62 ++++ models/br_inep_enem/schema.yml | 332 +++++++++++++++++- 6 files changed, 814 insertions(+), 1 deletion(-) create mode 100644 models/br_inep_enem/br_inep_enem__microdados.sql create mode 100644 models/br_inep_enem/br_inep_enem__questionario_socioeconomico_2023.sql create mode 100644 models/br_inep_enem/code/microdados.py create mode 100644 models/br_inep_enem/code/questionario_socioeconomico.py diff --git a/models/br_inep_enem/br_inep_enem__dicionario.sql b/models/br_inep_enem/br_inep_enem__dicionario.sql index bb310e82..bc2b539e 100644 --- a/models/br_inep_enem/br_inep_enem__dicionario.sql +++ b/models/br_inep_enem/br_inep_enem__dicionario.sql @@ -1,4 +1,5 @@ {{ config(alias="dicionario", schema="br_inep_enem") }} + select safe_cast(id_tabela as string) id_tabela, safe_cast(nome_coluna as string) nome_coluna, diff --git a/models/br_inep_enem/br_inep_enem__microdados.sql b/models/br_inep_enem/br_inep_enem__microdados.sql new file mode 100644 index 00000000..b5379d6f --- /dev/null +++ b/models/br_inep_enem/br_inep_enem__microdados.sql @@ -0,0 +1,82 @@ +{{ + config( + alias="microdados", + schema="br_inep_enem", + partition_by={ + "field": "ano", + "data_type": "int64", + "range": {"start": 1998, "end": 2023, "interval": 1}, + }, + labels={"project_id": "basedosdados", "tema": "educacao"}, + ) +}} + +select + safe_cast(ano as int64) ano, + safe_cast(id_inscricao as string) id_inscricao, + safe_cast(faixa_etaria as string) faixa_etaria, + safe_cast(sexo as string) sexo, + safe_cast(id_municipio_residencia as string) id_municipio_residencia, + safe_cast(sigla_uf_residencia as string) sigla_uf_residencia, + safe_cast(estado_civil as string) estado_civil, + safe_cast(cor_raca as string) cor_raca, + safe_cast(nacionalidade as string) nacionalidade, + safe_cast(situacao_conclusao as string) situacao_conclusao, + safe_cast(ano_conclusao as int64) ano_conclusao, + safe_cast(tipo_escola as string) tipo_escola, + safe_cast(ensino as string) ensino, + safe_cast(indicador_treineiro as boolean) indicador_treineiro, + safe_cast(id_municipio_escola as string) id_municipio_escola, + safe_cast(sigla_uf_escola as string) sigla_uf_escola, + safe_cast( + dependencia_administrativa_escola as string + ) dependencia_administrativa_escola, + safe_cast(localizacao_escola as string) localizacao_escola, + safe_cast(situacao_funcionamento_escola as string) situacao_funcionamento_escola, + safe_cast(indicador_certificado as boolean) indicador_certificado, + safe_cast(nome_certificadora as string) nome_certificadora, + safe_cast(sigla_uf_certificadora as string) sigla_uf_certificadora, + safe_cast(id_municipio_prova as string) id_municipio_prova, + safe_cast(sigla_uf_prova as string) sigla_uf_prova, + safe_cast(presenca_objetiva as string) presenca_objetiva, + safe_cast(tipo_prova_objetiva as string) tipo_prova_objetiva, + safe_cast(nota_objetiva_competencia_1 as float64) nota_objetiva_competencia_1, + safe_cast(nota_objetiva_competencia_2 as float64) nota_objetiva_competencia_2, + safe_cast(nota_objetiva_competencia_3 as float64) nota_objetiva_competencia_3, + safe_cast(nota_objetiva_competencia_4 as float64) nota_objetiva_competencia_4, + safe_cast(nota_objetiva_competencia_5 as float64) nota_objetiva_competencia_5, + safe_cast(nota_objetiva as float64) nota_objetiva, + safe_cast(respostas_objetiva as string) respostas_objetiva, + safe_cast(gabarito_objetiva as string) gabarito_objetiva, + safe_cast(presenca_ciencias_natureza as string) presenca_ciencias_natureza, + safe_cast(presenca_ciencias_humanas as string) presenca_ciencias_humanas, + safe_cast(presenca_linguagens_codigos as string) presenca_linguagens_codigos, + safe_cast(presenca_matematica as string) presenca_matematica, + safe_cast(tipo_prova_ciencias_natureza as string) tipo_prova_ciencias_natureza, + safe_cast(tipo_prova_ciencias_humanas as string) tipo_prova_ciencias_humanas, + safe_cast(tipo_prova_linguagens_codigos as string) tipo_prova_linguagens_codigos, + safe_cast(tipo_prova_matematica as string) tipo_prova_matematica, + safe_cast(nota_ciencias_natureza as float64) nota_ciencias_natureza, + safe_cast(nota_ciencias_humanas as float64) nota_ciencias_humanas, + safe_cast(nota_linguagens_codigos as float64) nota_linguagens_codigos, + safe_cast(nota_matematica as float64) nota_matematica, + safe_cast(respostas_ciencias_natureza as string) respostas_ciencias_natureza, + safe_cast(respostas_ciencias_humanas as string) respostas_ciencias_humanas, + safe_cast(respostas_linguagens_codigos as string) respostas_linguagens_codigos, + safe_cast(respostas_matematica as string) respostas_matematica, + safe_cast(gabarito_ciencias_natureza as string) gabarito_ciencias_natureza, + safe_cast(gabarito_ciencias_humanas as string) gabarito_ciencias_humanas, + safe_cast(gabarito_linguagens_codigos as string) gabarito_linguagens_codigos, + safe_cast(gabarito_matematica as string) gabarito_matematica, + safe_cast(lingua_estrangeira as string) lingua_estrangeira, + safe_cast(presenca_redacao as string) presenca_redacao, + safe_cast(nota_redacao_competencia_1 as float64) nota_redacao_competencia_1, + safe_cast(nota_redacao_competencia_2 as float64) nota_redacao_competencia_2, + safe_cast(nota_redacao_competencia_3 as float64) nota_redacao_competencia_3, + safe_cast(nota_redacao_competencia_4 as float64) nota_redacao_competencia_4, + safe_cast(nota_redacao_competencia_5 as float64) nota_redacao_competencia_5, + safe_cast(nota_redacao as float64) nota_redacao, + safe_cast( + indicador_questionario_socioeconomico as boolean + ) indicador_questionario_socioeconomico +from `basedosdados-dev.br_inep_enem_staging.microdados` as t diff --git a/models/br_inep_enem/br_inep_enem__questionario_socioeconomico_2023.sql b/models/br_inep_enem/br_inep_enem__questionario_socioeconomico_2023.sql new file mode 100644 index 00000000..6f39c875 --- /dev/null +++ b/models/br_inep_enem/br_inep_enem__questionario_socioeconomico_2023.sql @@ -0,0 +1,30 @@ +{{ config(alias="questionario_socioeconomico_2023", schema="br_inep_enem") }} + +select + safe_cast(id_inscricao as string) id_inscricao, + safe_cast(q001 as string) q001, + safe_cast(q002 as string) q002, + safe_cast(q003 as string) q003, + safe_cast(q004 as string) q004, + safe_cast(q005 as string) q005, + safe_cast(q006 as string) q006, + safe_cast(q007 as string) q007, + safe_cast(q008 as string) q008, + safe_cast(q009 as string) q009, + safe_cast(q010 as string) q010, + safe_cast(q011 as string) q011, + safe_cast(q012 as string) q012, + safe_cast(q013 as string) q013, + safe_cast(q014 as string) q014, + safe_cast(q015 as string) q015, + safe_cast(q016 as string) q016, + safe_cast(q017 as string) q017, + safe_cast(q018 as string) q018, + safe_cast(q019 as string) q019, + safe_cast(q020 as string) q020, + safe_cast(q021 as string) q021, + safe_cast(q022 as string) q022, + safe_cast(q023 as string) q023, + safe_cast(q024 as string) q024, + safe_cast(q025 as string) q025 +from `basedosdados-dev.br_inep_enem_staging.questionario_socioeconomico_2023` as t diff --git a/models/br_inep_enem/code/microdados.py b/models/br_inep_enem/code/microdados.py new file mode 100644 index 00000000..8f975ffe --- /dev/null +++ b/models/br_inep_enem/code/microdados.py @@ -0,0 +1,308 @@ +import pandas as pd +import numpy as np +import os +from io import StringIO +import requests +import gc +import warnings +import re +from datetime import datetime +from os import getenv, walk +from os.path import join +from pathlib import Path +from typing import Any, Dict, List, Optional, Tuple, Union +from uuid import uuid4 +import zipfile +import basedosdados as bd + +import numpy as np +import pandas as pd +warnings.filterwarnings("ignore") + + +def to_partitions( + data: pd.DataFrame, + partition_columns: List[str], + savepath: str, + file_type: str = "csv", +): + """Save data in to hive patitions schema, given a dataframe and a list of partition columns. + Args: + data (pandas.core.frame.DataFrame): Dataframe to be partitioned. + partition_columns (list): List of columns to be used as partitions. + savepath (str, pathlib.PosixPath): folder path to save the partitions. + file_type (str): default to csv. Accepts parquet. + Exemple: + data = { + "ano": [2020, 2021, 2020, 2021, 2020, 2021, 2021,2025], + "mes": [1, 2, 3, 4, 5, 6, 6,9], + "sigla_uf": ["SP", "SP", "RJ", "RJ", "PR", "PR", "PR","PR"], + "dado": ["a", "b", "c", "d", "e", "f", "g",'h'], + } + to_partitions( + data=pd.DataFrame(data), + partition_columns=['ano','mes','sigla_uf'], + savepath='partitions/', + ) + """ + + if isinstance(data, (pd.core.frame.DataFrame)): + savepath = Path(savepath) + # create unique combinations between partition columns + unique_combinations = ( + data[partition_columns] + # .astype(str) + .drop_duplicates(subset=partition_columns).to_dict(orient="records") + ) + + for filter_combination in unique_combinations: + patitions_values = [ + f"{partition}={value}" + for partition, value in filter_combination.items() + ] + + # get filtered data + df_filter = data.loc[ + data[filter_combination.keys()] + .isin(filter_combination.values()) + .all(axis=1), + :, + ] + df_filter = df_filter.drop(columns=partition_columns) + + # create folder tree + filter_save_path = Path(savepath / "/".join(patitions_values)) + filter_save_path.mkdir(parents=True, exist_ok=True) + + if file_type == "csv": + # append data to csv + file_filter_save_path = Path(filter_save_path) / "data.csv" + df_filter.to_csv( + file_filter_save_path, + sep=",", + encoding="utf-8", + na_rep="", + index=False, + mode="a", + header=not file_filter_save_path.exists(), + ) + elif file_type == "parquet": + # append data to parquet + file_filter_save_path = Path(filter_save_path) / "data.parquet" + df_filter.to_parquet( + file_filter_save_path, index=False, compression="gzip" + ) + else: + raise BaseException("Data need to be a pandas DataFrame") + + +valor = 0 +def read_csv_enem(): + global valor + for df in pd.read_csv( + "/home/tricktx/dados/br_inep_enem/Microdados ENEM 2023/DADOS/MICRODADOS_ENEM_2023.csv", + sep=";", + encoding="latin1", + chunksize=100000): + valor = valor + 1 + print(valor) + RENAME = { + "NU_INSCRICAO": "id_inscricao", + "NU_ANO": "ano", + "TP_FAIXA_ETARIA": "faixa_etaria", + "TP_SEXO": "sexo", + "TP_ESTADO_CIVIL": "estado_civil", + "TP_COR_RACA": "cor_raca", + "TP_NACIONALIDADE": "nacionalidade", + "TP_ST_CONCLUSAO": "situacao_conclusao", + "TP_ANO_CONCLUIU": "ano_conclusao", + "TP_ESCOLA": "tipo_escola", + "TP_ENSINO": "ensino", + "IN_TREINEIRO": "indicador_treineiro", + "CO_MUNICIPIO_ESC": "id_municipio_escola", + "SG_UF_ESC": "sigla_uf_escola", + "TP_DEPENDENCIA_ADM_ESC": "dependencia_administrativa_escola", + "TP_LOCALIZACAO_ESC": "localizacao_escola", + "TP_SIT_FUNC_ESC": "situacao_funcionamento_escola", + "CO_MUNICIPIO_PROVA": "id_municipio_prova", + "SG_UF_PROVA": "sigla_uf_prova", + "TP_PRESENCA_CN": "presenca_ciencias_natureza", + "TP_PRESENCA_CH": "presenca_ciencias_humanas", + "TP_PRESENCA_LC": "presenca_linguagens_codigos", + "TP_PRESENCA_MT": "presenca_matematica", + "CO_PROVA_CN": "tipo_prova_ciencias_natureza", + "CO_PROVA_CH": "tipo_prova_ciencias_humanas", + "CO_PROVA_LC": "tipo_prova_linguagens_codigos", + "CO_PROVA_MT": "tipo_prova_matematica", + "NU_NOTA_CN": "nota_ciencias_natureza", + "NU_NOTA_CH": "nota_ciencias_humanas", + "NU_NOTA_LC": "nota_linguagens_codigos", + "NU_NOTA_MT": "nota_matematica", + "TX_RESPOSTAS_CN": "respostas_ciencias_natureza", + "TX_RESPOSTAS_CH": "respostas_ciencias_humanas", + "TX_RESPOSTAS_LC": "respostas_linguagens_codigos", + "TX_RESPOSTAS_MT": "respostas_matematica", + "TX_GABARITO_CN": "gabarito_ciencias_natureza", + "TX_GABARITO_CH": "gabarito_ciencias_humanas", + "TX_GABARITO_LC": "gabarito_linguagens_codigos", + "TX_GABARITO_MT": "gabarito_matematica", + "TP_LINGUA": "lingua_estrangeira", + "TP_STATUS_REDACAO": "presenca_redacao", + "NU_NOTA_COMP1": "nota_redacao_competencia_1", + "NU_NOTA_COMP2": "nota_redacao_competencia_2", + "NU_NOTA_COMP3": "nota_redacao_competencia_3", + "NU_NOTA_COMP4": "nota_redacao_competencia_4", + "NU_NOTA_COMP5": "nota_redacao_competencia_5", + "NU_NOTA_REDACAO": "nota_redacao", + } + df.rename(columns=RENAME, inplace=True) + + lista = [ + "id_inscricao", + "ano", + "faixa_etaria", + "sexo", + "id_municipio_residencia", + "sigla_uf_residencia", + "estado_civil", + "cor_raca", + "nacionalidade", + "situacao_conclusao", + "ano_conclusao", + "tipo_escola", + "ensino", + "indicador_treineiro", + "id_municipio_escola", + "sigla_uf_escola", + "dependencia_administrativa_escola", + "localizacao_escola", + "situacao_funcionamento_escola", + "indicador_certificado", + "nome_certificadora", + "sigla_uf_certificadora", + "id_municipio_prova", + "sigla_uf_prova", + "presenca_objetiva", + "tipo_prova_objetiva", + "nota_objetiva_competencia_1", + "nota_objetiva_competencia_2", + "nota_objetiva_competencia_3", + "nota_objetiva_competencia_4", + "nota_objetiva_competencia_5", + "nota_objetiva", + "respostas_objetiva", + "gabarito_objetiva", + "presenca_ciencias_natureza", + "presenca_ciencias_humanas", + "presenca_linguagens_codigos", + "presenca_matematica", + "tipo_prova_ciencias_natureza", + "tipo_prova_ciencias_humanas", + "tipo_prova_linguagens_codigos", + "tipo_prova_matematica", + "nota_ciencias_natureza", + "nota_ciencias_humanas", + "nota_linguagens_codigos", + "nota_matematica", + "respostas_ciencias_natureza", + "respostas_ciencias_humanas", + "respostas_linguagens_codigos", + "respostas_matematica", + "gabarito_ciencias_natureza", + "gabarito_ciencias_humanas", + "gabarito_linguagens_codigos", + "gabarito_matematica", + "lingua_estrangeira", + "presenca_redacao", + "nota_redacao_competencia_1", + "nota_redacao_competencia_2", + "nota_redacao_competencia_3", + "nota_redacao_competencia_4", + "nota_redacao_competencia_5", + "nota_redacao", + "indicador_questionario_socioeconomico", + ] + for col in lista: + if col not in df_lista.columns: + df_lista[col] = str(np.nan) + + for x in df_lista.columns: + df_lista[x] = df_lista[x].apply( + lambda x: str(x).replace(".0", "").replace("nan", "") + ) + + df_lista = df_lista[ + [ + "ano", + "id_inscricao", + "faixa_etaria", + "sexo", + "id_municipio_residencia", + "sigla_uf_residencia", + "estado_civil", + "cor_raca", + "nacionalidade", + "situacao_conclusao", + "ano_conclusao", + "tipo_escola", + "ensino", + "indicador_treineiro", + "id_municipio_escola", + "sigla_uf_escola", + "dependencia_administrativa_escola", + "localizacao_escola", + "situacao_funcionamento_escola", + "indicador_certificado", + "nome_certificadora", + "sigla_uf_certificadora", + "id_municipio_prova", + "sigla_uf_prova", + "presenca_objetiva", + "tipo_prova_objetiva", + "nota_objetiva_competencia_1", + "nota_objetiva_competencia_2", + "nota_objetiva_competencia_3", + "nota_objetiva_competencia_4", + "nota_objetiva_competencia_5", + "nota_objetiva", + "respostas_objetiva", + "gabarito_objetiva", + "presenca_ciencias_natureza", + "presenca_ciencias_humanas", + "presenca_linguagens_codigos", + "presenca_matematica", + "tipo_prova_ciencias_natureza", + "tipo_prova_ciencias_humanas", + "tipo_prova_linguagens_codigos", + "tipo_prova_matematica", + "nota_ciencias_natureza", + "nota_ciencias_humanas", + "nota_linguagens_codigos", + "nota_matematica", + "respostas_ciencias_natureza", + "respostas_ciencias_humanas", + "respostas_linguagens_codigos", + "respostas_matematica", + "gabarito_ciencias_natureza", + "gabarito_ciencias_humanas", + "gabarito_linguagens_codigos", + "gabarito_matematica", + "lingua_estrangeira", + "presenca_redacao", + "nota_redacao_competencia_1", + "nota_redacao_competencia_2", + "nota_redacao_competencia_3", + "nota_redacao_competencia_4", + "nota_redacao_competencia_5", + "nota_redacao", + "indicador_questionario_socioeconomico", + ] + ] + + to_partitions( + data=df_lista, + partition_columns=["ano"], + savepath="/home/tricktx/dados/br_inep_enem/main/", + file_type="csv") + +read_csv_enem() diff --git a/models/br_inep_enem/code/questionario_socioeconomico.py b/models/br_inep_enem/code/questionario_socioeconomico.py new file mode 100644 index 00000000..f8693932 --- /dev/null +++ b/models/br_inep_enem/code/questionario_socioeconomico.py @@ -0,0 +1,62 @@ +import pandas as pd +import numpy as np +import os +import requests +import gc +import warnings +from io import StringIO + +warnings.filterwarnings("ignore") + +def read_csv_enem_questionario(): + valor = 0 + for df in pd.read_csv( + "/home/tricktx/dados/br_inep_enem/Microdados ENEM 2023/DADOS/MICRODADOS_ENEM_2023.csv", + sep=";", + encoding="latin1", + chunksize=100000, + ): + valor = valor + 1 + print(valor) + df = df[ + [ + "NU_INSCRICAO", + "Q001", + "Q002", + "Q003", + "Q004", + "Q005", + "Q006", + "Q007", + "Q008", + "Q009", + "Q010", + "Q011", + "Q012", + "Q013", + "Q014", + "Q015", + "Q016", + "Q017", + "Q018", + "Q019", + "Q020", + "Q021", + "Q022", + "Q023", + "Q024", + "Q025", + ] + ] + df.rename(columns={"NU_INSCRICAO": "id_inscricao"}, inplace=True) + + path = "/home/tricktx/dados/br_inep_enem/output/questionario/" + + if not os.path.exists(path): + os.makedirs(path) + df.to_csv(os.path.join(path, "questionario_socioeconomico_2023.csv"), index=False, mode="a", header=True) + + elif os.path.exists(path): + df.to_csv(os.path.join(path, "questionario_socioeconomico_2023.csv"), index=False, mode="a", header=False) + +read_csv_enem_questionario() diff --git a/models/br_inep_enem/schema.yml b/models/br_inep_enem/schema.yml index a03233ae..1bae1a83 100644 --- a/models/br_inep_enem/schema.yml +++ b/models/br_inep_enem/schema.yml @@ -1,5 +1,4 @@ --- -version: 2 models: - name: br_inep_enem__dicionario description: Dicionário para tradução dos códigos do conjunto br_inep_enem. Para @@ -25,3 +24,334 @@ models: description: Cobertura Temporal - name: valor description: Valor + - name: br_inep_enem__microdados + description: Microdados de notas do ENEM + tests: + - dbt_utils.unique_combination_of_columns: + combination_of_columns: [id_inscricao, ano] + - custom_dictionary_coverage: + columns_covered_by_dictionary: + - faixa_etaria + - sexo + - estado_civil + - cor_raca + - nacionalidade + - situacao_conclusao + - tipo_escola + - ensino + - dependencia_administrativa_escola + - localizacao_escola + - situacao_funcionamento_escola + - presenca_objetiva + - tipo_prova_objetiva + - presenca_ciencias_natureza + - presenca_ciencias_humanas + - presenca_linguagens_codigos + - presenca_matematica + - tipo_prova_ciencias_natureza + - tipo_prova_ciencias_humanas + - tipo_prova_linguagens_codigos + - tipo_prova_matematica + - lingua_estrangeira + - presenca_redacao + dictionary_model: ref('br_inep_enem__dicionario') + columns: + - name: id_inscricao + description: Número de inscrição no ENEM + - name: ano + description: Ano + tests: + - relationships: + to: ref('br_bd_diretorios_data_tempo__ano') + field: ano.ano + - name: faixa_etaria + description: Faixa etária + - name: sexo + description: Sexo + - name: id_municipio_residencia + description: ID Município da residência - IBGE 7 Dígitos + tests: + - custom_relationships: + to: ref('br_bd_diretorios_brasil__municipio') + field: id_municipio + ignore_values: + - '5200' + - '3208' + - '35507' + - '50308' + - '4557' + - '14902' + - '9502' + - '24808' + - '14407' + - '6200' + - '5108' + - '48708' + - '5109' + - '18105' + - '3403' + - '22505' + - '13705' + - '43402' + - '27408' + - '1108' + - '36504' + - '13700' + - '2105' + - '102' + - '2405' + - '0' + - '16602' + - '8201' + - '108' + - '12906' + - '11606' + - name: sigla_uf_residencia + description: Sigla da unidade da federação da residência + tests: + - relationships: + to: ref('br_bd_diretorios_brasil__uf') + field: sigla + - name: estado_civil + description: Estado civil + - name: cor_raca + description: Cor ou raça + - name: nacionalidade + description: Nacionalidade + - name: situacao_conclusao + description: Situação em relação ao ensino médio + - name: ano_conclusao + description: Ano de conclusão do ensino médio + - name: tipo_escola + description: Tipo de escola do ensino médio + - name: ensino + description: Tipo de instituição onde o estudante concluiu ou concluirá o + ensino médio + - name: indicador_treineiro + description: Indica se o inscrito fez a prova com intuito de apenas treinar + seus conhecimentos + - name: id_municipio_escola + description: ID Município da escola em que estudou - IBGE 7 Dígitos + tests: + - relationships: + to: ref('br_bd_diretorios_brasil__municipio') + field: id_municipio + - name: sigla_uf_escola + description: Sigla da unidade da federação da escola em que estudou + tests: + - relationships: + to: ref('br_bd_diretorios_brasil__uf') + field: sigla + - name: dependencia_administrativa_escola + description: Dependência administrativa da escola em que estudou + - name: localizacao_escola + description: Localização/zona da escola em que estudou + - name: situacao_funcionamento_escola + description: Situação de funcionamento da escola em que estudou + - name: indicador_certificado + description: Inscrito solicitará certificação no ensino médio + - name: nome_certificadora + description: Nome da entidade certificadora + - name: sigla_uf_certificadora + description: Sigla da unidade da federação da entidade certificadora + tests: + - relationships: + to: ref('br_bd_diretorios_brasil__uf') + field: sigla + - name: id_municipio_prova + description: ID Município da cidade da prova - IBGE 7 Dígitos + tests: + - relationships: + to: ref('br_bd_diretorios_brasil__municipio') + field: id_municipio + - name: sigla_uf_prova + description: Sigla da unidade da federação da prova + tests: + - relationships: + to: ref('br_bd_diretorios_brasil__uf') + field: sigla + - name: presenca_objetiva + description: Presença a prova objetiva + - name: tipo_prova_objetiva + description: Tipo de prova + - name: nota_objetiva_competencia_1 + description: Nota da competência 1 + - name: nota_objetiva_competencia_2 + description: Nota da competência 2 + - name: nota_objetiva_competencia_3 + description: Nota da competência 3 + - name: nota_objetiva_competencia_4 + description: Nota da competência 4 + - name: nota_objetiva_competencia_5 + description: Nota da competência 5 + - name: nota_objetiva + description: Nota da prova objetiva + - name: respostas_objetiva + description: Vetor com as respostas da parte objetiva da prova + - name: gabarito_objetiva + description: Vetor com o gabarito da parte objetiva da prova + - name: presenca_ciencias_natureza + description: Presença à prova objetiva de Ciências da Natureza + - name: presenca_ciencias_humanas + description: Presença à prova objetiva de Ciências Humanas + - name: presenca_linguagens_codigos + description: Presença à prova objetiva de Linguagens e Códigos + - name: presenca_matematica + description: Presença à prova objetiva de Matemática + - name: tipo_prova_ciencias_natureza + description: Código do tipo de prova de Ciências da Natureza + - name: tipo_prova_ciencias_humanas + description: Código do tipo de prova de Ciências Humanas + - name: tipo_prova_linguagens_codigos + description: Código do tipo de prova de Linguagens e Códigos + - name: tipo_prova_matematica + description: Código do tipo de prova de Matemática + - name: nota_ciencias_natureza + description: Nota da prova de Ciências da Natureza + - name: nota_ciencias_humanas + description: Nota da prova de Ciências Humanas + - name: nota_linguagens_codigos + description: Nota da prova de Linguagens e Códigos + - name: nota_matematica + description: Nota da prova de Matemática + - name: respostas_ciencias_natureza + description: Vetor com as respostas da parte objetiva da prova de Ciências + da Natureza + - name: respostas_ciencias_humanas + description: Vetor com as respostas da parte objetiva da prova de Ciências + Humanas + - name: respostas_linguagens_codigos + description: Vetor com as respostas da parte objetiva da prova de Linguagens + e Códigos + - name: respostas_matematica + description: Vetor com as respostas da parte objetiva da prova de Matemática + - name: gabarito_ciencias_natureza + description: 'Vetor com o gabarito da parte objetiva da prova de Ciências + da Natureza (Obs.: as 45 primeiras posições deste campo são referentes ao + respectivo gabarito)' + - name: gabarito_ciencias_humanas + description: 'Vetor com o gabarito da parte objetiva da prova de Ciências + Humanas (Obs.: as 45 primeiras posições deste campo são referentes ao respectivo + gabarito)' + - name: gabarito_linguagens_codigos + description: 'Vetor com o gabarito da parte objetiva da prova de Linguagens + e Códigos (Obs.: as 45 primeiras posições deste campo são referentes ao + respectivo gabarito)' + - name: gabarito_matematica + description: 'Vetor com o gabarito da parte objetiva da prova de Matemática + (Obs.: as 45 primeiras posições deste campo são referentes ao respectivo + gabarito)' + - name: lingua_estrangeira + description: Língua Estrangeira + - name: presenca_redacao + description: Presença à redação + - name: nota_redacao_competencia_1 + description: Nota da competência 1 + - name: nota_redacao_competencia_2 + description: Nota da competência 2 + - name: nota_redacao_competencia_3 + description: Nota da competência 3 + - name: nota_redacao_competencia_4 + description: Nota da competência 4 + - name: nota_redacao_competencia_5 + description: Nota da competência 5 + - name: nota_redacao + description: Nota da prova de redação + - name: indicador_questionario_socioeconomico + description: Respondeu o Questionário Socioeconômico + - name: br_inep_enem__questionario_socioeconomico_2023 + description: Respostas do questionário socioeconômico de 2023. + tests: + - dbt_utils.unique_combination_of_columns: + combination_of_columns: [id_inscricao] + - custom_dictionary_coverage: + columns_covered_by_dictionary: + - Q001 + - Q002 + - Q003 + - Q004 + - Q005 + - Q006 + - Q007 + - Q008 + - Q009 + - Q010 + - Q011 + - Q012 + - Q013 + - Q014 + - Q015 + - Q016 + - Q017 + - Q018 + - Q019 + - Q020 + - Q021 + - Q022 + - Q023 + - Q024 + - Q025 + dictionary_model: ref('br_inep_enem__dicionario') + columns: + - name: id_inscricao + description: Número de inscrição no ENEM + - name: Q001 + description: Até que série seu pai, ou o homem responsável por você, estudou? + - name: Q002 + description: Até que série sua mãe, ou a mulher responsável por você, estudou? + - name: Q003 + description: A partir da apresentação de algumas ocupações divididas em grupos + ordenados, indique o grupo que contempla a ocupação mais próxima da ocupação + do seu pai ou do homem responsável por você. (Se ele não estiver trabalhando, + escolha uma ocupação pensando no último trabalho dele). + - name: Q004 + description: A partir da apresentação de algumas ocupações divididas em grupos + ordenados, indique o grupo que contempla a ocupação mais próxima da ocupação + da sua mãe ou da mulher responsável por você. (Se ela não estiver trabalhando, + escolha uma ocupação pensando no último trabalho dela). + - name: Q005 + description: Incluindo você, quantas pessoas moram atualmente em sua residência? + - name: Q006 + description: Qual é a renda mensal de sua família? (Some a sua renda com a + dos seus familiares.) + - name: Q007 + description: Em sua residência trabalha empregado(a) doméstico(a)? + - name: Q008 + description: Na sua residência tem banheiro? + - name: Q009 + description: Na sua residência tem quartos para dormir? + - name: Q010 + description: Na sua residência tem carro? + - name: Q011 + description: Na sua residência tem motocicleta? + - name: Q012 + description: Na sua residência tem geladeira? + - name: Q013 + description: Na sua residência tem freezer (independente ou segunda porta + da geladeira)? + - name: Q014 + description: Na sua residência tem máquina de lavar roupa? (o tanquinho NÃO + deve ser considerado) + - name: Q015 + description: Na sua residência tem máquina de secar roupa (independente ou + em conjunto com a máquina de lavar roupa)? + - name: Q016 + description: Na sua residência tem forno micro-ondas? + - name: Q017 + description: Na sua residência tem máquina de lavar louça? + - name: Q018 + description: Na sua residência tem aspirador de pó? + - name: Q019 + description: Na sua residência tem televisão em cores? + - name: Q020 + description: Na sua residência tem aparelho de DVD? + - name: Q021 + description: Na sua residência tem TV por assinatura? + - name: Q022 + description: Na sua residência tem telefone celular? + - name: Q023 + description: Na sua residência tem telefone fixo? + - name: Q024 + description: Na sua residência tem computador? + - name: Q025 + description: Na sua residência tem acesso à Internet? From 19ce93ef7aa5ea4b63738d267e4216d6f03a456d Mon Sep 17 00:00:00 2001 From: tricktx Date: Wed, 6 Nov 2024 19:44:48 -0300 Subject: [PATCH 2/3] Q to q --- models/br_inep_enem/schema.yml | 100 ++++++++++++++++----------------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/models/br_inep_enem/schema.yml b/models/br_inep_enem/schema.yml index 1bae1a83..b60b28fb 100644 --- a/models/br_inep_enem/schema.yml +++ b/models/br_inep_enem/schema.yml @@ -266,92 +266,92 @@ models: combination_of_columns: [id_inscricao] - custom_dictionary_coverage: columns_covered_by_dictionary: - - Q001 - - Q002 - - Q003 - - Q004 - - Q005 - - Q006 - - Q007 - - Q008 - - Q009 - - Q010 - - Q011 - - Q012 - - Q013 - - Q014 - - Q015 - - Q016 - - Q017 - - Q018 - - Q019 - - Q020 - - Q021 - - Q022 - - Q023 - - Q024 - - Q025 + - q001 + - q002 + - q003 + - q004 + - q005 + - q006 + - q007 + - q008 + - q009 + - q010 + - q011 + - q012 + - q013 + - q014 + - q015 + - q016 + - q017 + - q018 + - q019 + - q020 + - q021 + - q022 + - q023 + - q024 + - q025 dictionary_model: ref('br_inep_enem__dicionario') columns: - name: id_inscricao description: Número de inscrição no ENEM - - name: Q001 + - name: q001 description: Até que série seu pai, ou o homem responsável por você, estudou? - - name: Q002 + - name: q002 description: Até que série sua mãe, ou a mulher responsável por você, estudou? - - name: Q003 + - name: q003 description: A partir da apresentação de algumas ocupações divididas em grupos ordenados, indique o grupo que contempla a ocupação mais próxima da ocupação do seu pai ou do homem responsável por você. (Se ele não estiver trabalhando, escolha uma ocupação pensando no último trabalho dele). - - name: Q004 + - name: q004 description: A partir da apresentação de algumas ocupações divididas em grupos ordenados, indique o grupo que contempla a ocupação mais próxima da ocupação da sua mãe ou da mulher responsável por você. (Se ela não estiver trabalhando, escolha uma ocupação pensando no último trabalho dela). - - name: Q005 + - name: q005 description: Incluindo você, quantas pessoas moram atualmente em sua residência? - - name: Q006 + - name: q006 description: Qual é a renda mensal de sua família? (Some a sua renda com a dos seus familiares.) - - name: Q007 + - name: q007 description: Em sua residência trabalha empregado(a) doméstico(a)? - - name: Q008 + - name: q008 description: Na sua residência tem banheiro? - - name: Q009 + - name: q009 description: Na sua residência tem quartos para dormir? - - name: Q010 + - name: q010 description: Na sua residência tem carro? - - name: Q011 + - name: q011 description: Na sua residência tem motocicleta? - - name: Q012 + - name: q012 description: Na sua residência tem geladeira? - - name: Q013 + - name: q013 description: Na sua residência tem freezer (independente ou segunda porta da geladeira)? - - name: Q014 + - name: q014 description: Na sua residência tem máquina de lavar roupa? (o tanquinho NÃO deve ser considerado) - - name: Q015 + - name: q015 description: Na sua residência tem máquina de secar roupa (independente ou em conjunto com a máquina de lavar roupa)? - - name: Q016 + - name: q016 description: Na sua residência tem forno micro-ondas? - - name: Q017 + - name: q017 description: Na sua residência tem máquina de lavar louça? - - name: Q018 + - name: q018 description: Na sua residência tem aspirador de pó? - - name: Q019 + - name: q019 description: Na sua residência tem televisão em cores? - - name: Q020 + - name: q020 description: Na sua residência tem aparelho de DVD? - - name: Q021 + - name: q021 description: Na sua residência tem TV por assinatura? - - name: Q022 + - name: q022 description: Na sua residência tem telefone celular? - - name: Q023 + - name: q023 description: Na sua residência tem telefone fixo? - - name: Q024 + - name: q024 description: Na sua residência tem computador? - - name: Q025 + - name: q025 description: Na sua residência tem acesso à Internet? From 395fe6dbe822032c59353f5bb61d83527e5ef2f2 Mon Sep 17 00:00:00 2001 From: Luiz Eduardo Date: Thu, 7 Nov 2024 06:46:25 -0300 Subject: [PATCH 3/3] Adicionando novas tabelas br_rf_arrecadacao --- .../br_rf_arrecadacao__cnae.sql | 36 +++ .../br_rf_arrecadacao__ir_ipi.sql | 26 +++ .../br_rf_arrecadacao__itr.sql | 22 ++ .../br_rf_arrecadacao__natureza_juridica.sql | 47 ++++ .../br_rf_arrecadacao__uf.sql | 130 +++++------ models/br_rf_arrecadacao/code/clean_cnae.py | 50 ++++ .../br_rf_arrecadacao/code/clean_functions.py | 183 +++++++++++++++ models/br_rf_arrecadacao/code/clean_ir_ipi.py | 37 +++ models/br_rf_arrecadacao/code/clean_itr.py | 45 ++++ .../code/clean_natureza_juridica.py | 50 ++++ models/br_rf_arrecadacao/code/clean_uf.py | 73 ++++++ .../br_rf_arrecadacao/code/download_data.py | 36 ++- models/br_rf_arrecadacao/schema.yml | 220 ++++++++++++++++++ 13 files changed, 879 insertions(+), 76 deletions(-) create mode 100644 models/br_rf_arrecadacao/br_rf_arrecadacao__cnae.sql create mode 100644 models/br_rf_arrecadacao/br_rf_arrecadacao__ir_ipi.sql create mode 100644 models/br_rf_arrecadacao/br_rf_arrecadacao__itr.sql create mode 100644 models/br_rf_arrecadacao/br_rf_arrecadacao__natureza_juridica.sql create mode 100644 models/br_rf_arrecadacao/code/clean_cnae.py create mode 100644 models/br_rf_arrecadacao/code/clean_functions.py create mode 100644 models/br_rf_arrecadacao/code/clean_ir_ipi.py create mode 100644 models/br_rf_arrecadacao/code/clean_itr.py create mode 100644 models/br_rf_arrecadacao/code/clean_natureza_juridica.py create mode 100644 models/br_rf_arrecadacao/code/clean_uf.py diff --git a/models/br_rf_arrecadacao/br_rf_arrecadacao__cnae.sql b/models/br_rf_arrecadacao/br_rf_arrecadacao__cnae.sql new file mode 100644 index 00000000..b6f14265 --- /dev/null +++ b/models/br_rf_arrecadacao/br_rf_arrecadacao__cnae.sql @@ -0,0 +1,36 @@ +{{ + config( + schema="br_rf_arrecadacao", + alias="cnae", + materialized="table", + partition_by={ + "field": "ano", + "data_type": "int64", + "range": {"start": 2016, "end": 2024, "interval": 1}, + }, + cluster_by=["mes"], + ) +}} + +select + safe_cast(ano as int64) ano, + safe_cast(mes as int64) mes, + safe_cast(secao_sigla as string) secao_sigla, + safe_cast(imposto_importacao as float64) imposto_importacao, + safe_cast(imposto_exportacao as float64) imposto_exportacao, + safe_cast(ipi as float64) ipi, + safe_cast(irpf as float64) irpf, + safe_cast(irpj as float64) irpj, + safe_cast(irrf as float64) irrf, + safe_cast(iof as float64) iof, + safe_cast(itr as float64) itr, + safe_cast(cofins as float64) cofins, + safe_cast(pis_pasep as float64) pis_pasep, + safe_cast(csll as float64) csll, + safe_cast(cide_combustiveis as float64) cide_combustiveis, + safe_cast(contribuicao_previdenciaria as float64) contribuicao_previdenciaria, + safe_cast(cpsss as float64) cpsss, + safe_cast(pagamento_unificado as float64) pagamento_unificado, + safe_cast(outras_receitas_rfb as float64) outras_receitas_rfb, + safe_cast(demais_receitas as float64) demais_receitas, +from `basedosdados-dev.br_rf_arrecadacao_staging.cnae` as t diff --git a/models/br_rf_arrecadacao/br_rf_arrecadacao__ir_ipi.sql b/models/br_rf_arrecadacao/br_rf_arrecadacao__ir_ipi.sql new file mode 100644 index 00000000..3982c853 --- /dev/null +++ b/models/br_rf_arrecadacao/br_rf_arrecadacao__ir_ipi.sql @@ -0,0 +1,26 @@ +{{ + config( + schema="br_rf_arrecadacao", + alias="ir_ipi", + materialized="table", + partition_by={ + "field": "ano", + "data_type": "int64", + "range": {"start": 2019, "end": 2024, "interval": 1}, + }, + cluster_by=["mes"], + ) +}} + +select + safe_cast(ano as int64) ano, + safe_cast(mes as int64) mes, + safe_cast(tributo as string) tributo, + safe_cast(decendio as string) decendio, + safe_cast(arrecadacao_bruta as float64) arrecadacao_bruta, + safe_cast(retificacao as float64) retificacao, + safe_cast(compensacao as float64) compensacao, + safe_cast(restituicao as float64) restituicao, + safe_cast(outros as float64) outros, + safe_cast(arrecadacao_liquida as float64) arrecadacao_liquida, +from `basedosdados-dev.br_rf_arrecadacao_staging.ir_ipi` as t diff --git a/models/br_rf_arrecadacao/br_rf_arrecadacao__itr.sql b/models/br_rf_arrecadacao/br_rf_arrecadacao__itr.sql new file mode 100644 index 00000000..e52f5758 --- /dev/null +++ b/models/br_rf_arrecadacao/br_rf_arrecadacao__itr.sql @@ -0,0 +1,22 @@ +{{ + config( + schema="br_rf_arrecadacao", + alias="itr", + materialized="table", + partition_by={ + "field": "ano", + "data_type": "int64", + "range": {"start": 2017, "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(sigla_regiao as string) sigla_regiao, + safe_cast(cidade as string) cidade, + safe_cast(valor_arrecadado as float64) valor_arrecadado, +from `basedosdados-dev.br_rf_arrecadacao_staging.itr` as t diff --git a/models/br_rf_arrecadacao/br_rf_arrecadacao__natureza_juridica.sql b/models/br_rf_arrecadacao/br_rf_arrecadacao__natureza_juridica.sql new file mode 100644 index 00000000..22f4b1be --- /dev/null +++ b/models/br_rf_arrecadacao/br_rf_arrecadacao__natureza_juridica.sql @@ -0,0 +1,47 @@ +{{ + config( + schema="br_rf_arrecadacao", + alias="natureza_juridica", + materialized="table", + partition_by={ + "field": "ano", + "data_type": "int64", + "range": {"start": 2016, "end": 2024, "interval": 1}, + }, + cluster_by=["mes"], + ) +}} + +with + referencia_codigo as ( + select + id_natureza_juridica, + substr(cast(id_natureza_juridica as string), 0, 3) as inicio_codigo + from basedosdados - staging.br_bd_diretorios_brasil.natureza_juridica + ) +select + safe_cast(t.ano as int64) ano, + safe_cast(t.mes as int64) mes, + safe_cast( + referencia_codigo.id_natureza_juridica as string + ) natureza_juridica_codigo, + safe_cast(t.imposto_importacao as float64) imposto_importacao, + safe_cast(t.imposto_exportacao as float64) imposto_exportacao, + safe_cast(t.ipi as float64) ipi, + safe_cast(t.irpf as float64) irpf, + safe_cast(t.irpj as float64) irpj, + safe_cast(t.irrf as float64) irrf, + safe_cast(t.iof as float64) iof, + safe_cast(t.itr as float64) itr, + safe_cast(t.cofins as float64) cofins, + safe_cast(t.pis_pasep as float64) pis_pasep, + safe_cast(t.csll as float64) csll, + safe_cast(t.cide_combustiveis as float64) cide_combustiveis, + safe_cast(t.contribuicao_previdenciaria as float64) contribuicao_previdenciaria, + safe_cast(t.cpsss as float64) cpsss, + safe_cast(t.pagamento_unificado as float64) pagamento_unificado, + safe_cast(t.outras_receitas_rfb as float64) outras_receitas_rfb, + safe_cast(t.demais_receitas as float64) demais_receitas, +from `basedosdados-dev.br_rf_arrecadacao_staging.natureza_juridica` as t +inner join + referencia_codigo on t.natureza_juridica_codigo = referencia_codigo.inicio_codigo diff --git a/models/br_rf_arrecadacao/br_rf_arrecadacao__uf.sql b/models/br_rf_arrecadacao/br_rf_arrecadacao__uf.sql index 5a9e30af..39f86f7f 100644 --- a/models/br_rf_arrecadacao/br_rf_arrecadacao__uf.sql +++ b/models/br_rf_arrecadacao/br_rf_arrecadacao__uf.sql @@ -1,65 +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 +{{ + 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_cnae.py b/models/br_rf_arrecadacao/code/clean_cnae.py new file mode 100644 index 00000000..a3b98b20 --- /dev/null +++ b/models/br_rf_arrecadacao/code/clean_cnae.py @@ -0,0 +1,50 @@ +import os +import numpy as np +import pandas as pd +from clean_functions import * + +def rename_columns(df): + name_dict = { + 'Ano':'ano', + 'Mês':'mes', + 'Seção - Sigla':'secao_sigla', + 'Seção - Nome':'secao_nome', + 'II':'imposto_importacao', + 'IE':'imposto_exportacao', + 'IPI':'ipi', + 'IRPF':'irpf', + 'IRPJ':'irpj', + 'IRRF':'irrf', + 'IOF':'iof', + 'ITR':'itr', + 'Cofins':'cofins', + 'Pis/Pasep':'pis_pasep', + 'CSLL':'csll', + 'Cide': 'cide_combustiveis', + 'Contribuição Previdenciária':'contribuicao_previdenciaria', + 'CPSSS':'cpsss', + 'Pagamento Unificado':'pagamento_unificado', + 'Outras Receitas Administradas':'outras_receitas_rfb', + 'Receitas Não Administradas':'demais_receitas' + } + + return df.rename(columns=name_dict) + +def change_types(df): + df['ano'] = df['ano'].astype('int') + df['mes'] = get_month_number(df['mes']) + df['secao_nome'] = df['secao_nome'].str.title() + + #All remaining columns are monetary values + for col in df.columns[4:]: + df[col] = df[col].apply(replace_commas).apply(remove_dots).astype('float') + + return df + +if __name__ == '__main__': + df = read_data(file_dir='../input/arrecadacao-cnae.csv') + df = remove_empty_columns(df) + df = remove_empty_rows(df) + df = rename_columns(df) + df = change_types(df) + save_data(df=df,file_dir='../output/br_rf_arrecadacao_cnae',partition_cols=['ano','mes']) diff --git a/models/br_rf_arrecadacao/code/clean_functions.py b/models/br_rf_arrecadacao/code/clean_functions.py new file mode 100644 index 00000000..260da075 --- /dev/null +++ b/models/br_rf_arrecadacao/code/clean_functions.py @@ -0,0 +1,183 @@ +import os +import numpy as np +import pandas as pd +from typing import List +from pathlib import Path + +file_directory = os.path.dirname(__file__) + +def read_data(file_dir,separator=';'): + data_directory = os.path.join(file_directory, file_dir) + + return pd.read_csv(data_directory, sep=separator) + +def remove_empty_rows(df): + return df.dropna(axis=0, how='all') + +def remove_empty_columns(df): + return df.drop(list(df.filter(regex='Unnamed')), axis=1) + +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_lower = month_column.str.lower() + month_inits = month_lower.str[:3] + + month_numbers = { + 'jan': '1', + 'fev': '2', + 'mar': '3', + 'abr': '4', + 'mai': '5', + 'jun': '6', + 'jul': '7', + 'ago': '8', + 'set': '9', + 'out': '10', + 'nov': '11', + 'dez': '12' + } + return month_inits.replace(month_numbers).astype('int') + +def get_state_letters(state_column): + + state_lower = state_column.str.lower() + states = { + "acre": "AC", + "alagoas": "AL", + "amapá": "AP", + "amazonas": "AM", + "bahia": "BA", + "ceará": "CE", + "distrito federal": "DF", + "espírito santo": "ES", + "goiás": "GO", + "maranhão": "MA", + "mato grosso": "MT", + "mato grosso do sul": "MS", + "minas gerais": "MG", + "pará": "PA", + "paraíba": "PB", + "paraná": "PR", + "pernambuco": "PE", + "piauí": "PI", + "rio de janeiro": "RJ", + "rio grande do norte": "RN", + "rio grande do sul": "RS", + "rondônia": "RO", + "roraima": "RR", + "santa catarina": "SC", + "são paulo": "SP", + "sergipe": "SE", + "tocantins": "TO" + } + return state_lower.replace(states) + +def get_region_letters(region_names): + + region_lower = region_names.str.lower() + + regions = { + "norte" : "N", + "sul" : "S", + "centro-oeste" : "CO", + "sudeste" : "SE", + "nordeste" : "NE" + } + return region_lower.replace(regions) + +def to_partitions( + data: pd.DataFrame, + partition_columns: List[str], + savepath: str, + file_type: str = "csv", +): + """Save data in to hive patitions schema, given a dataframe and a list of partition columns. + Args: + data (pandas.core.frame.DataFrame): Dataframe to be partitioned. + partition_columns (list): List of columns to be used as partitions. + savepath (str, pathlib.PosixPath): folder path to save the partitions. + file_type (str): default to csv. Accepts parquet. + Exemple: + data = { + "ano": [2020, 2021, 2020, 2021, 2020, 2021, 2021,2025], + "mes": [1, 2, 3, 4, 5, 6, 6,9], + "sigla_uf": ["SP", "SP", "RJ", "RJ", "PR", "PR", "PR","PR"], + "dado": ["a", "b", "c", "d", "e", "f", "g",'h'], + } + to_partitions( + data=pd.DataFrame(data), + partition_columns=['ano','mes','sigla_uf'], + savepath='partitions/', + ) + """ + + if isinstance(data, (pd.core.frame.DataFrame)): + savepath = Path(savepath) + # create unique combinations between partition columns + unique_combinations = ( + data[partition_columns] + # .astype(str) + .drop_duplicates(subset=partition_columns).to_dict(orient="records") + ) + + for filter_combination in unique_combinations: + patitions_values = [ + f"{partition}={value}" + for partition, value in filter_combination.items() + ] + + # get filtered data + df_filter = data.loc[ + data[filter_combination.keys()] + .isin(filter_combination.values()) + .all(axis=1), + :, + ] + df_filter = df_filter.drop(columns=partition_columns) + + # create folder tree + filter_save_path = Path(savepath / "/".join(patitions_values)) + filter_save_path.mkdir(parents=True, exist_ok=True) + + if file_type == "csv": + # append data to csv + file_filter_save_path = Path(filter_save_path) / "data.csv" + df_filter.to_csv( + file_filter_save_path, + sep=",", + encoding="utf-8", + na_rep="", + index=False, + mode="a", + header=not file_filter_save_path.exists(), + ) + elif file_type == "parquet": + # append data to parquet + file_filter_save_path = Path(filter_save_path) / "data.parquet" + df_filter.to_parquet( + file_filter_save_path, index=False, compression="gzip" + ) + else: + raise BaseException("Data need to be a pandas DataFrame") + +def save_data(df,file_dir,partition_cols): + data_directory = os.path.join(file_directory,file_dir) + to_partitions(data=df,partition_columns=partition_cols,savepath=data_directory) diff --git a/models/br_rf_arrecadacao/code/clean_ir_ipi.py b/models/br_rf_arrecadacao/code/clean_ir_ipi.py new file mode 100644 index 00000000..af7f99b2 --- /dev/null +++ b/models/br_rf_arrecadacao/code/clean_ir_ipi.py @@ -0,0 +1,37 @@ +import os +import numpy as np +import pandas as pd +from clean_functions import * + +def rename_columns(df): + name_dict = { + 'Ano':'ano', + 'Mês':'mes', + 'Tributo':'tributo', + 'Decêndio':'decendio', + 'Arrecadação Bruta':'arrecadacao_bruta', + 'Retificação':'retificacao', + 'Compensação':'compensacao', + 'Restituição':'restituicao', + 'Outros':'outros', + 'Arrecadação Líquida':'arrecadacao_liquida' + } + + return df.rename(columns=name_dict) + +def change_types(df): + df['ano'] = df['ano'].astype('int') + df['mes'] = get_month_number(df['mes']) + + #All remaining columns are monetary values + for col in df.columns[4:]: + df[col] = df[col].apply(replace_commas).apply(remove_dots).astype('float') + + return df + +if __name__ == '__main__': + df = read_data(file_dir='../input/arrecadacao-ir-ipi.csv') + df = remove_empty_rows(df) + df = rename_columns(df) + df = change_types(df) + save_data(df=df,file_dir='../output/br_rf_arrecadacao_ir_ipi',partition_cols=['ano','mes']) diff --git a/models/br_rf_arrecadacao/code/clean_itr.py b/models/br_rf_arrecadacao/code/clean_itr.py new file mode 100644 index 00000000..3a83ea92 --- /dev/null +++ b/models/br_rf_arrecadacao/code/clean_itr.py @@ -0,0 +1,45 @@ +import os +import numpy as np +import pandas as pd +from clean_functions import * + +def rename_columns(df): + name_dict = { + 'Ano':'ano', + 'Mês':'mes', + 'Unidade da Federação':'nome_uf', + 'Região Política':'regiao_politica', + 'Cidade e UF':'cidade_uf', + 'Valor':'valor_arrecadado' + } + + return df.rename(columns=name_dict) + +def change_types(df): + df['ano'] = df['ano'].astype('int') + df['mes'] = get_month_number(df['mes']) + df['valor_arrecadado'] = df['valor_arrecadado'].apply(replace_commas).apply(remove_dots).astype('float') + + return df + +def format_state(df): + df['sigla_uf'] = get_state_letters(df['nome_uf']) + return df.drop('nome_uf',axis=1) + +def format_region(df): + df['sigla_regiao'] = get_region_letters(df['regiao_politica']) + return df.drop('regiao_politica',axis=1) + +def format_city(df): + df['cidade'] = df['cidade_uf'].str.split(' - ').str[0] + return df.drop('cidade_uf',axis=1) + +if __name__ == '__main__': + df = read_data(file_dir='../input/arrecadacao-itr.csv') + df = remove_empty_rows(df) + df = rename_columns(df) + df = change_types(df) + df = format_state(df) + df = format_region(df) + df = format_city(df) + save_data(df=df,file_dir='../output/br_rf_arrecadacao_itr',partition_cols=['ano','mes']) diff --git a/models/br_rf_arrecadacao/code/clean_natureza_juridica.py b/models/br_rf_arrecadacao/code/clean_natureza_juridica.py new file mode 100644 index 00000000..df9ce70d --- /dev/null +++ b/models/br_rf_arrecadacao/code/clean_natureza_juridica.py @@ -0,0 +1,50 @@ +import os +import numpy as np +import pandas as pd +from clean_functions import * + +def rename_columns(df): + name_dict = { + 'Ano':'ano', + 'Mês':'mes', + 'Natureza Jurídica - Código':'natureza_juridica_codigo', + 'Natureza Jurídica - Nome':'natureza_juridica_nome', + 'II':'imposto_importacao', + 'IE':'imposto_exportacao', + 'IPI':'ipi', + 'IRPF':'irpf', + 'IRPJ':'irpj', + 'IRRF':'irrf', + 'IOF':'iof', + 'ITR':'itr', + 'Cofins':'cofins', + 'Pis/Pasep':'pis_pasep', + 'CSLL':'csll', + 'Cide': 'cide_combustiveis', + 'Contribuição Previdenciária':'contribuicao_previdenciaria', + 'CPSSS':'cpsss', + 'Pagamento Unificado':'pagamento_unificado', + 'Outras Receitas Administradas':'outras_receitas_rfb', + 'Receitas Não Administradas':'demais_receitas' + } + + return df.rename(columns=name_dict) + +def change_types(df): + df['ano'] = df['ano'].astype('int') + df['mes'] = get_month_number(df['mes']) + df['natureza_juridica_nome'] = df['natureza_juridica_nome'].str.title() + + #All remaining columns are monetary values + for col in df.columns[4:]: + df[col] = df[col].apply(replace_commas).apply(remove_dots).astype('float') + + return df + +if __name__ == '__main__': + df = read_data(file_dir='../input/arrecadacao-natureza.csv') + df = remove_empty_rows(df) + df = remove_empty_columns(df) + df = rename_columns(df) + df = change_types(df) + save_data(df=df,file_dir='../output/br_rf_arrecadacao_natureza_juridica',partition_cols=['ano','mes']) diff --git a/models/br_rf_arrecadacao/code/clean_uf.py b/models/br_rf_arrecadacao/code/clean_uf.py new file mode 100644 index 00000000..97098652 --- /dev/null +++ b/models/br_rf_arrecadacao/code/clean_uf.py @@ -0,0 +1,73 @@ +import os +import numpy as np +import pandas as pd +from clean_functions import * + +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_entidades_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_entidades_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_rfb', + '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 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 + +if __name__ == '__main__': + df = read_data(file_dir='../input/arrecadacao-estado.csv') + df = remove_empty_rows(df) + df = rename_columns(df) + df = change_types(df) + save_data(df=df,file_dir='../output/br_rf_arrecadacao_uf',partition_cols=['ano','mes']) diff --git a/models/br_rf_arrecadacao/code/download_data.py b/models/br_rf_arrecadacao/code/download_data.py index 4735f6cb..0fca3a40 100644 --- a/models/br_rf_arrecadacao/code/download_data.py +++ b/models/br_rf_arrecadacao/code/download_data.py @@ -1,11 +1,25 @@ -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) +import requests +import gzip + +def download_data(url, file_path): + response = requests.get(url) + + with open(file_path, 'w') as file: + if response.headers['Content-Type'] == 'application/gzip': + content = str(gzip.decompress(response.content),'utf-8') + else: + content = response.content.decode('latin1') + file.write(content) + +if __name__ == "__main__": + + extractions = [ + {'url':'https://www.gov.br/receitafederal/dados/arrecadacao-estado.csv','file_path':'input/arrecadacao-estado.csv'}, #Tabela uf + {'url':'https://www.gov.br/receitafederal/dados/arrecadacao-cnae.csv','file_path':'input/arrecadacao-cnae.csv'}, #Tabela cnae + {'url':'https://www.gov.br/receitafederal/dados/arrecadacao-natureza.csv','file_path':'input/arrecadacao-natureza.csv'}, #Tabela natureza_juridica + {'url':'https://www.gov.br/receitafederal/dados/arrecadacao-ir-ipi.csv','file_path':'input/arrecadacao-ir-ipi.csv'}, #Tabela ir_ipi + {'url':'https://www.gov.br/receitafederal/dados/arrecadacao-itr.csv','file_path':'input/arrecadacao-itr.csv'}, #Tabela itr + ] + + for extract in extractions: + download_data(extract['url'], extract['file_path']) diff --git a/models/br_rf_arrecadacao/schema.yml b/models/br_rf_arrecadacao/schema.yml index 821c1cff..f9d55e16 100644 --- a/models/br_rf_arrecadacao/schema.yml +++ b/models/br_rf_arrecadacao/schema.yml @@ -262,3 +262,223 @@ models: tests: - dbt_utils.not_null_proportion: at_least: 0.50 + - name: br_rf_arrecadacao__cnae + description: Contém os dados de arrecadação bruta mensal realizadas em Documento + de Arrecadação de Receitas Federais (Darf), por tributo, efetuada pelos setores + econômicos, identificados pela seção, constantes da tabela de Classificação + Nacional de Atividades Econômicas(Cnae). + tests: + - dbt_utils.unique_combination_of_columns: + combination_of_columns: [ano, mes, secao_sigla] + - not_null_proportion_multiple_columns: + at_least: 0.35 + columns: + - name: ano + description: Ano de referência. + tests: + - relationships: + to: ref('br_bd_diretorios_data_tempo__ano') + field: ano.ano + - name: mes + description: Mês de referência. + tests: + - relationships: + to: ref('br_bd_diretorios_data_tempo__mes') + field: mes.mes + - name: secao_sigla + description: Código da Seção da atividade econômica constante da Cnae. + tests: + - custom_relationships: + to: ref('br_bd_diretorios_brasil__cnae_2') + field: secao + ignore_values: [IN, NI, PF] + - name: imposto_importacao + description: Imposto sobre a Importação. + - name: imposto_exportacao + description: Imposto sobre a Exportação. + - name: ipi + description: Imposto sobre Produtos Industrializados. + - name: irpf + description: Imposto sobre a Renda da Pessoa Física. + - name: irpj + description: Imposto sobre a Renda da Pessoa Jurídica. + - name: irrf + description: Imposto sobre a Renda Retido na Fonte. + - name: iof + description: Imposto sobre Operações Financeiras. + - name: itr + description: Imposto sobre a Propriedade Territorial Rural. + - name: cofins + description: Contribuição para o Financiamento da Seguridade Social. + - name: pis_pasep + description: Programa de Integração Social e o Programa de Formação do Patrimônio + do Servidor Público. + - name: csll + description: Contribuição Social sobre o Lucro Líquido. + - name: cide_combustiveis + description: Contribuição de Intervenção no Domínio Econômico aplicada à combustíveis. + - name: contribuicao_previdenciaria + description: Contribuição Previdenciária arrecadada em Darf. + - name: cpsss + description: Contribuição para o Plano de Seguridade Social do Servidor Público. + - name: pagamento_unificado + description: Pagamentos referentes a vários tributos feitos em um único documento + de arrecadação, como parcelamentos, retenções, Simples etc. + - name: outras_receitas_rfb + description: Outras receitas administradas pela RFB. + - name: demais_receitas + description: Outras receitas não administradas pela RFB. + - name: br_rf_arrecadacao__natureza_juridica + description: Contém os dados de arrecadação bruta mensal realizadas em Documento + de Arrecadação de Receitas Federais (Darf), por tributo, efetuada pelos diversos + tipos de Naturezas Jurídicas. + tests: + - dbt_utils.unique_combination_of_columns: + combination_of_columns: [ano, mes, natureza_juridica_codigo] + - not_null_proportion_multiple_columns: + at_least: 0.15 + columns: + - name: ano + description: Ano de referência. + tests: + - relationships: + to: ref('br_bd_diretorios_data_tempo__ano') + field: ano.ano + - name: mes + description: Mês de referência. + tests: + - relationships: + to: ref('br_bd_diretorios_data_tempo__mes') + field: mes.mes + - name: natureza_juridica_codigo + description: Código do tipo de Natureza Jurídica. + tests: + - relationships: + to: ref('br_bd_diretorios_brasil__natureza_juridica') + field: id_natureza_juridica + - name: imposto_importacao + description: Imposto sobre a Importação. + - name: imposto_exportacao + description: Imposto sobre a Exportação. + - name: ipi + description: Imposto sobre Produtos Industrializados. + - name: irpf + description: Imposto sobre a Renda da Pessoa Física. + - name: irpj + description: Imposto sobre a Renda da Pessoa Jurídica. + - name: irrf + description: Imposto sobre a Renda Retido na Fonte. + - name: iof + description: Imposto sobre Operações Financeiras. + - name: itr + description: Imposto sobre a Propriedade Territorial Rural. + - name: cofins + description: Contribuição para o Financiamento da Seguridade Social. + - name: pis_pasep + description: Programa de Integração Social e o Programa de Formação do Patrimônio + do Servidor Público. + - name: csll + description: Contribuição Social sobre o Lucro Líquido. + - name: cide_combustiveis + description: Contribuição de Intervenção no Domínio Econômico aplicada à combustíveis. + - name: contribuicao_previdenciaria + description: Contribuição Previdenciária arrecadada em Darf. + - name: cpsss + description: Contribuição para o Plano de Seguridade Social do Servidor Público. + - name: pagamento_unificado + description: Pagamentos referentes a vários tributos feitos em um único documento + de arrecadação, como parcelamentos, retenções, Simples etc. + - name: outras_receitas_rfb + description: Outras receitas administradas pela RFB. + - name: demais_receitas + description: Outras receitas não administradas pela RFB. + - name: br_rf_arrecadacao__ir_ipi + description: Contém os dados de arrecadação decendial do Imposto sobre a Renda + (IR) e do Imposto sobre Produtos Industrializados (IPI), discriminados por arrecadação + bruta, os respectivos eventos que afetam essa arrecadação bruta e a arrecadação + líquida, valor este último passível de repasse aos Fundos de Participação dos + Estados e do Municípios, FPM e FPE, de acordo com dispositivo constitucional. + tests: + - dbt_utils.unique_combination_of_columns: + combination_of_columns: [ano, mes, tributo, decendio] + - not_null_proportion_multiple_columns: + at_least: 0.95 + columns: + - name: ano + description: Ano de referência. + tests: + - relationships: + to: ref('br_bd_diretorios_data_tempo__ano') + field: ano.ano + - name: mes + description: Mês de referência. + tests: + - relationships: + to: ref('br_bd_diretorios_data_tempo__mes') + field: mes.mes + - name: tributo + description: Identificação de Tributo (IR ou IPI). + - name: decendio + description: Decêndio de referência. + - name: arrecadacao_bruta + description: Valor da arrecadação bruta dos tributos sem nenhum acréscimo + ou dedução. É a etapa inicial da arrecadação, quando há o pagamento efetuado + pelo contribuinte. + - name: retificacao + description: Valor do saldo das retificações efetuadas nos Documentos de Arrecadação + de Receitas Federais (Darf). São alterações feitas nos documentos de arrecadação + em função de erro de preenchimento. + - name: compensacao + description: Valor do saldo das compensações efetuadas. Utilização de valores + pagos anteriormente para quitação de débitos de outros tributos, distintos + de IR ou IPI, e vice-versa. + - name: restituicao + description: Valor do saldo das restituições efetuadas pela Receita Federal + em função de pagamentos feitos a maior ou indevidos. + - name: outros + description: Demais eventos que agem sobre o valor da arrecadação bruta. + - name: arrecadacao_liquida + description: Valor resultante da arrecadação bruta, depois da incidência dos + demais eventos de arrecadação. + - name: br_rf_arrecadacao__itr + description: Contém os dados de arrecadação líquida mensal do Imposto sobre a + Propriedade Territorial Rural (ITR), realizada pelas propriedades rurais, passível + de repasse aos próprios municípios onde se localizam essas propriedades rurais, + conforme a situação do município, conveniado ou não conveniado com a União para + fiscalizar e cobrar o ITR, de acordo com dispositivo constitucional. + tests: + - dbt_utils.unique_combination_of_columns: + combination_of_columns: [ano, mes, sigla_uf, sigla_regiao, cidade] + - not_null_proportion_multiple_columns: + at_least: 0.95 + columns: + - name: ano + description: Ano de referência. + tests: + - relationships: + to: ref('br_bd_diretorios_data_tempo__ano') + field: ano.ano + - name: mes + description: Mês de referência. + tests: + - relationships: + to: ref('br_bd_diretorios_data_tempo__mes') + field: mes.mes + - name: sigla_uf + description: Sigla da Unidade da Federação onde se localiza o município conveniado + ou não conveniado. + tests: + - relationships: + to: ref('br_bd_diretorios_brasil__uf') + field: sigla + - name: sigla_regiao + description: Sigla da Região Política onde se localiza o município conveniado + ou não conveniado. + tests: + - relationships: + to: ref('br_bd_diretorios_brasil__regiao') + field: sigla + - name: cidade + description: Nome do município conveniado ou não conveniado. + - name: valor_arrecadado + description: Valor arrecadado.