Skip to content

Commit

Permalink
Merge branch 'main' into add-test-in-diretorios
Browse files Browse the repository at this point in the history
  • Loading branch information
tricktx authored Jul 10, 2024
2 parents 27bef3a + 98c0c51 commit 1815e78
Show file tree
Hide file tree
Showing 16 changed files with 476 additions and 33 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
{{
config(
alias="cadastro_enderecos",
schema="br_ibge_censo_2022",
partition_by={
"field": "sigla_uf",
"data_type": "string",
},
cluster_by=["id_municipio"],
)
}}

select
safe_cast(sigla_uf as string) sigla_uf,
safe_cast(cod_municipio as string) id_municipio,
safe_cast(cod_distrito as string) id_distrito,
safe_cast(cod_subdistrito as string) id_subdistrito,
safe_cast(cod_setor as string) id_setor_censitario,
safe_cast(cep as string) cep,
safe_cast(cod_unico_endereco as string) id_endereco,
safe_cast(num_quadra as string) numero_quadra,
safe_cast(num_face as string) numero_face,
safe_cast(dsc_localidade as string) localidade,
safe_cast(nom_tipo_seglogr as string) tipo_segmento_logradouro,
safe_cast(nom_titulo_seglogr as string) titulo_segmento_logradouro,
safe_cast(nom_seglogr as string) nome_logradouro,
safe_cast(num_endereco as string) numero_logradouro,
safe_cast(dsc_modificador as string) modificador_numero,
safe_cast(nom_comp_elem1 as string) complemento_elemento_1,
safe_cast(val_comp_elem1 as string) complemento_valor_1,
safe_cast(nom_comp_elem2 as string) complemento_elemento_2,
safe_cast(val_comp_elem2 as string) complemento_valor_2,
safe_cast(nom_comp_elem3 as string) complemento_elemento_3,
safe_cast(val_comp_elem3 as string) complemento_valor_3,
safe_cast(nom_comp_elem4 as string) complemento_elemento_4,
safe_cast(val_comp_elem4 as string) complemento_valor_4,
safe_cast(nom_comp_elem5 as string) complemento_elemento_5,
safe_cast(val_comp_elem5 as string) complemento_valor_5,
safe_cast(dsc_estabelecimento as string) descricao_estabelecimento,
safe_cast(cod_especie as string) tipo_especie,
safe_cast(cod_indicador_estab_endereco as string) tipo_estabelecimento,
safe_cast(cod_indicador_const_endereco as string) tipo_construcao,
safe_cast(cod_indicador_finalidade_const as string) tipo_finalidade_construcao,
safe_cast(cod_tipo_especi as string) tipo_edificacao_domicilio,
safe_cast(nv_geo_coord as string) nivel_geocodificacao_coordenadas,
safe_cast(latitude as string) latitude,
safe_cast(longitude as string) longitude,
st_geogpoint(safe_cast(longitude as float64), safe_cast(latitude as float64)) ponto
from `basedosdados-staging.br_ibge_censo_2022_staging.cadastro_enderecos` as t

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
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(trim(chave) as string) chave,
safe_cast(cobertura_temporal as string) cobertura_temporal,
safe_cast(valor as string) valor,
from `basedosdados-staging.br_ibge_censo_2022_staging.dicionario` as t
102 changes: 102 additions & 0 deletions models/br_ibge_censo_2022/code/cnefe_2022_crawler.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
from constants import constants

import os
import requests
import zipfile
import pandas as pd
from io import BytesIO
from tqdm import tqdm


CNEFE_FILE_NAMES = constants.CNEFE_FILE_NAMES.value
URL = constants.CNEFE_FTP_URL.value


# Função para baixar cada arquivo do FTP
def download_files_from_ftp(url: str) -> BytesIO:
"""
Baixa um arquivo do FTP e retorna seu conteúdo em memória.
Parâmetros:
url (str): URL do arquivo a ser baixado.
Retorna:
BytesIO: Conteúdo do arquivo baixado em memória.
"""
response = requests.get(url, stream=True)
response.raise_for_status()
total_size = int(response.headers.get('content-length', 0))
block_size = 1024 # 1 Kibibyte
t = tqdm(total=total_size, unit='iB', unit_scale=True)
file_data = BytesIO()
for data in response.iter_content(block_size):
t.update(len(data))
file_data.write(data)
t.close()
return file_data

# Função para descompactar e processar o arquivo de São Paulo (SP) em chunks
def process_sp_file(file: BytesIO, uf:str) -> None:
"""
Descompacta, processa e salva o arquivo de São Paulo (SP) em chunks.
Parâmetros:
file (BytesIO): Conteúdo do arquivo ZIP em memória.
"""
output_dir = f"/tmp/br_ibge_censo_2022/output/sigla_uf={uf}"
os.makedirs(output_dir, exist_ok=True)
chunk_number = 0

with zipfile.ZipFile(file) as z:
with z.open(z.namelist()[0]) as f:
for chunk in pd.read_csv(f, chunksize=1000000, sep=';', dtype=str):
chunk_number += 1
chunk.to_parquet(os.path.join(output_dir, f"{uf}_chunk_{chunk_number}.parquet"), compression="gzip")
print(f"Chunk {chunk_number} de {uf} salvo com sucesso.")

