Dataset BQuant Finance

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

Cargar un periodo con pandas python
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))
Contar por conjunto y tipo con polars python
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()
)