Los datos de eleccionesdb están disponibles para descarga en tres formatos, pensados para diferentes perfiles de uso y herramientas de análisis.
EleccionesDB API ofrece una API REST gratuita y abierta para consultar estos datos directamente desde tu código, con autenticación mediante correo y API key.
Parquet
Ideal para: análisis de datos con R, Python, DuckDB o cualquier herramienta compatible con Apache Arrow.
Contenido
Tablas individuales normalizadas en formato columnar:
descargas/parquet/
├── dimensiones/
│ ├── elecciones.parquet
│ ├── partidos.parquet
│ ├── partidos_recode.parquet
│ ├── territorios.parquet
│ └── tipos_eleccion.parquet
└── hechos/
├── resumen_territorial.parquet
└── votos_territoriales.parquet
Ventajas
- Formato columnar altamente eficiente en espacio y velocidad de lectura.
- Conserva tipos de datos (enteros, fechas, texto).
- Ideal para cargar en data frames y hacer análisis exploratorio.
- Compatible con DuckDB para consultas SQL directamente sobre los ficheros.
Cómo usarlo en R
library(arrow)
# Leer una tabla
elecciones <- read_parquet("descargas/parquet/dimensiones/elecciones.parquet")
votos <- read_parquet("descargas/parquet/hechos/votos_territoriales.parquet")
# Unir dimensiones con hechos
library(dplyr)
votos_con_partido <- votos |>
left_join(read_parquet("descargas/parquet/dimensiones/partidos.parquet"),
by = c("partido_id" = "id"))
Cómo usarlo en Python
import pandas as pd
# Leer una tabla
elecciones = pd.read_parquet("descargas/parquet/dimensiones/elecciones.parquet")
votos = pd.read_parquet("descargas/parquet/hechos/votos_territoriales.parquet")
# Con PyArrow
import pyarrow.parquet as pq
table = pq.read_table("descargas/parquet/hechos/votos_territoriales.parquet")
df = table.to_pandas()
SQLite
Ideal para: consultas SQL, exploración relacional, prototipos de aplicaciones.
Contenido
Un único fichero descargas/eleccionesdb.sqlite con el esquema relacional completo:
- Todas las tablas de dimensiones y hechos.
- Claves primarias (PKs) y claves foráneas (FKs).
- Restricciones UNIQUE.
- Índices para consultas eficientes.
Ventajas
- Base de datos relacional autocontenida en un solo fichero.
- No requiere servidor: funciona directamente en local.
- Permite consultas SQL complejas con JOINs, agregaciones, subqueries.
- Esquema con integridad referencial.
- El manifiesto
eleccionesdb_sqlite.jsonpublica la versión del esquema, tamaños y checksums SHA-256 para clientes automatizados.
Los usuarios de R pueden descargar, verificar y activar este snapshot directamente con eleccionesdb::edb_download_sqlite() y eleccionesdb::edb_set_backend("sqlite").
Cómo usarlo en R
library(DBI)
library(RSQLite)
con <- dbConnect(SQLite(), "descargas/eleccionesdb.sqlite")
# Listar tablas
dbListTables(con)
# Consulta SQL
votos_psoe <- dbGetQuery(con, "
SELECT e.year, e.descripcion, SUM(v.votos) as total_votos
FROM votos_territoriales v
JOIN elecciones e ON v.eleccion_id = e.id
JOIN partidos p ON v.partido_id = p.id
JOIN partidos_recode pr ON p.partido_recode_id = pr.id
WHERE pr.partido_recode = 'PSOE'
GROUP BY e.id
ORDER BY e.year
")
dbDisconnect(con)
Cómo usarlo en Python
import sqlite3
import pandas as pd
con = sqlite3.connect("descargas/eleccionesdb.sqlite")
# Listar tablas
tables = pd.read_sql("SELECT name FROM sqlite_master WHERE type='table'", con)
# Consulta SQL
df = pd.read_sql("""
SELECT e.year, e.descripcion, SUM(v.votos) as total_votos
FROM votos_territoriales v
JOIN elecciones e ON v.eleccion_id = e.id
JOIN partidos p ON v.partido_id = p.id
JOIN partidos_recode pr ON p.partido_recode_id = pr.id
WHERE pr.partido_recode = 'PSOE'
GROUP BY e.id
ORDER BY e.year
""", con)
con.close()
CSV planos (pre-joineados)
Ideal para: uso rápido, hojas de cálculo, importación directa sin necesidad de JOINs.
Contenido
Dos ficheros CSV con las tablas de hechos ya unidas con todas sus dimensiones:
descargas/csv/
├── resumen_territorial.csv
└── votos_territoriales.csv
Cada fila incluye tanto los datos numéricos (votos, censo, participación) como los campos descriptivos de las dimensiones (nombre del territorio, siglas del partido, descripción de la elección, etc.). En votos_territoriales.csv, los campos de partido incluyen también bloque, color, color_pastel y color_oscuro.
Ventajas
- Listos para usar: no requieren JOINs ni esquema relacional.
- Abribles directamente en Excel, Google Sheets o cualquier editor de texto.
- Formato universal compatible con cualquier herramienta.
Cómo usarlo en R
library(readr)
resumen <- read_csv("descargas/csv/resumen_territorial.csv")
votos <- read_csv("descargas/csv/votos_territoriales.csv")
Cómo usarlo en Python
import pandas as pd
resumen = pd.read_csv("descargas/csv/resumen_territorial.csv")
votos = pd.read_csv("descargas/csv/votos_territoriales.csv")
Comparativa de formatos
| Característica | Parquet | SQLite | CSV planos |
|---|---|---|---|
| Estructura | Tablas normalizadas individuales | Esquema relacional con FKs | Tablas pre-joineadas |
| Requiere JOINs | Sí | Sí (SQL) | No |
| Tamaño en disco | Muy compacto | Compacto | Grande |
| Tipos de datos | Preservados | Preservados | Todo como texto |
| Consultas SQL | Vía DuckDB | Nativo | No |
| Herramientas | R, Python, DuckDB, Spark | Cualquier cliente SQL | Excel, editores de texto, R, Python |
| Integridad referencial | No (ficheros sueltos) | Sí (FKs, PKs, UNIQUE) | No aplica |