# Função para descompactar o arquivo na sessão
def unzip_file_in_session(file: BytesIO) -> pd.DataFrame:
"""
Descompacta um arquivo ZIP em memória e carrega seu conteúdo em um DataFrame do pandas.
Parâmetros:
file (BytesIO): Conteúdo do arquivo ZIP em memória.
Retorna:
pd.DataFrame: DataFrame com os dados do arquivo descompactado.
"""
with zipfile.ZipFile(file) as z:
with z.open(z.namelist()[0]) as f:
df = pd.read_csv(f,sep=';', dtype=str)
return df

# Função para salvar o DataFrame em formato parquet com compressão gzip
def save_parquet(df: pd.DataFrame, mkdir: bool, table_id: str) -> None:
"""
Salva um DataFrame em formato parquet com compressão gzip em um diretório específico.
Parâmetros:
df (pd.DataFrame): DataFrame a ser salvo.
mkdir (bool): Se True, cria o diretório se ele não existir.
table_id (str): Identificador da tabela usado para nomear o arquivo e diretório.
"""
output_dir = f"/tmp/br_ibge_censo_2022/output/sigla_uf={table_id}"
if mkdir:
os.makedirs(output_dir, exist_ok=True)
df.to_parquet(os.path.join(output_dir, f"{table_id}.parquet"), compression="gzip")

# Baixar, descompactar e salvar os arquivos
for uf, filename in CNEFE_FILE_NAMES.items():
url = f"{URL}/{filename}"
print(f'----- Baixando o arquivo: {url}')

try:
zip_file = download_files_from_ftp(url)
if uf in ['SP', 'RJ', 'MG', 'BA', 'RS']:
process_sp_file(zip_file, uf)
else:
df = unzip_file_in_session(zip_file)
save_parquet(df, mkdir=True, table_id=uf)
print(f"Arquivo {filename} baixado e salvo com sucesso.")
except Exception as e:
print(f"Erro ao processar o arquivo {filename}: {e}")
37 changes: 36 additions & 1 deletion models/br_ibge_censo_2022/code/constants.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from enum import Enum

class constants(Enum):

URLS = {"populacao_grupos_idade":"https://apisidra.ibge.gov.br/values/t/1209/n3/all/v/allxp/p/all/c58/all",
"populacao_residente": "https://apisidra.ibge.gov.br/values/t/9514/n6/all/v/allxp/p/all/c2/all/c287/allxt/c286/allxt",
"indice_envelhecimento": "https://apisidra.ibge.gov.br/values/t/9515/n3/all/n6/all/v/all/p/all/d/v8845%202,v10612%202",
Expand All @@ -16,4 +17,38 @@ class constants(Enum):
"domicilios_pelo_menos_um_territorios_quilombolas": "https://apisidra.ibge.gov.br/values/t/9726/n145/all/v/7081,7082,7083,7084,7085/p/all/d/v7084%202,v7085%202",
"populacao_residente_indigena_municipio": "https://apisidra.ibge.gov.br/values/t/9718/n6/all/v/93,350/p/all/c1714/allxt/c2661/allxt",
"domicilios_moradores_indigenas_municipio": "https://apisidra.ibge.gov.br/values/t/9728/n6/all/v/381,382,5930,6554,8691/p/all/c2661/allxt/d/v5930%202,v6554%202",
"domicilios_pelo_menos_um_morador_indigenas_municipio": "https://apisidra.ibge.gov.br/values/t/9720/n6/all/v/5938,6554,7088,7089,7090/p/all/c2661/allxt/d/v5938%202,v6554%202" }
"domicilios_pelo_menos_um_morador_indigenas_municipio": "https://apisidra.ibge.gov.br/values/t/9720/n6/all/v/5938,6554,7088,7089,7090/p/all/c2661/allxt/d/v5938%202,v6554%202",
}

#NOTE: CNEFE não será baixado do SIDRA
CNEFE_FTP_URL = 'http://ftp.ibge.gov.br/Cadastro_Nacional_de_Enderecos_para_Fins_Estatisticos/Censo_Demografico_2022/Arquivos_CNEFE/UF'

