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, abierta y sin autenticación para consultar todos estos datos directamente desde tu código.
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.
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.).
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 |