stats: /stats overview, economy, energy and Gouda pages; CBS series map; nav, homepage, /start and sitemap links
All checks were successful
Deploy production / deploy (push) Successful in 1m10s

- CBS_SERIES: CPI, household tariffs (2007-now), energy balance, renewables, heat pumps,
  solar, cars, population (monthly, since 1942, components), house prices, housing stock,
  municipal levies for Gouda and its neighbours
- shared StatChart/Kpi/chart helpers with per-chart source attribution
- drop Eurostat nrg_pc_20x_h (404; CBS covers that history)
This commit is contained in:
2026-10-25 20:50:47 +00:00
parent 6dcbcfee25
commit 76bfb3dcec
24 changed files with 3386 additions and 9 deletions

View File

@@ -23,4 +23,570 @@ export const RING = [
...GOUDA_RING.map((code) => ({ code, region: code }))
];
export const CBS_SERIES: CbsSeriesDef[] = [];
const ALL_REGIONS = [
{ code: 'NL01', region: 'NLD' },
{ code: 'GM0513', region: 'GM0513' }
];
const VAT = { Btw: 'A048944' };
const tariff = (
table: string,
measure: string,
id: string,
title: string,
unit: string
): CbsSeriesDef => ({
id,
table,
measure,
dims: VAT,
freq: 'M',
title,
unit,
theme: 'energy'
});
export const CBS_SERIES: CbsSeriesDef[] = [
// Consumer prices
{
id: 'cbs:cpi:yoy',
table: '86141NED',
measure: 'M000238',
dims: { Bestedingscategorieen: 'T001112' },
freq: 'M',
title: 'CPI inflation, all items',
unit: '% year on year',
theme: 'economy'
},
{
id: 'cbs:cpi:energy:yoy',
table: '86141NED',
measure: 'M000238',
dims: { Bestedingscategorieen: 'CPI045000' },
freq: 'M',
title: 'CPI inflation, electricity, gas and other fuels',
unit: '% year on year',
theme: 'energy'
},
{
id: 'cbs:cpi:food:yoy',
table: '86141NED',
measure: 'M000238',
dims: { Bestedingscategorieen: 'CPI011000' },
freq: 'M',
title: 'CPI inflation, food',
unit: '% year on year',
theme: 'economy'
},
{
id: 'cbs:cpi:1969',
table: '83136NED',
measure: 'M000215_1',
freq: 'M',
title: 'Consumer price index (1969 = 100)',
unit: 'Index 1969=100',
theme: 'economy'
},
{
id: 'cbs:rent:increase',
table: '70675ned',
measure: 'D001503',
freq: 'A',
title: 'Average rent increase',
unit: '%',
theme: 'economy'
},
// Energy tariffs (incl. VAT); _1 = gas, _2 = electricity
tariff(
'85592NED',
'M007924_2',
'cbs:tariff:elec:variable',
'Electricity: variable supply tariff (contract)',
'EUR per kWh'
),
tariff('85592NED', 'A045057_2', 'cbs:tariff:elec:tax', 'Electricity: energy tax', 'EUR per kWh'),
tariff(
'85592NED',
'M001013_2',
'cbs:tariff:elec:transport',
'Electricity: transport tariff',
'EUR per year'
),
tariff(
'85592NED',
'M000175_2',
'cbs:tariff:elec:fixed',
'Electricity: fixed supply tariff',
'EUR per year'
),
tariff(
'85592NED',
'M001284',
'cbs:tariff:elec:taxcredit',
'Electricity: energy tax reduction',
'EUR per year'
),
tariff(
'85592NED',
'M008381',
'cbs:tariff:elec:dynamic',
'Electricity: variable supply tariff (dynamic)',
'EUR per kWh'
),
tariff(
'85592NED',
'M007924_1',
'cbs:tariff:gas:variable',
'Gas: variable supply tariff (contract)',
'EUR per m3'
),
tariff('85592NED', 'A045057_1', 'cbs:tariff:gas:tax', 'Gas: energy tax', 'EUR per m3'),
tariff(
'85592NED',
'M001013_1',
'cbs:tariff:gas:transport',
'Gas: transport tariff',
'EUR per year'
),
tariff(
'85592NED',
'M000175_1',
'cbs:tariff:gas:fixed',
'Gas: fixed supply tariff',
'EUR per year'
),
tariff(
'84672NED',
'M000176_2',
'cbs:tariff1823:elec:variable',
'Electricity: variable supply tariff (2018-2023 series)',
'EUR per kWh'
),
tariff(
'84672NED',
'A045057_2',
'cbs:tariff1823:elec:tax',
'Electricity: energy tax (2018-2023 series)',
'EUR per kWh'
),
tariff(
'84672NED',
'M001285_2',
'cbs:tariff1823:elec:ode',
'Electricity: renewable energy surcharge ODE (2018-2023 series)',
'EUR per kWh'
),
tariff(
'84672NED',
'M000176_1',
'cbs:tariff1823:gas:variable',
'Gas: variable supply tariff (2018-2023 series)',
'EUR per m3'
),
tariff(
'84672NED',
'A045057_1',
'cbs:tariff1823:gas:tax',
'Gas: energy tax (2018-2023 series)',
'EUR per m3'
),
tariff(
'84672NED',
'M001285_1',
'cbs:tariff1823:gas:ode',
'Gas: renewable energy surcharge ODE (2018-2023 series)',
'EUR per m3'
),
// Average prices for small users 2007-2023 (quarterly), incl. VAT and taxes
{
id: 'cbs:price0723:elec',
table: '81309NED',
measure: 'D001522',
dims: { Belastingen: 'A047659', Prijscomponenten: 'A047656' },
freq: 'Q',
title: 'Electricity price, households 2.5-5 MWh (incl. VAT and taxes)',
unit: 'EUR per kWh',
theme: 'energy'
},
{
id: 'cbs:price0723:gas',
table: '81309NED',
measure: 'D001514',
dims: { Belastingen: 'A047659', Prijscomponenten: 'A047656' },
freq: 'Q',
title: 'Gas price, households 20-200 GJ (incl. VAT and taxes)',
unit: 'EUR per GJ',
theme: 'energy'
},
// Energy balance (PJ)
{
id: 'cbs:energy:tpes',
table: '83140NED',
measure: 'D002419',
dims: { Energiedragers: 'T001027' },
freq: 'A',
title: 'Total primary energy supply',
unit: 'PJ',
theme: 'energy'
},
{
id: 'cbs:energy:netimport',
table: '83140NED',
measure: 'M002205',
dims: { Energiedragers: 'T001027' },
freq: 'A',
title: 'Net energy imports',
unit: 'PJ',
theme: 'energy'
},
{
id: 'cbs:energy:production',
table: '83140NED',
measure: 'M002420',
dims: { Energiedragers: 'T001027' },
freq: 'A',
title: 'Domestic energy production',
unit: 'PJ',
theme: 'energy'
},
{
id: 'cbs:energy:gas:production',
table: '83140NED',
measure: 'M002420',
dims: { Energiedragers: 'E006560' },
freq: 'A',
title: 'Natural gas production',
unit: 'PJ',
theme: 'energy'
},
{
id: 'cbs:energy:gas:netimport',
table: '83140NED',
measure: 'M002205',
dims: { Energiedragers: 'E006560' },
freq: 'A',
title: 'Natural gas net imports',
unit: 'PJ',
theme: 'energy'
},
{
id: 'cbs:energy:gas:tpes',
table: '83140NED',
measure: 'D002419',
dims: { Energiedragers: 'E006560' },
freq: 'A',
title: 'Natural gas supply',
unit: 'PJ',
theme: 'energy'
},
// Renewable electricity
...(
[
['T001028', 'total', 'all renewables'],
['E006637', 'wind-onshore', 'onshore wind'],
['E006638', 'wind-offshore', 'offshore wind'],
['E006590', 'solar', 'solar'],
['E006566', 'biomass', 'biomass'],
['E006587', 'hydro', 'hydro']
] as const
).flatMap(([code, key, name]): CbsSeriesDef[] => [
{
id: `cbs:renew:${key}:gwh`,
table: '82610NED',
measure: 'M002264_1',
dims: { BronTechniek: code },
freq: 'A',
title: `Renewable electricity production: ${name}`,
unit: 'GWh',
theme: 'energy'
},
{
id: `cbs:renew:${key}:share`,
table: '82610NED',
measure: 'M002416_2',
dims: { BronTechniek: code },
freq: 'A',
title: `Renewable electricity, ${name} (normalised)`,
unit: '% of consumption',
theme: 'energy'
},
{
id: `cbs:renew:${key}:mw`,
table: '82610NED',
measure: 'M002163',
dims: { BronTechniek: code },
freq: 'A',
title: `Installed capacity: ${name}`,
unit: 'MW',
theme: 'energy'
}
]),
// Heat pumps (homes and all buildings)
{
id: 'cbs:heatpumps:homes',
table: '85523NED',
measure: 'D002272',
dims: { Sector: 'E007037', Warmtepompen: 'T001364' },
freq: 'A',
title: 'Heat pumps installed in homes (end of year)',
unit: 'count',
theme: 'energy'
},
{
id: 'cbs:heatpumps:homes:air',
table: '85523NED',
measure: 'D002272',
dims: { Sector: 'E007037', Warmtepompen: 'A043948' },
freq: 'A',
title: 'Air-source heat pumps in homes (end of year)',
unit: 'count',
theme: 'energy'
},
{
id: 'cbs:heatpumps:homes:ground',
table: '85523NED',
measure: 'D002272',
dims: { Sector: 'E007037', Warmtepompen: 'A043945' },
freq: 'A',
title: 'Ground/water-source heat pumps in homes (end of year)',
unit: 'count',
theme: 'energy'
},
{
id: 'cbs:heatpumps:homes:hybrid',
table: '85523NED',
measure: 'D002272',
dims: { Sector: 'E007037', Warmtepompen: 'A052046' },
freq: 'A',
title: 'Hybrid air-water heat pumps in homes (end of year)',
unit: 'count',
theme: 'energy'
},
{
id: 'cbs:heatpumps:new',
table: '85523NED',
measure: 'D002270',
dims: { Sector: 'E007041', Warmtepompen: 'T001364' },
freq: 'A',
title: 'Heat pumps put into use per year (all buildings)',
unit: 'count',
theme: 'energy'
},
// Solar (NL and Gouda)
{
id: 'cbs:solar:kwp',
table: '85005NED',
measure: 'M002461',
dims: { SectorEnVermogensklasse: 'E007161' },
freq: 'A',
title: 'Installed solar panel capacity (all)',
unit: 'kWp',
theme: 'energy',
regionDim: 'RegioS',
regions: ALL_REGIONS
},
{
id: 'cbs:solar:homes:kwp',
table: '85005NED',
measure: 'M002461',
dims: { SectorEnVermogensklasse: 'E007037' },
freq: 'A',
title: 'Installed solar panel capacity on homes',
unit: 'kWp',
theme: 'energy',
regionDim: 'RegioS',
regions: ALL_REGIONS
},
{
id: 'cbs:solar:homes:n',
table: '85005NED',
measure: 'M002460',
dims: { SectorEnVermogensklasse: 'E007037' },
freq: 'A',
title: 'Solar installations on homes',
unit: 'count',
theme: 'energy',
regionDim: 'RegioS',
regions: ALL_REGIONS
},
// Passenger cars (1 January)
{
id: 'cbs:cars:total',
table: '85237NED',
measure: 'T001051',
dims: { Bouwjaar: 'T001378' },
freq: 'A',
title: 'Passenger cars (1 January)',
unit: 'count',
theme: 'energy'
},
{
id: 'cbs:cars:electric',
table: '85237NED',
measure: 'A027842',
dims: { Bouwjaar: 'T001378' },
freq: 'A',
title: 'Fully electric passenger cars (1 January)',
unit: 'count',
theme: 'energy'
},
{
id: 'cbs:cars:petrol',
table: '85237NED',
measure: 'A019276',
dims: { Bouwjaar: 'T001378' },
freq: 'A',
title: 'Petrol passenger cars (1 January)',
unit: 'count',
theme: 'energy'
},
{
id: 'cbs:cars:diesel',
table: '85237NED',
measure: 'A019275',
dims: { Bouwjaar: 'T001378' },
freq: 'A',
title: 'Diesel passenger cars (1 January)',
unit: 'count',
theme: 'energy'
},
// Population (Gouda, the ring and NL)
{
id: 'cbs:pop:monthly',
table: '37230ned',
measure: 'M000099',
freq: 'M',
title: 'Population at the end of the month',
unit: 'people',
theme: 'gouda',
regionDim: 'RegioS',
regions: RING
},
{
id: 'cbs:pop:jan1',
table: '37259ned',
measure: 'M000352',
dims: { Geslacht: 'T001038' },
freq: 'A',
title: 'Population on 1 January',
unit: 'people',
theme: 'gouda',
regionDim: 'RegioS',
regions: RING
},
...(
[
['D000128_2', 'births', 'Live births'],
['M000134_2', 'deaths', 'Deaths'],
['M000167', 'immigration', 'Immigration'],
['M000168', 'emigration', 'Emigration (incl. administrative corrections)'],
['M003485_1', 'in', 'Moved in from another municipality'],
['M003485_2', 'out', 'Moved out to another municipality'],
['M000101_2', 'growth', 'Total population growth']
] as const
).map(([measure, key, title]): CbsSeriesDef => ({
id: `cbs:pop:${key}`,
table: '37259ned',
measure,
dims: { Geslacht: 'T001038' },
freq: 'A',
title,
unit: 'people',
theme: 'gouda',
regionDim: 'RegioS',
regions: ALL_REGIONS
})),
// Housing
{
id: 'cbs:house:avgprice',
table: '83625NED',
measure: 'M001534',
freq: 'A',
title: 'Average sale price of existing homes',
unit: 'EUR',
theme: 'gouda',
regionDim: 'RegioS',
regions: RING
},
{
id: 'cbs:house:hpi:cr28',
table: '85819NED',
measure: 'M001505_2',
dims: { RegioS: 'CR28' },
freq: 'Q',
title: 'House price index, Oost-Zuid-Holland (COROP, incl. Gouda)',
unit: 'Index 2020=100',
theme: 'gouda',
region: 'CR28'
},
{
id: 'cbs:house:hpi:nl',
table: '85773NED',
measure: 'M001505_2',
freq: 'M',
title: 'House price index, Netherlands',
unit: 'Index 2020=100',
theme: 'economy'
},
{
id: 'cbs:house:avgprice:nl:m',
table: '85773NED',
measure: 'M001534',
freq: 'M',
title: 'Average sale price of existing homes, Netherlands',
unit: 'EUR',
theme: 'economy'
},
{
id: 'cbs:house:sold:nl:m',
table: '85773NED',
measure: 'M001532_2',
freq: 'M',
title: 'Existing homes sold, Netherlands',
unit: 'homes',
theme: 'economy'
},
...(
[
['T001258', 'total', 'Housing stock'],
['A028868', 'owner', 'Owner-occupied homes'],
['A047038', 'social', 'Housing association rentals'],
['A047039', 'private', 'Other (private) rentals']
] as const
).map(([code, key, title]): CbsSeriesDef => ({
id: `cbs:stock:${key}`,
table: '86079NED',
measure: 'M000297',
dims: {
EigendomWoning: code,
Bouwjaar: 'T001018',
Woningtype: 'T001100',
BewoningWoonruimte: 'T001697'
},
freq: 'A',
title,
unit: 'homes',
theme: 'gouda',
regionDim: 'RegioS',
regions: RING
})),
// Municipal levies per inhabitant (Gouda + ring)
...(
[
['T001473', 'total', 'Municipal levies, total'],
['A047000', 'ozb', 'Property tax (OZB) on homes'],
['A047006', 'sewer', 'Sewerage charge'],
['A047007', 'waste', 'Waste collection charge']
] as const
).map(([code, key, title]): CbsSeriesDef => ({
id: `cbs:levy:${key}`,
table: '83642NED',
measure: 'M001178_2',
dims: { GemeentelijkeHeffingenVanaf2017: code },
freq: 'A',
title: `${title} per inhabitant`,
unit: 'EUR per inhabitant',
theme: 'gouda',
regionDim: 'RegioS',
regions: RING.filter((r) => r.code !== 'NL01')
}))
];