About the data
A reporting layer for World Bank country indicators with explicit coverage and source lineage.
Model grains and business keys
The country dimension has one row per country, keyed by country_iso3. The indicator dimension has one row per indicator, keyed by indicator_code. The fact table has one row per expected country, indicator and calendar year, keyed by country_iso3, indicator_code and year.
Completeness has one row per country and indicator. Missing data has one row per missing country, indicator and year. Year over year change retains the fact grain. Latest comparable year and latest available observation each have one row per country and indicator. Income group summaries have one row per indicator, income group and year. Run summary has one row per pipeline run, keyed by run_id.
Value status
Present means the API returned a numeric value, including zero. Null value means the API returned the combination with a null value. Not returned means the expected combination was absent from the response. Both missing statuses remain in the fact table and completeness denominator. No missing numeric value is filled with zero.
Year over year status
Change available means consecutive calendar years have values and the prior value is nonzero. First year marks the start of the selected period. Current missing and prior missing explain unavailable comparisons. Prior zero means a percentage change cannot be calculated; an absolute change can still be available. Percentage change is 100 times the difference divided by the prior value.
Comparisons and aggregation
Latest comparable year uses the reporting model's common year, while latest available observations preserve each country's own most recent value. Population and GDP totals are additive. GDP per capita and life expectancy use population weighted averages by default. Average and median give each country equal weight. Income group summaries cover only the selected countries. GDP is measured in current US dollars.
Stack and data delivery
Python and dbt build the reporting layer with DuckDB and export Parquet. Next.js 16 serves the dashboard and JSON routes with TypeScript and the Node.js runtime. DuckDB queries the bundled Parquet files at request time, and Recharts renders the charts. The dashboard does not query the World Bank API directly. Dates and timestamps display in UTC.