BQuant Finance — Dataset histórico
Dataset histórico de contratación pública de BQuant Finance: los conjuntos de la Plataforma de Contratación (10,9 millones de filas) ya procesados en Parquet, además de TED, CCAA y BORME.
Ficha técnica
- Formato
- Parquet (en ZIP)
- Registros
- 10,9 millones de filas PLACSP (5,24 millones de licitaciones), release v2026.10
- Cobertura
- Histórico
- Actualización
- Por releases, sin periodicidad fija
- Licencia
- Código MIT; aportaciones de BQuant CC BY 4.0; datos de origen con la licencia de cada portal
- Entidad
- BQuant Finance
Descripción
BQuant Finance descarga los datos de los portales oficiales y los publica ya procesados en Apache Parquet, listos para pandas, polars o DuckDB. Los datos no están en el árbol del repositorio sino en sus releases: la v2026.10 (5 de octubre de 2026) son 31 ZIP, unos 10,7 GB y 115 millones de filas entre todas las fuentes (Plataforma de Contratación, TED, comunidades autónomas y BORME).
La tabla principal de la Plataforma tiene 10.907.567 filas y 80 columnas, y reúne los cinco conjuntos (columna conjunto). Va partida por año en varios ZIP (nacional_licitaciones_hasta_2019.zip, nacional_licitaciones_2020_2021.zip, nacional_licitaciones_2022_2023.zip…), con tablas de detalle aparte: resultados por lote, adjudicatarios, criterios, lotes y modificaciones.
Cada fila es una versión de un expediente, no una licitación: hay que filtrar por es_ultima_version para no contar el mismo contrato varias veces. La adjudicación de la tabla principal es la del primer lote; el resto está en la tabla de resultados.
Estructura de datos
- id, expediente, objeto — Identificación del expediente
- organo_contratante, nif_organo, dir3_organo — Órgano de contratación
- tipo_contrato, procedimiento — Con sus códigos (_code)
- valor_estimado_contrato, importe_sin_iva, importe_con_iva — Importes de licitación
- importe_adjudicacion, importe_adj_con_iva — Adjudicación (primer lote)
- adjudicatario, nif_adjudicatario, num_ofertas, es_pyme
- cpv_principal, cpvs, nuts — Objeto y lugar de ejecución
- n_lotes, n_modificaciones, financiacion_ue, programas_financiacion
- conjunto — Licitaciones, agregadas, menores, encargos o consultas
- ano, es_ultima_version, n_versiones — Año del anuncio y control de versiones
Ejemplos de código
import pandas as pd
# ZIP nacional_licitaciones_2022_2023.zip de la release, descomprimido
df = pd.read_parquet(
'licitaciones_completo/licitaciones_completo_2022_2023.parquet',
columns=['conjunto', 'ano', 'nuts', 'tipo_contrato',
'adjudicatario', 'importe_adjudicacion', 'es_ultima_version'],
)
# Una fila por expediente: la última versión publicada
df = df[df['es_ultima_version']]
print(f'Expedientes: {len(df):,}')
# Andalucía (NUTS ES61)
andalucia = df[df['nuts'].str.startswith('ES61', na=False)]
print(f'Andalucía: {len(andalucia):,}')
# Top 10 adjudicatarios por importe (solo primer lote)
top = df.groupby('adjudicatario')['importe_adjudicacion'].sum()
print(top.sort_values(ascending=False).head(10)) import polars as pl
df = pl.scan_parquet('licitaciones_completo/*.parquet')
print(
df.filter(pl.col('es_ultima_version'))
.group_by('conjunto', 'tipo_contrato')
.agg(pl.len().alias('n'), pl.col('importe_sin_iva').sum().alias('importe_sin_iva'))
.sort('n', descending=True)
.collect()
)