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)
593 lines
13 KiB
TypeScript
593 lines
13 KiB
TypeScript
// Chart series normalised from the raw CBS rows (stats.cbs_obs → stats.series/obs).
|
|
// `dims` must match the observation's dimension codes exactly (see stats.cbs_code for titles).
|
|
import { GOUDA_RING } from './common';
|
|
|
|
export type CbsSeriesDef = {
|
|
id: string;
|
|
table: string;
|
|
measure: string;
|
|
dims?: Record<string, string>;
|
|
freq: 'M' | 'Q' | 'S' | 'A';
|
|
title: string;
|
|
unit: string;
|
|
theme: string;
|
|
region?: string;
|
|
/** Expand into one series per region (id suffixed with :<code>). */
|
|
regionDim?: string;
|
|
regions?: { code: string; region: string }[];
|
|
scale?: number;
|
|
};
|
|
|
|
export const RING = [
|
|
{ code: 'NL01', region: 'NLD' },
|
|
...GOUDA_RING.map((code) => ({ code, region: code }))
|
|
];
|
|
|
|
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')
|
|
}))
|
|
];
|