CNEFE_FILE_NAMES = {
'RO' : '11_RO.zip',
'AC' : '12_AC.zip',
'AM' : '13_AM.zip',
'RR' : '14_RR.zip',
'PA' : '15_PA.zip',
'AP' : '16_AP.zip',
'TO' : '17_TO.zip',
'MA' : '21_MA.zip',
'PI' : '22_PI.zip',
'CE' : '23_CE.zip',
'RN' : '24_RN.zip',
'PB' : '25_PB.zip',
'PE' : '26_PE.zip',
'AL' : '27_AL.zip',
'SE' : '28_SE.zip',
'BA' : '29_BA.zip',
'MG' : '31_MG.zip',
'ES' : '32_ES.zip',
'RJ' : '33_RJ.zip',
'SP' : '35_SP.zip',
'PR' : '41_PR.zip',
'SC' : '42_SC.zip',
'RS' : '43_RS.zip',
'MS' : '50_MS.zip',
'MT' : '51_MT.zip',
'GO' : '52_GO.zip',
'DF' : '53_DF.zip'
}
99 changes: 99 additions & 0 deletions models/br_ibge_censo_2022/schema.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1300,3 +1300,102 @@ models:
- name: taxa_alfabetizacao
description: Taxa de alfabetização das pessoas indígenas de 15 anos ou mais
de idade
- name: br_ibge_censo_2022__cadastro_enderecos
description: O Cadastro Nacional de Endereços para Fins Estatísticos - CNEFE é
uma base de dados de abrangência nacional criada em 2005. Esse cadastro contempla
endereços georreferenciados de domicílios e estabelecimentos de todo o país
para o ano de 2022.
tests:
- dbt_utils.unique_combination_of_columns:
combination_of_columns: [id_endereco, tipo_especie]
- custom_dictionary_coverage:
columns_covered_by_dictionary:
- nivel_geocodificacao_coordenadas
- tipo_especie
- tipo_estabelecimento
- tipo_construcao
- tipo_finalidade_construcao
- tipo_edificacao_domicilio
dictionary_model: ref('br_ibge_censo_2022__dicionario')
columns:
- name: sigla_uf
description: ID da Unidade da Federação
tests:
- relationships:
to: ref('br_bd_diretorios_brasil__uf')
field: sigla
- name: id_municipio
description: ID Município IBGE - 7 Dígitos
tests:
- relationships:
to: ref('br_bd_diretorios_brasil__municipio')
field: id_municipio
- name: id_distrito
description: ID do Distrito
- name: id_subdistrito
description: ID do Subdistrito
- name: id_setor_censitario
description: ID do Setor Censitário
tests: [not_null]
- name: cep
description: CEP
tests: [not_null]
- name: id_endereco
description: Identificador do endereço
tests: [not_null]
- name: numero_quadra
description: Número da quadra
- name: numero_face
description: Número da face
- name: localidade
description: Localidade
- name: tipo_segmento_logradouro
description: Tipo do segmento do logradouro
- name: titulo_segmento_logradouro
description: Título do segmento do logradouro
- name: nome_logradouro
description: Nome do logradouro
- name: numero_logradouro
description: Número no logradouro
- name: modificador_numero
description: Modificador do número
- name: complemento_elemento_1
description: 'Complemento: Elemento 1'
- name: complemento_valor_1
description: 'Complemento: Valor 1'
- name: complemento_elemento_2
description: 'Complemento: Elemento 2'
- name: complemento_valor_2
description: 'Complemento: Valor 2'
- name: complemento_elemento_3
description: 'Complemento: Elemento 3'
- name: complemento_valor_3
description: 'Complemento: Valor 3'
- name: complemento_elemento_4
description: 'Complemento: Elemento 4'
- name: complemento_valor_4
description: 'Complemento: Valor 4'
- name: complemento_elemento_5
description: 'Complemento: Elemento 5'
- name: complemento_valor_5
description: 'Complemento: Valor 5'
- name: descricao_estabelecimento
description: Identificação do estabelecimento
- name: tipo_especie
description: Espécie de endereço
- name: tipo_estabelecimento
description: Tipo de estabelecimento
- name: tipo_construcao
description: Tipo de construção ou reforma
- name: tipo_finalidade_construcao
description: Tipo de finalidade de construção
- name: tipo_edificacao_domicilio
description: Tipo da edificação dos domicílios
- name: nivel_geocodificacao_coordenadas
description: Nível de geocodificação das coordenadas
- name: latitude
description: Latitude do Endereço
- name: longitude
description: Longitude do Endereço
- name: ponto
description: Ponto geográfico criado a partir das colunas longitude e latitude
15 changes: 15 additions & 0 deletions models/br_inep_saeb/br_inep_saeb__brasil_taxa_alfabetizacao.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{{
config(
alias="brasil_taxa_alfabetizacao",
schema="br_inep_saeb",
materialized="table",
)
}}

select
safe_cast(ano as int64) ano,
safe_cast(rede as string) rede,
safe_cast(localizacao as string) localizacao,
safe_cast(area as string) area,
safe_cast(taxa_alfabetizacao as float64) taxa_alfabetizacao,
from `basedosdados-staging.br_inep_saeb_staging.brasil_taxa_alfabetizacao` as t
13 changes: 13 additions & 0 deletions models/br_inep_saeb/br_inep_saeb__uf_taxa_alfabetizacao.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{{
config(
alias="uf_taxa_alfabetizacao", schema="br_inep_saeb", materialized="table"
)
}}
select
safe_cast(ano as int64) ano,
safe_cast(sigla_uf as string) sigla_uf,
safe_cast(rede as string) rede,
safe_cast(localizacao as string) localizacao,
safe_cast(area as string) area,
safe_cast(taxa_alfabetizacao as float64) taxa_alfabetizacao,
from `basedosdados-staging.br_inep_saeb_staging.uf_taxa_alfabetizacao` as t
Loading

0 comments on commit 1815e78

Please sign in to comment.