Nessa seção listamos todos os padrões do nosso manual de estilo e diretrizes de dados que usamos na Base dos Dados. Eles nos ajudam a manter os dados e metadados que publicamos com qualidade alta.
Você pode usar o menu esquerdo para navegar pelos diferentes tópicos dessa página.
dataset_id
)Nomeamos conjuntos no formato <organization_id\>_<descrição\>
, onde
organization_id
segue por padrão a abrangência geográfica da
organização que publica o conjunto:
Nível | organization_id |
---|---|
Mundial | mundo_<organizacao> |
Federal | <sigla_pais>_<organizacao> |
Estadual | <sigla_pais>_<sigla_uf>_<organizacao> |
Municipal | <sigla_pais>_<sigla_uf>_<cidade>_<organizacao> |
sigla_pais
e sigla_uf
são sempre 2 letras minúsculas;organizacao
é o nome ou sigla (de preferência) da organização que
publicou os dados orginais (ex: ibge
, tse
, inep
).descricao
é uma breve descrição do conjunto de dados, que pode serPor exemplo, o conjunto de dados do PIB do IBGE tem como dataset_id
: br_ibge_pib
Não sabe como nomear a organização?Sugerimos que vá no site da mesma e veja como ela se autodenomina (ex: DETRAN-RJ seriabr_rj_detran
)
Nomear tabelas é algo menos estruturado e, por isso, requer bom senso. Mas temos algumas regras:
municipio_valor
, uf_valor
.municipio
, e não municipio_ano
.escola
, e não escolas
.microdados
as tabelas mais desagregadas. Em geral essas tem dados a nível de pessoa ou transação.dataset_id.table_id
Mundial | mundo_waze.alertas | Dados de alertas do Waze de diferentes cidades. |
Federal | br_tse_eleicoes.candidatos | Dados de candidatos a cargos políticos do TSE. |
Federal | br_ibge_pnad.microdados | Microdados da Pesquisa Nacional por Amostra de Domicílios produzidos pelo IBGE. |
Federal | br_ibge_pnadc.microdados | Microdados da Pesquisa Nacional por Amostra de Domicílios Contínua (PNAD-C) produzidos pelo IBGE. |
Estadual | br_sp_see_docentes.carga_horaria | Carga horária anonimizado de docentes ativos da rede estadual de ensino de SP. |
Municipal | br_rj_riodejaneiro_cmrj_legislativo.votacoes | Dados de votação da Câmara Municipal do Rio de Janeiro (RJ). |
Tabelas devem, na medida do possível, estar no formato long
, ao invés de wide
.
Nomes de variáveis devem respeitar algumas regras:
ano
, mes
, id_municipio
, sigla_uf
, idade
, cargo
, resultado
, votos
, receita
, despesa
, preco
, etc._
.de
, da
, dos
, e
, a
, em
, etc.id_
quando a variável representar chaves primárias de entidades (que eventualmente teriam uma tabela de diretório).
id_municipio
, id_uf
, id_escola
, id_pessoa
.rede
, localizacao
.pessoa
, uma coluna sobre PIB municipal se chamaria pib_municipio
.pessoa
, características da pessoa se chamariam nome
, idade
, sexo
, etc.nome_
,data_
,quantidade_
,proporcao_
(variáveis de porcentagem 0-100%),taxa_
,razao_
,indice_
,indicador_
(variáveis do tipo booleano),tipo_
,sigla_
,sequencial_
._pc
(per capita)A ordem de variáveis em tabelas é padronizada para manter uma consistência no repositório. Nossas regras são:
ano
, sigla_uf
, id_municipio
, id_escola
, rede
, nota_ideb
;Nós utilizamos algumas das opções de tipos do BigQuery: string
, int64
, float64
, date
, time
, geography
.
Quando escolher:
string
:
int64
:
float64
:
date
:
YYYY-MM-DD
time
:
HH:MM:SS
geography
:
A regra é manter variáveis com suas unidades de medida originais listadas nesse código, com a exceção de variáveis financeiras onde convertermos moedas antigas para as atuais (e.g. Cruzeiro para Real).
Catalogamos unidades de medida em formato padrão na tabela de arquitetura. Lista completa aqui Exemplos: m
, km/h
, BRL
.
Para colunas financeiras deflacionadas, listamos a moeda com o ano base. Exemplo: uma coluna medida em reais de 2010 tem unidade BRL_2010
.
Variáveis devem ter sempre unidades de medida com base 1. Ou seja, ter BRL
ao invés de 1000 BRL
, ou pessoa
ao invés de 1000 pessoas
. Essa informação, como outros metadados de colunas, são registradas na tabela de arquitetura da tabela.
Mantemos nossas tabelas parcialmente normalizadas, e temos regras para quais variáveis incluirmos em produção. Elas são:
municipio
da tabela que já inclui id_municipio
.ano
e sigla_uf
se a tabela é particionada nessas duas dimensões.id_municipio
a tabelas que só incluem id_municipio_tse
.sigla_uf
, id_municipio
) e (2) retirar chaves irrelevantes (e.g. regiao
).Preencher a coluna cobertura_temporal
nos metadados de tabela, coluna e chave (em dicionários) segue o seguinte padrão.
Formato geral: data_inicial(unidade_temporal)data_final
data_inicial
e data_final
estão na correspondente unidade temporal.
ano
tem cobertura 2005(1)2018
.mes
tem cobertura 2005-08(1)2018-12
.semana
tem cobertura 2005-08-01(7)2018-08-31
.dia
tem cobertura 2005-08-01(1)2018-12-31
.Regras para preenchimento
data_inicial
ou data_final
sejam iguais aos da tabela. Nesse caso deixe vazio.2005(1)2018
.
2012(1)
.(1)2013
.(1)
..
(ponto) ao invés de ,
(vírgula).YYYY-MM-DD
HH:MM:SS
YYYY-MM-DDTHH:MM:SS.sssZ
""
(csv), NULL
(Python), NA
(R), .
ou ""
(Stata)De forma resumida, particionar uma tabela é dividi-la em vários blocos/partes. O objetivo central é diminuir os custos financeiros e aumentar a perfomance, visto que, quanto maior o volume de dados, consequentemente será maior o custo de armazenamento e consulta.
A redução de custos e o aumento de perfomance acontece, principalmente, porque a partição permite a reorganização do conjunto de dados em pequenos blocos agrupados. Na prática, realizando o particionamento, é possível evitar que uma consulta percorra toda a tabela só para trazer um pequeno recorte de dados.
Um exemplo prático da nossa querida RAIS:
Para esse caso o Bigquery varreu todas (*) as colunas e linhas do conjunto. Vale salientar que esse custo ainda não é tão grande, visto que a base já foi particionada. Caso esse conjunto não tivesse passado pelo processo de particionamento, essa consulta custaria muito mais dinheiro e tempo, já que se trata de um volume considerável de dados.
Aqui, filtramos pelas colunas particionadas ano
e sigla_uf
. Dessa forma, o Bigquery só consulta e retorna os valores da pasta ano e da subpasta sigla_uf.
A primeira pergunta que surge quando se trata de particionamento é: a partir de qual quantidade de linhas uma tabela deve ser particionada? A documentação do GCP não define uma quantidade x ou y de linhas que deve ser particionada. O ideal é que as tabelas sejam particionadas, com poucas exceções. Por exemplo, tabelas com menos de 10.000 linhas, que não receberão mais ingestão de dados, não tem um custo de armazenamento e processamento altos e, portanto, não há necessidade de serem particionadas.
Se os dados estão guardados localmente, é necessário:
/output
, na linguagem que você estiver utilizando.Exemplo de uma tabela particionada por ano
e mes
, utilizando python
:
for ano in [*range(2005, 2020)]:
for mes in [*range(1, 13)]:
particao = output + f'table_id/ano={ano}/mes={mes}'
if not os.path.exists(particao):
os.makedirs(particao)
for ano in [*range(2005, 2020)]:
for mes in [*range(1, 13)]:
df_particao = df[df['ano'] == ano].copy() # O .copy não é necessário é apenas uma boa prática
df_particao = df_particao[df_particao['mes'] == mes]
df_particao.drop(['ano', 'mes'], axis=1, inplace=True) # É preciso excluir as colunas utilizadas para partição
particao = output + f'table_id/ano={ano}/mes={mes}/tabela.csv'
df_particao.to_csv(particao, index=False, encoding='utf-8', na_rep='')
Exemplos de tabelas particionadas em R
:
Exemplo de como particionar uma tabela em SQL
:
CREATE TABLE `dataset_id.table_id` as (
ano INT64,
mes INT64,
col1 STRING,
col1 STRING
) PARTITION BY ano, mes
OPTIONS (Description='Descrição da tabela')
Os tipos de colunas que o BigQuery aceita como partição são:
TIMESTAMP
, DATE
ou DATETIME
.data/hora
quando o BigQuery processa os dados.Os tipos de colunas que o BigQuery não aceita como partição são: BOOL
, FLOAT64
, BYTES
, etc.
O BigQuery aceita no máximo 4.000 partições por tabela.
Aqui na BD as tabelas geralmente são particionadas por: ano
, mes
, trimestre
e sigla_uf
.
Note que ao particionar uma tabela é preciso excluir a coluna correspondente. Exemplo: é preciso excluir a coluna ano
ao particionar por ano
.
Pull requests no Github devem incluir no máximo um conjunto, mas pode incluir mais de uma base. Ou seja, podem envolver uma ou mais tabela dentro do mesmo conjunto.
enum
padrão, nós excluimos os zeros à esquerda.
br_bd_diretorios_brasil.cbo_2002:cbo_2002
, que tem seis dígitos, pois o primeiro dígito 0
significa a categoria ser do grande grupo = "Membros das forças armadas, policiais e bombeiros militares"
.br_inep_censo_escolar.turma:etapa_ensino
, nós excluimos os zeros à esquerda. Ou seja, mudamos 01
para 1
.spatial_coverage
(cobertura_espacial
), ou seja, deixar o campo vazio.temporal_coverage
(cobertura_temporal
), ou seja, deixar o campo vazio.observation_level
(nivel_observacao
), ou seja, deixar o campo vazio.Diretórios são as pedras fundamentais da estrutura do nosso datalake. Nossas regras para gerenciar diretórios são:
uf
, município
, escola
) e unidades de data-tempo (e.g. data
, tempo
, dia
, mes
, ano
).municipio:id_municipio
, uf:sigla_uf
.id_
são reservadas para chaves
primárias de entidades.Veja todas as tabelas já disponíveis aqui.
spatial_coverage
(cobertura_espacial
), que é a máxima unidade espacial que a tabela cobre. Exemplo: sa.br, que significa que o nível de agregação espacial da tabela é o Brasil.temporal_coverage
(cobertura_temporal
), ou seja, deixar o campo vazio.observation_level
(nivel_observacao
), que consiste no nível de observação da tabela, ou seja, o que representa cada linha.temporal_coverage
(cobertura_temporal
) das colunas da tabela, ou seja, deixar o campo vazio.O campo se refere aos dados na fonte original, que ainda não passaram pela metodologia de tratamento da Base dos Dados, ou seja, nosso _input_
. Ao clicar nele, a ideia é redirecionar o usuário para a página da fonte original dos dados. As regras para gerenciar as Fontes Originais são:
Sinopses Estatísticas da Educação Básica: Dados Abertos do Inep
, Penn World Tables: Groningen Growth and Development Centre
.Abra um issue no nosso Github ou mande uma mensagem no Discord para conversarmos :)