En esta sección listamos todos los estándares de nuestro manual de estilo y directrices de datos que usamos en Base de los Datos. Estos nos ayudan a mantener los datos y metadatos que publicamos con alta calidad.
Puedes usar el menú izquierdo para navegar por los diferentes temas de esta página.
dataset_id
)Nombramos conjuntos en el formato <organization_id>_<descripción>
, donde
organization_id
sigue por defecto la cobertura geográfica de la
organización que publica el conjunto:
organization_id | |
---|---|
Mundial | mundo_<organizacion> |
Federal | <sigla_pais>_<organizacion> |
Estatal | <sigla_pais>_<sigla_estado>_<organizacion> |
Municipal | <sigla_pais>_<sigla_estado>_<ciudad>_<organizacion> |
sigla_pais
y sigla_estado
son siempre 2 letras minúsculas;organizacion
es el nombre o sigla (preferentemente) de la organización que
publicó los datos originales (ej: ibge
, tse
, inep
).descripcion
es una breve descripción del conjunto de datosPor ejemplo, el conjunto de datos del PIB del IBGE tiene como dataset_id
: br_ibge_pib
¿No sabes cómo nombrar la organización?Sugerimos que vayas al sitio web de la misma y veas cómo se autodenomina (ej: DETRAN-RJ seríabr_rj_detran
)
Nombrar tablas es algo menos estructurado y, por eso, requiere sentido común. Pero tenemos algunas reglas:
municipio_valor
, uf_valor
.municipio
, y no municipio_ano
.escuela
, y no escuelas
.microdatos
las tablas más desagregadas. En general estas tienen datos a nivel de persona o transacción.dataset_id.table_id
Mundial | mundo_waze.alertas | Datos de alertas de Waze de diferentes ciudades. |
Federal | br_tse_eleicoes.candidatos | Datos de candidatos a cargos políticos del TSE. |
Federal | br_ibge_pnad.microdados | Microdatos de la Encuesta Nacional por Muestra de Hogares producidos por el IBGE. |
Federal | br_ibge_pnadc.microdados | Microdatos de la Encuesta Nacional por Muestra de Hogares Continua (PNAD-C) producidos por el IBGE. |
Estatal | br_sp_see_docentes.carga_horaria | Carga horaria anonimizada de docentes activos de la red estatal de enseñanza de SP. |
Municipal | br_rj_riodejaneiro_cmrj_legislativo.votaciones | Datos de votación de la Cámara Municipal de Río de Janeiro (RJ). |
Las tablas deben, en la medida de lo posible, estar en formato long
, en lugar de wide
.
Los nombres de variables deben respetar algunas reglas:
ano
, mes
, id_municipio
, sigla_uf
, edad
, cargo
, resultado
, votos
, ingreso
, gasto
, precio
, etc._
.de
, la
, los
, y
, en
, etc.id_
cuando la variable represente claves primarias de entidades (que eventualmente tendrían una tabla de directorio).
id_municipio
, id_uf
, id_escuela
, id_persona
.red
, localizacion
.persona
, una columna sobre PIB municipal se llamaría pib_municipio
.persona
, características de la persona se llamarían nombre
, edad
, sexo
, etc.nombre_
,fecha_
,numero_
,cantidad_
,proporcion_
(variables de porcentaje 0-100%),tasa_
,razon_
,indice_
,indicador_
(variables de tipo booleano),tipo_
,sigla_
,secuencial_
._pc
(per cápita)El orden de variables en tablas está estandarizado para mantener una consistencia en el repositorio. Nuestras reglas son:
ano
, sigla_uf
, id_municipio
, id_escuela
, red
, nota_ideb
;Utilizamos algunas de las opciones de tipos de BigQuery: string
, int64
, float64
, date
, time
, geography
.
Cuándo elegir:
string
:
int64
:
float64
:
date
:
YYYY-MM-DD
time
:
HH:MM:SS
geography
:
La regla es mantener variables con sus unidades de medida originales listadas en este código, con la excepción de variables financieras donde convertimos monedas antiguas a las actuales (ej. Cruzeiro a Real).
Catalogamos unidades de medida en formato estándar en la tabla de arquitectura. Lista completa aquí Ejemplos: m
, km/h
, BRL
.
Para columnas financieras deflactadas, listamos la moneda con el año base. Ejemplo: una columna medida en reales de 2010 tiene unidad BRL_2010
.
Las variables deben tener siempre unidades de medida con base 1. Es decir, tener BRL
en lugar de 1000 BRL
, o persona
en lugar de 1000 personas
. Esta información, como otros metadatos de columnas, se registra en la tabla de arquitectura de la tabla.
Mantenemos nuestras tablas parcialmente normalizadas, y tenemos reglas para qué variables incluir en producción. Estas son:
municipio
de la tabla que ya incluye id_municipio
.ano
y sigla_uf
si la tabla está particionada en estas dos dimensiones.id_municipio
a tablas que solo incluyen id_municipio_tse
.sigla_uf
, id_municipio
) y (2) retirar claves irrelevantes (ej. region
).Llenar la columna cobertura_temporal
en los metadatos de tabla, columna y clave (en diccionarios) sigue el siguiente patrón.
Formato general: fecha_inicial(unidad_temporal)fecha_final
fecha_inicial
y fecha_final
están en la correspondiente unidad temporal.
ano
tiene cobertura 2005(1)2018
.mes
tiene cobertura 2005-08(1)2018-12
.semana
tiene cobertura 2005-08-01(7)2018-08-31
.dia
tiene cobertura 2005-08-01(1)2018-12-31
.Reglas para llenado
fecha_inicial
o fecha_final
sean iguales a las de la tabla. En ese caso dejar vacío.2005(1)2018
.
2012(1)
.(1)2013
.(1)
..
(punto) en lugar de ,
(coma).YYYY-MM-DD
HH:MM:SS
YYYY-MM-DDTHH:MM:SS.sssZ
""
(csv), NULL
(Python), NA
(R), .
o ""
(Stata)De forma resumida, particionar una tabla es dividirla en varios bloques/partes. El objetivo central es disminuir los costos financieros y aumentar el rendimiento, ya que, cuanto mayor sea el volumen de datos, consecuentemente será mayor el costo de almacenamiento y consulta.
La reducción de costos y el aumento de rendimiento ocurre, principalmente, porque la partición permite la reorganización del conjunto de datos en pequeños bloques agrupados. En la práctica, realizando el particionamiento, es posible evitar que una consulta recorra toda la tabla solo para traer un pequeño recorte de datos.
Un ejemplo práctico de nuestra querida RAIS:
Para este caso, BigQuery recorrió todas (*) las columnas y filas del conjunto. Vale señalar que este costo aún no es tan grande, ya que la base ya fue particionada. Si este conjunto no hubiera pasado por el proceso de particionamiento, esta consulta costaría mucho más dinero y tiempo, ya que se trata de un volumen considerable de datos.
Aquí, filtramos por las columnas particionadas ano
y sigla_uf
. De esta forma, BigQuery solo consulta y retorna los valores de la carpeta ano y la subcarpeta sigla_uf.
La primera pregunta que surge cuando se trata de particionamiento es: ¿a partir de qué cantidad de filas una tabla debe ser particionada? La documentación de GCP no define una cantidad x o y de filas que debe ser particionada. Lo ideal es que las tablas sean particionadas, con pocas excepciones. Por ejemplo, tablas con menos de 10.000 filas, que no recibirán más ingestión de datos, no tienen un costo de almacenamiento y procesamiento altos y, por lo tanto, no hay necesidad de ser particionadas.
Si los datos están guardados localmente, es necesario:
/output
, en el lenguaje que estés utilizando.Ejemplo de una tabla particionada por ano
y mes
, utilizando python
:
for ano in [*range(2005, 2020)]:
for mes in [*range(1, 13)]:
particion = output + f'table_id/ano={ano}/mes={mes}'
if not os.path.exists(particion):
os.makedirs(particion)
for ano in [*range(2005, 2020)]:
for mes in [*range(1, 13)]:
df_particion = df[df['ano'] == ano].copy() # El .copy no es necesario, es solo una buena práctica
df_particion = df_particion[df_particion['mes'] == mes]
df_particion.drop(['ano', 'mes'], axis=1, inplace=True) # Es necesario excluir las columnas utilizadas para partición
particion = output + f'table_id/ano={ano}/mes={mes}/tabla.csv'
df_particion.to_csv(particion, index=False, encoding='utf-8', na_rep='')
Ejemplos de tablas particionadas en R
:
Ejemplo de cómo particionar una tabla en SQL
:
CREATE TABLE `dataset_id.table_id` as (
ano INT64,
mes INT64,
col1 STRING,
col1 STRING
) PARTITION BY ano, mes
OPTIONS (Description='Descripción de la tabla')
Los tipos de columnas que BigQuery acepta como partición son:
TIMESTAMP
, DATE
o DATETIME
.fecha/hora
cuando BigQuery procesa los datos.Los tipos de columnas que BigQuery no acepta como partición son: BOOL
, FLOAT64
, BYTES
, etc.
BigQuery acepta como máximo 4.000 particiones por tabla.
Aquí en BD las tablas generalmente son particionadas por: ano
, mes
, trimestre
y sigla_uf
.
Note que al particionar una tabla es necesario excluir la columna correspondiente. Ejemplo: es necesario excluir la columna ano
al particionar por ano
.
Los pull requests en Github deben incluir como máximo un conjunto, pero pueden incluir más de una base. Es decir, pueden involucrar una o más tablas dentro del mismo conjunto.
enum
estándar, excluimos los ceros a la izquierda.
br_bd_diretorios_brasil.cbo_2002:cbo_2002
, que tiene seis dígitos, pues el primer dígito 0
significa que la categoría es del gran grupo = "Miembros de las fuerzas armadas, policías y bomberos militares"
.br_inep_censo_escolar.turma:etapa_ensino
, excluimos los ceros a la izquierda. Es decir, cambiamos 01
por 1
.spatial_coverage
(cobertura_espacial
), es decir, dejar el campo vacío.temporal_coverage
(cobertura_temporal
), es decir, dejar el campo vacío.observation_level
(nivel_observacion
), es decir, dejar el campo vacío.Los directorios son las piedras fundamentales de la estructura de nuestro data lake. Nuestras reglas para gestionar directorios son:
uf
, municipio
, escuela
) y unidades de fecha-tiempo (ej. fecha
, tiempo
, dia
, mes
, ano
).municipio:id_municipio
, uf:sigla_uf
.id_
están reservados para claves
primarias de entidades.Vea todas las tablas ya disponibles aquí.
spatial_coverage
(cobertura_espacial
), que es la máxima unidad espacial que la tabla cubre. Ejemplo: sa.br, que significa que el nivel de agregación espacial de la tabla es Brasil.temporal_coverage
(cobertura_temporal
), es decir, dejar el campo vacío.observation_level
(nivel_observacion
), que consiste en el nivel de observación de la tabla, es decir, lo que representa cada fila.temporal_coverage
(cobertura_temporal
) de las columnas de la tabla, es decir, dejar el campo vacío.El campo se refiere a los datos en la fuente original, que aún no han pasado por la metodología de tratamiento de Base de los Datos, es decir, nuestro _input_
. Al hacer clic en él, la idea es redirigir al usuario a la página de la fuente original de los datos. Las reglas para gestionar las Fuentes Originales son:
Sinopsis Estadísticas de la Educación Básica: Datos Abiertos del Inep
, Penn World Tables: Groningen Growth and Development Centre
.Abre un issue en nuestro Github o envía un mensaje en Discord para conversar :)
Base de los Datos