One file, 121 indicators: a European country-profile dataset
Cross-country macro analysis has a boring, expensive bottleneck: assembly. The numbers are all public — Eurostat, the OECD, the World Bank — but they live behind three different APIs, in three different code systems, on three different grains. Building one clean panel where GDP, inflation, life expectancy and R&D intensity sit side by side, aligned on country and year, is days of plumbing before you write a single line of analysis.
We built that panel once. It is 121 indicators wide.
What is in it
The European Country Profile joins, for every European country and year, indicators across fourteen domains:
- Macro — GDP levels and growth, and its expenditure components
- Prices — HICP headline and the full COICOP basket breakdown
- Labour — unemployment, activity and long-term-unemployment rates
- Public finance — deficit, debt, and spending by government function
- Demographics — population, life expectancy, fertility, ageing
- Inequality — Gini, at-risk-of-poverty, quintile ratios
- Health — expenditure per capita and as % of GDP, hospital beds, physicians
- Education — attainment shares and spend per pupil
- Digital — household internet, individual use, e-commerce reach
- R&D — gross R&D intensity, total and by performing sector
- Wages — labour-cost index, minimum and net earnings
- Energy — prices, import dependency and renewable share
- Construction and environment round it out
That is the difference between a dataset and a *panel*: you are not buying one indicator, you are buying the ability to ask "does higher R&D intensity track lower long-term unemployment across the continent" without a single join of your own.
Why one join key changes everything
The value is not the 121 columns; it is that they share one grain — country by year — so every question is a groupby, never an ETL project. Getting there means resolving the grain clash: quarterly GDP and monthly inflation are annualised to meet the annual indicators, and the annualisation rule is not uniform. Rates and indices take an annual mean; flows (person-nights, passenger counts) are summed; period-change series (quarter-on-quarter growth) are dropped from the annual join entirely because averaging them is meaningless.
The methodology we locked, so you do not have to guess
- Aggregates excluded. Euro-area and EU aggregates are dropped from the country dimension so a naive average is not double-counting a bloc as a "country."
- Latest period, honestly labelled. Annual sources publish with a lag; the product shows the *data-through* date and flags "latest period available," so a 2024 endpoint reads as normal cadence, not stale data.
- Provenance per column. Every indicator names its Eurostat / OECD upstream and its licence. The whole thing is CC-BY and AI-training-safe — a documented, personal-data-free corpus you can publish or train on.
What it is good for
Cross-country dashboards that would otherwise need a dozen source connectors. Regression panels where you need controls (population, GDP, education) already aligned to your outcome. Feature stores for macro models. And, increasingly, training data for tabular and agentic AI — one coherent, licence-clean file an agent can reason over without scraping anything.
If your scope is global rather than European, the sibling Global Country Profile does the same job across ~200 countries from World Bank and OECD sources. Prefer the raw single-domain feeds? They are all here too — European inflation, GDP, the labour market and demographics — each cleaned to the same standard and ready to join back to the profile.
Stop building parsers. Start at the analysis.
We've already cleaned, documented and QC'd sources like the one in this post into query-ready Parquet - with a free sample on every dataset. Buy a file from €9, or go All-Access for the lot.