diff --git a/models/br_cnpq_bolsas/br_cnpq_bolsas__dicionario.sql b/models/br_cnpq_bolsas/br_cnpq_bolsas__dicionario.sql index 067940f9..095f05a8 100644 --- a/models/br_cnpq_bolsas/br_cnpq_bolsas__dicionario.sql +++ b/models/br_cnpq_bolsas/br_cnpq_bolsas__dicionario.sql @@ -1,4 +1,5 @@ {{ config(alias="dicionario", schema="br_cnpq_bolsas") }} +-- Dicionário de dados do CNPq Bolsas select safe_cast(id_tabela as string) id_tabela, safe_cast(nome_coluna as string) nome_coluna, diff --git a/models/br_inep_ana/br_inep_ana__dicionario.sql b/models/br_inep_ana/br_inep_ana__dicionario.sql index 3bc7cdfc..31ce7216 100644 --- a/models/br_inep_ana/br_inep_ana__dicionario.sql +++ b/models/br_inep_ana/br_inep_ana__dicionario.sql @@ -1,4 +1,5 @@ {{ config(alias="dicionario", schema="br_inep_ana") }} +-- Dicionário de dados da ANA select safe_cast(id_tabela as string) id_tabela, safe_cast(coluna as string) nome_coluna, diff --git a/models/br_inep_censo_escolar/br_inep_censo_escolar__dicionario.sql b/models/br_inep_censo_escolar/br_inep_censo_escolar__dicionario.sql index 13f4097f..fc367827 100644 --- a/models/br_inep_censo_escolar/br_inep_censo_escolar__dicionario.sql +++ b/models/br_inep_censo_escolar/br_inep_censo_escolar__dicionario.sql @@ -1,4 +1,5 @@ {{ config(alias="dicionario", schema="br_inep_censo_escolar") }} +-- Dicionário de dados do Censo Escolar select safe_cast(id_tabela as string) id_tabela, safe_cast(nome_coluna as string) nome_coluna, diff --git a/models/br_inep_indicador_nivel_socioeconomico/br_inep_indicador_nivel_socioeconomico__dicionario.sql b/models/br_inep_indicador_nivel_socioeconomico/br_inep_indicador_nivel_socioeconomico__dicionario.sql index f77102f4..b1938ccf 100644 --- a/models/br_inep_indicador_nivel_socioeconomico/br_inep_indicador_nivel_socioeconomico__dicionario.sql +++ b/models/br_inep_indicador_nivel_socioeconomico/br_inep_indicador_nivel_socioeconomico__dicionario.sql @@ -1,4 +1,5 @@ {{ config(alias="dicionario", schema="br_inep_indicador_nivel_socioeconomico") }} +-- Dicionário de dados do Indicador de Nível Socioeconômico select safe_cast(id_tabela as string) id_tabela, safe_cast(coluna as string) nome_coluna, diff --git a/models/br_me_sic/br_me_sic__dicionario.sql b/models/br_me_sic/br_me_sic__dicionario.sql deleted file mode 100644 index cdf60d1f..00000000 --- a/models/br_me_sic/br_me_sic__dicionario.sql +++ /dev/null @@ -1,8 +0,0 @@ -{{ config(alias="dicionario", schema="br_me_sic") }} -select - safe_cast(id_tabela as string) id_tabela, - safe_cast(nome_coluna as string) nome_coluna, - safe_cast(chave as string) chave, - safe_cast(cobertura_temporal as string) cobertura_temporal, - safe_cast(valor as string) valor, -from `basedosdados-staging.br_me_sic_staging.dicionario` as t diff --git a/models/br_me_sic/br_me_sic__transferencia.sql b/models/br_me_sic/br_me_sic__transferencia.sql new file mode 100644 index 00000000..4e266c37 --- /dev/null +++ b/models/br_me_sic/br_me_sic__transferencia.sql @@ -0,0 +1,36 @@ +{{ config(alias="transferencia", schema="br_me_sic") }} +select + safe_cast(ano as int64) ano, + safe_cast(mes as int64) mes, + safe_cast(id_esfera_orcamentaria as string) id_esfera_orcamentaria, + safe_cast(nome_esfera_orcamentaria as string) nome_esfera_orcamentaria, + safe_cast(id_natureza_juridica as string) id_natureza_juridica, + safe_cast(nome_natureza_juridica as string) nome_natureza_juridica, + safe_cast(id_resultado_primario as string) id_resultado_primario, + safe_cast(nome_resultado_primario as string) nome_resultado_primario, + safe_cast( + id_unidade_organizacional_nivel_0 as string + ) id_unidade_organizacional_nivel_0, + safe_cast( + nome_unidade_organizacional_nivel_0 as string + ) nome_unidade_organizacional_nivel_0, + safe_cast( + id_unidade_organizacional_nivel_1 as string + ) id_unidade_organizacional_nivel_1, + safe_cast( + nome_unidade_organizacional_nivel_1 as string + ) nome_unidade_organizacional_nivel_1, + safe_cast( + id_unidade_organizacional_nivel_2 as string + ) id_unidade_organizacional_nivel_2, + safe_cast( + nome_unidade_organizacional_nivel_2 as string + ) nome_unidade_organizacional_nivel_2, + safe_cast( + id_unidade_organizacional_nivel_3 as string + ) id_unidade_organizacional_nivel_3, + safe_cast( + nome_unidade_organizacional_nivel_3 as string + ) nome_unidade_organizacional_nivel_3, + safe_cast(valor_custo_transferencia as float64) valor_custo_transferencia, +from `basedosdados-staging.br_me_sic_staging.transferencia` as t diff --git a/models/br_me_sic/code/sic.py b/models/br_me_sic/code/sic.py new file mode 100644 index 00000000..7e3100a3 --- /dev/null +++ b/models/br_me_sic/code/sic.py @@ -0,0 +1,98 @@ +# Importing +import requests +import json +import pandas as pd +import datetime +import os +import numpy as np +import string +import basedosdados as bd + +output = "transferencia/output/" +# Download +todays_year = datetime.date.today().year; +year_range = list(range(2015,todays_year+1)); +year_range = [str(x)for x in year_range]; +first_time_flag = True; +# API retorna no máximo 250 observações, utilizando a segmentação abaixo a maior categoria (ano, mês, +# natureza jurídica) tem 194 observações. É uma margem segura? Se não repensar como fazer +api_response = requests.get('https://apidatalake.tesouro.gov.br/ords/custos/tt/transferencias?ano=2020&mes=10&natureza_juridica=3').text; + +transf_dict = json.loads(api_response); +transferencia_esp = pd.json_normalize(transf_dict['items']); +for ano in [str(x)for x in list(range(2015,todays_year+1))]: + for mes in [str(x)for x in list(range(1,13))]: + for natur in [str(x)for x in list(range(1,7))]: + api_response = requests.get('https://apidatalake.tesouro.gov.br/ords/custos/tt/transferencias?ano='+ano+'&mes='+mes+'&natureza_juridica='+natur).text; + + transf_dict = json.loads(api_response); + transferencia_esp = pd.json_normalize(transf_dict['items']); + + # Renomear variáveis com nomes inadequados + transferencia_esp = transferencia_esp.rename(columns={ + 'an_lanc': 'ano_lancamento', + 'me_lanc': 'mes_lancamento', + 'ds_organizacao_n0': 'nome_unidade_organizacional_nivel_0', + 'ds_organizacao_n1': 'nome_unidade_organizacional_nivel_1', + 'ds_organizacao_n2': 'nome_unidade_organizacional_nivel_2', + 'ds_organizacao_n3': 'nome_unidade_organizacional_nivel_3', + 'co_organizacao_n0': 'id_unidade_organizacional_nivel_0', + 'co_organizacao_n1': 'id_unidade_organizacional_nivel_1', + 'co_organizacao_n2': 'id_unidade_organizacional_nivel_2', + 'co_organizacao_n3': 'id_unidade_organizacional_nivel_3', + 'co_natureza_juridica': 'id_natureza_juridica', + 'ds_natureza_juridica': 'nome_natureza_juridica', + 'co_esfera_orcamentaria': 'id_esfera_orcamentaria', + 'ds_esfera_orcamentaria': 'nome_esfera_orcamentaria', + 'co_modalidade_aplicacao':'id_modalidade_aplicacao', + 'ds_modalidade_aplicacao':'nome_modalidade_aplicacao', + 'co_resultado_eof': 'id_resultado_primario', + 'ds_resultado_eof': 'nome_resultado_primario', + 'va_custo_transferencias':'valor_custo_transferencia'}); + if len(transferencia_esp) == 250: + raise Exception('Single request reached 250 observations, the maximum allowed by the Tesouro API. Probably missing data, code fix needed'); + + if first_time_flag: + transferencia = transferencia_esp + first_time_flag = False; + else: + transferencia = pd.concat([transferencia, transferencia_esp],axis=0); + +# Remover 0s iniciais + +id_idx = [col.startswith('id') for col in list(transferencia.columns.values)] + +transferencia.loc[:,id_idx] = transferencia.loc[:,id_idx].astype(int).astype(str) + +transferencia = transferencia[['ano_lancamento', + 'mes_lancamento', + 'id_unidade_organizacional_nivel_0', + 'nome_unidade_organizacional_nivel_0', + 'id_unidade_organizacional_nivel_1', + 'nome_unidade_organizacional_nivel_1', + 'id_unidade_organizacional_nivel_2', + 'nome_unidade_organizacional_nivel_2', + 'id_unidade_organizacional_nivel_3', + 'nome_unidade_organizacional_nivel_3', + 'id_natureza_juridica', + 'nome_natureza_juridica', + 'id_esfera_orcamentaria', + 'nome_esfera_orcamentaria', + 'id_resultado_primario', + 'nome_resultado_primario', + 'valor_custo_transferencia']] + +# Cria as partições e coloca os arquivos respectivos dentro delas + +for ano in [*range(2015, todays_year+1)]: + for mes in [*range(1, 13)]: + particao = output + f'transferencia/ano={ano}/mes={mes}' + if not os.path.exists(particao): + os.makedirs(particao) +for ano in [*range(2015, todays_year+1)]: + for mes in [*range(1, 13)]: + df_particao = transferencia[transferencia['ano_lancamento'] == ano].copy() # O .copy não é necessário é apenas uma boa prática + df_particao = df_particao[df_particao['mes_lancamento'] == mes] + df_particao.drop(['ano_lancamento', 'mes_lancamento'], axis=1, inplace=True) # É preciso excluir as colunas utilizadas para partição + particao = output + f'transferencia/ano={ano}/mes={mes}/transferencia.csv' + df_particao.to_csv(particao, index=False, encoding='utf-8', na_rep='') diff --git a/models/br_me_sic/schema.yml b/models/br_me_sic/schema.yml index ca47b58b..38c1014e 100644 --- a/models/br_me_sic/schema.yml +++ b/models/br_me_sic/schema.yml @@ -1,27 +1,63 @@ --- version: 2 models: - - name: br_me_sic__dicionario - description: Dicionário para tradução dos códigos do conjunto br_me_sic. Para - taduzir códigos compartilhados entre instituições, como id_municipio, buscar - por diretórios + - name: br_me_sic__transferencia + description: A tabela contém dados sobre custos com transferências a estados e + municípios do Governo Federal. Por meio desses dados é possível estudar, por + exemplo, o nível de envolvimento e a importância das diversas unidades organizacionais + governamentais nessas operações. tests: - - dbt_utils.unique_combination_of_columns: - combination_of_columns: - - id_tabela - - nome_coluna - - chave - - cobertura_temporal - not_null_proportion_multiple_columns: - at_least: 0.05 + at_least: 0.95 columns: - - name: id_tabela - description: ID Tabela - - name: nome_coluna - description: Nome da coluna - - name: chave - description: Chave - - name: cobertura_temporal - description: Cobertura Temporal - - name: valor - description: Valor + - name: ano + description: Ano do lançamento contábil + tests: + - relationships: + to: ref('br_bd_diretorios_data_tempo__ano') + field: ano.ano + - name: mes + description: Mês do lançamento contábil + tests: + - relationships: + to: ref('br_bd_diretorios_data_tempo__mes') + field: mes.mes + - name: id_esfera_orcamentaria + description: Código da esfera orçamentária do custo + - name: nome_esfera_orcamentaria + description: Nome da esfera orçamentária do custo + - name: id_natureza_juridica + description: Código da natureza jurídica do Órgão + - name: id_resultado_primario + description: Código da classificação da despesa orçamentária por indicador + de resultado primário + - name: nome_resultado_primario + description: Nome da classificação da despesa orçamentária por indicador de + resultado primário + - name: id_unidade_organizacional_nivel_0 + description: Código da Unidade organizacional um nível acima dos Ministérios + e da AGU, conforme codificação SIORG + - name: nome_unidade_organizacional_nivel_0 + description: Nome da Unidade organizacional um nível acima dos Ministérios + e da AGU, conforme codificação SIORG + - name: id_unidade_organizacional_nivel_1 + description: Código da Unidade organizacional no nível dos Ministérios e da + AGU, conforme codificação SIORG + - name: nome_unidade_organizacional_nivel_1 + description: Nome da Unidade organizacional no nível dos Ministérios e da + AGU, conforme codificação SIORG + - name: id_unidade_organizacional_nivel_2 + description: Código da Unidade organizacional a um nível abaixo dos Ministérios + e da AGU, conforme codificação SIORG + - name: nome_unidade_organizacional_nivel_2 + description: Nome da Unidade organizacional a um nível abaixo dos Ministérios + e da AGU, conforme codificação SIORG + - name: id_unidade_organizacional_nivel_3 + description: Código da Unidade organizacional a dois níveis abaixo dos Ministérios + e da AGU, conforme codificação SIORG + - name: nome_unidade_organizacional_nivel_3 + description: Nome da Unidade organizacional a dois níveis abaixo dos Ministérios + e da AGU, conforme codificação SIORG + - name: valor_custo_transferencia + description: Valor do custo com transferências + tests: [not_null] diff --git a/models/br_ms_sim/br_ms_sim__dicionario.sql b/models/br_ms_sim/br_ms_sim__dicionario.sql index bed48ed2..cd5d5419 100644 --- a/models/br_ms_sim/br_ms_sim__dicionario.sql +++ b/models/br_ms_sim/br_ms_sim__dicionario.sql @@ -1,4 +1,5 @@ {{ config(alias="dicionario", schema="br_ms_sim") }} +-- Dicionário de dados do SIM select safe_cast(id_tabela as string) id_tabela, safe_cast(coluna as string) nome_coluna, diff --git a/models/br_ms_sinasc/br_ms_sinasc__dicionario.sql b/models/br_ms_sinasc/br_ms_sinasc__dicionario.sql index f31bf40c..576294a9 100644 --- a/models/br_ms_sinasc/br_ms_sinasc__dicionario.sql +++ b/models/br_ms_sinasc/br_ms_sinasc__dicionario.sql @@ -1,4 +1,5 @@ {{ config(alias="dicionario", schema="br_ms_sinasc") }} +-- Dicionário de dados do SINASC select safe_cast(id_tabela as string) id_tabela, safe_cast(coluna as string) nome_coluna,