Skip to content

Commit

Permalink
Merge branch 'main' into staging/agencia
Browse files Browse the repository at this point in the history
  • Loading branch information
folhesgabriel authored Jun 13, 2024
2 parents 768cea6 + 4f04dd9 commit 078bd82
Show file tree
Hide file tree
Showing 10 changed files with 197 additions and 29 deletions.
1 change: 1 addition & 0 deletions models/br_cnpq_bolsas/br_cnpq_bolsas__dicionario.sql
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
1 change: 1 addition & 0 deletions models/br_inep_ana/br_inep_ana__dicionario.sql
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
8 changes: 0 additions & 8 deletions models/br_me_sic/br_me_sic__dicionario.sql

This file was deleted.

36 changes: 36 additions & 0 deletions models/br_me_sic/br_me_sic__transferencia.sql
Original file line number Diff line number Diff line change
@@ -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
98 changes: 98 additions & 0 deletions models/br_me_sic/code/sic.py
Original file line number Diff line number Diff line change
@@ -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='')
78 changes: 57 additions & 21 deletions models/br_me_sic/schema.yml
Original file line number Diff line number Diff line change
@@ -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]
1 change: 1 addition & 0 deletions models/br_ms_sim/br_ms_sim__dicionario.sql
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
1 change: 1 addition & 0 deletions models/br_ms_sinasc/br_ms_sinasc__dicionario.sql
Original file line number Diff line number Diff line change
@@ -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,
Expand Down

0 comments on commit 078bd82

Please sign in to comment.