diff --git a/FETCH-MANIFEST-EUROSTAT.json b/FETCH-MANIFEST-EUROSTAT.json index df260f57..0aa532c5 100644 --- a/FETCH-MANIFEST-EUROSTAT.json +++ b/FETCH-MANIFEST-EUROSTAT.json @@ -14,6 +14,12 @@ "destination": "db/data/eurostat/spr_exp_func/spr_exp_func.json", "sha256": "24ad3c0115efef790ff8cb2ff8fb269d4ceb7de70ac3fad673ebd1340e4f650f" }, + { + "dataset_id": "nasa_10_nf_tr", + "source_url": "https://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/nasa_10_nf_tr?format=JSON&lang=en&freq=A&unit=CP_MEUR§or=S14_S15&na_item=B2G&na_item=B3G&na_item=B3N&na_item=B6G&na_item=D1&na_item=D11&na_item=D12&na_item=D4&na_item=D41&na_item=D42&na_item=D44&na_item=D45&na_item=D5&na_item=D61&na_item=D62&direct=RECV&direct=PAID&geo=BE&time=2022&time=2023&time=2024", + "destination": "db/data/eurostat/nasa_10_nf_tr/nasa_10_nf_tr.json", + "sha256": "30d3f5bf3d1414c78633d13f505558b837b84e92c24b17050249ab19cec20a6d" + }, { "dataset_id": "ilc_li02", "source_url": "https://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/ilc_li02?format=JSON&lang=en&freq=A&statinfo=MED_EI&unit=PC&rskpovth=B_60&sex=T&age=TOTAL&geo=BE&geo=DE&geo=FR&time=2024", @@ -27,4 +33,4 @@ "sha256": "1c3bb1277f98f257d00725ded6b6d8b1678834329eb6b66954b8f42c19a0ad17" } ] -} \ No newline at end of file +} diff --git a/LANE_C2_REPORT.md b/LANE_C2_REPORT.md new file mode 100644 index 00000000..6873346f --- /dev/null +++ b/LANE_C2_REPORT.md @@ -0,0 +1,446 @@ +# Lane C2 — Belgium national accounts and JRC external rows + +## Outcome and source-boundary decisions + +This lane adds the hash-pinned Eurostat `nasa_10_nf_tr` package and extends the +JRC EUROMOD Belgium comparator. The Eurostat build preserves all 84 JSON-stat +cube positions and emits facts for exactly the 78 populated publisher +observations. The JRC build now contains 41 facts: 25 administrative External +statistics, 14 model-output values, and 2 EU-SILC survey aggregates. No R2 +upload was performed; both manifests record only the content-addressed keys. + +The cached PDF resolves three material ambiguities in the task shorthand: + +- The Annex columns put most requested External series in publisher periods + 2021–2023, not 2022–2024. Chronicle preserves the printed periods. A consumer + that needs another period must supply an explicit `PeriodAlignmentDeclaration`; + Chronicle returns the published level and never an aligned number. +- The `poa=2,273k` and `psu=79k` observations are in the SILC column. Their + External cells are `NaN`, so they are stored as `survey_aggregate` and are + validation-only. +- The Annex names NBB for child-benefit amounts, not FAMIFED or a regional + agency. It names FPD/SFPD only for elderly-income-support recipient counts, + whose External cells are absent. The `yse` source continuation is a dash, so + no primary issuer was invented. + +These findings come from commands C1–C3 below. All fact-table values and source +coordinates come mechanically from command C4; all build and validation counts +come from commands C5–C8. + +## Artifact pins + +| Artifact | SHA-256 | Bytes | Command | +|---|---|---:|---| +| `nasa_10_nf_tr.json` | `30d3f5bf3d1414c78633d13f505558b837b84e92c24b17050249ab19cec20a6d` | 5,098 | C1 | +| curated JRC CSV | `2ef69251a72caaab042706c77143fa4f86dde2f800747ebb421b5f7b9a45e394` | 6,956 | C1 | +| cached JRC PDF | `7c4b0aa4f1f96161e1ce7e4ad300a3fa56cdad7241f82fb650eeec03d30f087b` | 4,184,683 | C1 | + +Recorded storage pointers (metadata only; not uploaded in this lane): + +- `raw/eurostat/eurostat-nasa-10-nf-tr/2024/30d3f5bf3d1414c78633d13f505558b837b84e92c24b17050249ab19cec20a6d/nasa_10_nf_tr.json` +- `raw/belgium/jrc-euromod-be-baseline-statistics-2025/2025/2ef69251a72caaab042706c77143fa4f86dde2f800747ebb421b5f7b9a45e394/jrc_euromod_be_baseline_statistics_2025.csv` + +The JRC CSV's original header plus 18 rows are byte-for-byte unchanged; 23 rows +were appended. After stripping its trailing newline, the Eurostat +`SOURCE_URL.txt` equals the manifest `source_url`. The request included B3N, +but the returned cube has no B3N category. Its six null coordinates are +PAID/D42 and RECV/D5 for each of 2022–2024; none was turned into a fact. + +## Eurostat fact table + +Command C4 emitted this inventory. “Parsed row” is the 1-based row in the +complete 84-coordinate JSON-stat parse; `H…` is the selected-row virtual-sheet +value cell. Source values are current-price million euro (`CP_MEUR`); compiled +facts apply the declared `value_scale: 1000000`. Eurostat marks every populated +2024 observation provisional (`status=p`). + +| Concept (`layout.groupby_value_id`) | ESA item | Direction | Year | Compiled value (EUR) | Source coordinate | +|---|---:|---|---:|---:|---| +| `belgium_household_operating_surplus_gross` | B2G | PAID | 2022 | 36,960,000,000 | `source_index=0`, parsed row 1, `H2` | +| `belgium_household_mixed_income_gross` | B3G | PAID | 2022 | 36,718,000,000 | `source_index=3`, parsed row 4, `H3` | +| `belgium_household_disposable_income_gross` | B6G | PAID | 2022 | 329,780,000,000 | `source_index=6`, parsed row 7, `H4` | +| `belgium_household_compensation_of_employees_paid` | D1 | PAID | 2022 | 6,011,000,000 | `source_index=9`, parsed row 10, `H5` | +| `belgium_household_wages_and_salaries_paid` | D11 | PAID | 2022 | 4,758,000,000 | `source_index=12`, parsed row 13, `H6` | +| `belgium_household_employers_social_contributions_paid` | D12 | PAID | 2022 | 1,253,000,000 | `source_index=15`, parsed row 16, `H7` | +| `belgium_household_property_income_paid` | D4 | PAID | 2022 | 4,940,000,000 | `source_index=18`, parsed row 19, `H8` | +| `belgium_household_interest_paid` | D41 | PAID | 2022 | 4,572,000,000 | `source_index=21`, parsed row 22, `H9` | +| `belgium_household_other_investment_income_paid` | D44 | PAID | 2022 | 0 | `source_index=27`, parsed row 28, `H10` | +| `belgium_household_rents_paid` | D45 | PAID | 2022 | 368,000,000 | `source_index=30`, parsed row 31, `H11` | +| `belgium_household_current_taxes_on_income_paid` | D5 | PAID | 2022 | 69,114,000,000 | `source_index=33`, parsed row 34, `H12` | +| `belgium_household_net_social_contributions_paid` | D61 | PAID | 2022 | 99,704,000,000 | `source_index=36`, parsed row 37, `H13` | +| `belgium_household_social_benefits_paid` | D62 | PAID | 2022 | 64,000,000 | `source_index=39`, parsed row 40, `H14` | +| `belgium_household_operating_surplus_gross` | B2G | RECV | 2022 | 36,960,000,000 | `source_index=42`, parsed row 43, `H15` | +| `belgium_household_mixed_income_gross` | B3G | RECV | 2022 | 36,718,000,000 | `source_index=45`, parsed row 46, `H16` | +| `belgium_household_disposable_income_gross` | B6G | RECV | 2022 | 329,780,000,000 | `source_index=48`, parsed row 49, `H17` | +| `belgium_household_compensation_of_employees_received` | D1 | RECV | 2022 | 277,464,000,000 | `source_index=51`, parsed row 52, `H18` | +| `belgium_household_wages_and_salaries_received` | D11 | RECV | 2022 | 209,481,000,000 | `source_index=54`, parsed row 55, `H19` | +| `belgium_household_employers_social_contributions_received` | D12 | RECV | 2022 | 67,983,000,000 | `source_index=57`, parsed row 58, `H20` | +| `belgium_household_property_income_received` | D4 | RECV | 2022 | 40,867,000,000 | `source_index=60`, parsed row 61, `H21` | +| `belgium_household_interest_received` | D41 | RECV | 2022 | 6,334,000,000 | `source_index=63`, parsed row 64, `H22` | +| `belgium_household_distributed_income_of_corporations_received` | D42 | RECV | 2022 | 23,090,000,000 | `source_index=66`, parsed row 67, `H23` | +| `belgium_household_other_investment_income_received` | D44 | RECV | 2022 | 10,463,000,000 | `source_index=69`, parsed row 70, `H24` | +| `belgium_household_rents_received` | D45 | RECV | 2022 | 980,000,000 | `source_index=72`, parsed row 73, `H25` | +| `belgium_household_net_social_contributions_received` | D61 | RECV | 2022 | 64,000,000 | `source_index=78`, parsed row 79, `H26` | +| `belgium_household_social_benefits_received` | D62 | RECV | 2022 | 108,435,000,000 | `source_index=81`, parsed row 82, `H27` | +| `belgium_household_operating_surplus_gross` | B2G | PAID | 2023 | 41,351,000,000 | `source_index=1`, parsed row 2, `H28` | +| `belgium_household_mixed_income_gross` | B3G | PAID | 2023 | 38,850,000,000 | `source_index=4`, parsed row 5, `H29` | +| `belgium_household_disposable_income_gross` | B6G | PAID | 2023 | 359,164,000,000 | `source_index=7`, parsed row 8, `H30` | +| `belgium_household_compensation_of_employees_paid` | D1 | PAID | 2023 | 6,174,000,000 | `source_index=10`, parsed row 11, `H31` | +| `belgium_household_wages_and_salaries_paid` | D11 | PAID | 2023 | 4,919,000,000 | `source_index=13`, parsed row 14, `H32` | +| `belgium_household_employers_social_contributions_paid` | D12 | PAID | 2023 | 1,255,000,000 | `source_index=16`, parsed row 17, `H33` | +| `belgium_household_property_income_paid` | D4 | PAID | 2023 | 11,584,000,000 | `source_index=19`, parsed row 20, `H34` | +| `belgium_household_interest_paid` | D41 | PAID | 2023 | 11,184,000,000 | `source_index=22`, parsed row 23, `H35` | +| `belgium_household_other_investment_income_paid` | D44 | PAID | 2023 | 0 | `source_index=28`, parsed row 29, `H36` | +| `belgium_household_rents_paid` | D45 | PAID | 2023 | 400,000,000 | `source_index=31`, parsed row 32, `H37` | +| `belgium_household_current_taxes_on_income_paid` | D5 | PAID | 2023 | 72,794,000,000 | `source_index=34`, parsed row 35, `H38` | +| `belgium_household_net_social_contributions_paid` | D61 | PAID | 2023 | 108,000,000,000 | `source_index=37`, parsed row 38, `H39` | +| `belgium_household_social_benefits_paid` | D62 | PAID | 2023 | 62,000,000 | `source_index=40`, parsed row 41, `H40` | +| `belgium_household_operating_surplus_gross` | B2G | RECV | 2023 | 41,351,000,000 | `source_index=43`, parsed row 44, `H41` | +| `belgium_household_mixed_income_gross` | B3G | RECV | 2023 | 38,850,000,000 | `source_index=46`, parsed row 47, `H42` | +| `belgium_household_disposable_income_gross` | B6G | RECV | 2023 | 359,164,000,000 | `source_index=49`, parsed row 50, `H43` | +| `belgium_household_compensation_of_employees_received` | D1 | RECV | 2023 | 299,696,000,000 | `source_index=52`, parsed row 53, `H44` | +| `belgium_household_wages_and_salaries_received` | D11 | RECV | 2023 | 226,018,000,000 | `source_index=55`, parsed row 56, `H45` | +| `belgium_household_employers_social_contributions_received` | D12 | RECV | 2023 | 73,677,000,000 | `source_index=58`, parsed row 59, `H46` | +| `belgium_household_property_income_received` | D4 | RECV | 2023 | 52,674,000,000 | `source_index=61`, parsed row 62, `H47` | +| `belgium_household_interest_received` | D41 | RECV | 2023 | 15,962,000,000 | `source_index=64`, parsed row 65, `H48` | +| `belgium_household_distributed_income_of_corporations_received` | D42 | RECV | 2023 | 25,012,000,000 | `source_index=67`, parsed row 68, `H49` | +| `belgium_household_other_investment_income_received` | D44 | RECV | 2023 | 10,605,000,000 | `source_index=70`, parsed row 71, `H50` | +| `belgium_household_rents_received` | D45 | RECV | 2023 | 1,094,000,000 | `source_index=73`, parsed row 74, `H51` | +| `belgium_household_net_social_contributions_received` | D61 | RECV | 2023 | 62,000,000 | `source_index=79`, parsed row 80, `H52` | +| `belgium_household_social_benefits_received` | D62 | RECV | 2023 | 116,832,000,000 | `source_index=82`, parsed row 83, `H53` | +| `belgium_household_operating_surplus_gross` | B2G | PAID | 2024 | 41,447,000,000 | `source_index=2`, parsed row 3, `H54` | +| `belgium_household_mixed_income_gross` | B3G | PAID | 2024 | 39,700,000,000 | `source_index=5`, parsed row 6, `H55` | +| `belgium_household_disposable_income_gross` | B6G | PAID | 2024 | 369,313,000,000 | `source_index=8`, parsed row 9, `H56` | +| `belgium_household_compensation_of_employees_paid` | D1 | PAID | 2024 | 6,359,000,000 | `source_index=11`, parsed row 12, `H57` | +| `belgium_household_wages_and_salaries_paid` | D11 | PAID | 2024 | 4,978,000,000 | `source_index=14`, parsed row 15, `H58` | +| `belgium_household_employers_social_contributions_paid` | D12 | PAID | 2024 | 1,381,000,000 | `source_index=17`, parsed row 18, `H59` | +| `belgium_household_property_income_paid` | D4 | PAID | 2024 | 10,622,000,000 | `source_index=20`, parsed row 21, `H60` | +| `belgium_household_interest_paid` | D41 | PAID | 2024 | 10,226,000,000 | `source_index=23`, parsed row 24, `H61` | +| `belgium_household_other_investment_income_paid` | D44 | PAID | 2024 | 0 | `source_index=29`, parsed row 30, `H62` | +| `belgium_household_rents_paid` | D45 | PAID | 2024 | 396,000,000 | `source_index=32`, parsed row 33, `H63` | +| `belgium_household_current_taxes_on_income_paid` | D5 | PAID | 2024 | 77,033,000,000 | `source_index=35`, parsed row 36, `H64` | +| `belgium_household_net_social_contributions_paid` | D61 | PAID | 2024 | 112,346,000,000 | `source_index=38`, parsed row 39, `H65` | +| `belgium_household_social_benefits_paid` | D62 | PAID | 2024 | 86,000,000 | `source_index=41`, parsed row 42, `H66` | +| `belgium_household_operating_surplus_gross` | B2G | RECV | 2024 | 41,447,000,000 | `source_index=44`, parsed row 45, `H67` | +| `belgium_household_mixed_income_gross` | B3G | RECV | 2024 | 39,700,000,000 | `source_index=47`, parsed row 48, `H68` | +| `belgium_household_disposable_income_gross` | B6G | RECV | 2024 | 369,313,000,000 | `source_index=50`, parsed row 51, `H69` | +| `belgium_household_compensation_of_employees_received` | D1 | RECV | 2024 | 310,278,000,000 | `source_index=53`, parsed row 54, `H70` | +| `belgium_household_wages_and_salaries_received` | D11 | RECV | 2024 | 233,080,000,000 | `source_index=56`, parsed row 57, `H71` | +| `belgium_household_employers_social_contributions_received` | D12 | RECV | 2024 | 77,198,000,000 | `source_index=59`, parsed row 60, `H72` | +| `belgium_household_property_income_received` | D4 | RECV | 2024 | 52,437,000,000 | `source_index=62`, parsed row 63, `H73` | +| `belgium_household_interest_received` | D41 | RECV | 2024 | 13,943,000,000 | `source_index=65`, parsed row 66, `H74` | +| `belgium_household_distributed_income_of_corporations_received` | D42 | RECV | 2024 | 26,144,000,000 | `source_index=68`, parsed row 69, `H75` | +| `belgium_household_other_investment_income_received` | D44 | RECV | 2024 | 11,223,000,000 | `source_index=71`, parsed row 72, `H76` | +| `belgium_household_rents_received` | D45 | RECV | 2024 | 1,128,000,000 | `source_index=74`, parsed row 75, `H77` | +| `belgium_household_net_social_contributions_received` | D61 | RECV | 2024 | 86,000,000 | `source_index=80`, parsed row 81, `H78` | +| `belgium_household_social_benefits_received` | D62 | RECV | 2024 | 124,608,000,000 | `source_index=83`, parsed row 84, `H79` | + +## JRC requested fact table + +This table includes the 23 appended rows plus the two pre-existing 2023 +child-benefit and unemployment-benefit External amount rows needed to show the +complete requested series. The rest of the original 18-row curated file was not +rewritten. Publisher and compiled values are generated by C4; PDF locations and +issuers are verified by C2. + +| Fine series | Metric | Year | Publisher value | Compiled fact | Provenance | Source row and report evidence | +|---|---|---:|---:|---:|---|---| +| `a3_1_self_employment_income_external_2022` | `self_employment_income_yse` | 2022 | 1,257 thousand | 1,257,000 count | administrative | CSV 22 / `G22`; A3.1 report 112, PDF 114; source row is `-` on PDF 115, so no issuer is identified | +| `a3_2_employment_income_external_2021` | `employment_income_yem` | 2021 | 147,112 million EUR | 147,112,000,000 EUR | administrative | CSV 27 / `G27`; A3.2 report 114, PDF 116; RSZ/ONSS on PDF 115 | +| `a3_2_employment_income_external_2022` | `employment_income_yem` | 2022 | 161,644 million EUR | 161,644,000,000 EUR | administrative | CSV 33 / `G33`; A3.2 report 114, PDF 116; RSZ/ONSS on PDF 115 | +| `a3_2_employment_income_external_2023` | `employment_income_yem` | 2023 | 175,998 million EUR | 175,998,000,000 EUR | administrative | CSV 39 / `G39`; A3.2 report 114, PDF 116; RSZ/ONSS on PDF 115 | +| `a3_4_capital_income_tax_external_2021` | `capital_income_tax_tinkt_s` | 2021 | 3,522 million EUR | 3,522,000,000 EUR | administrative | CSV 28 / `G28`; A3.4 report 118, PDF 120; NBB on PDF 118 | +| `a3_4_capital_income_tax_external_2022` | `capital_income_tax_tinkt_s` | 2022 | 4,152 million EUR | 4,152,000,000 EUR | administrative | CSV 34 / `G34`; A3.4 report 118, PDF 120; NBB on PDF 118 | +| `a3_5_income_support_external_2021` | `income_support_bsa_s` | 2021 | 215 thousand | 215,000 count | administrative | CSV 20 / `G20`; A3.5 report 120, PDF 122; POD MI/SPP IS recipients on PDF 124 | +| `a3_5_income_support_external_2022` | `income_support_bsa_s` | 2022 | 241 thousand | 241,000 count | administrative | CSV 23 / `G23`; A3.5 report 120, PDF 122; POD MI/SPP IS recipients on PDF 124 | +| `a3_5_unemployment_benefits_external_2021` | `unemployment_benefits_bun` | 2021 | 992 thousand | 992,000 count | administrative | CSV 21 / `G21`; A3.5 report 120, PDF 122; RVA/ONEM on PDF 125 | +| `a3_5_unemployment_benefits_external_2022` | `unemployment_benefits_bun` | 2022 | 813 thousand | 813,000 count | administrative | CSV 24 / `G24`; A3.5 report 120, PDF 122; RVA/ONEM on PDF 125 | +| `a3_5_old_age_pension_silc_2022` | `old_age_pension_poa` | 2022 | 2,273 thousand | 2,273,000 count | survey_aggregate | CSV 25 / `G25`; A3.5 report 120, PDF 122; SILC column, External is `NaN`, source is `-` on PDF 124 | +| `a3_5_survivor_pension_silc_2022` | `survivor_pension_psu` | 2022 | 79 thousand | 79,000 count | survey_aggregate | CSV 26 / `G26`; A3.5 report 120, PDF 122; SILC column, External is `NaN`, source is `-` on PDF 124 | +| `a3_6_income_support_external_2021` | `income_support_bsa_s` | 2021 | 1,656 million EUR | 1,656,000,000 EUR | administrative | CSV 29 / `G29`; A3.6 report 125, PDF 127; NBB amounts on PDF 124 | +| `a3_6_income_support_external_2022` | `income_support_bsa_s` | 2022 | 1,809 million EUR | 1,809,000,000 EUR | administrative | CSV 35 / `G35`; A3.6 report 125, PDF 127; NBB amounts on PDF 124 | +| `a3_6_income_support_external_2023` | `income_support_bsa_s` | 2023 | 2,049 million EUR | 2,049,000,000 EUR | administrative | CSV 41 / `G41`; A3.6 report 125, PDF 127; NBB amounts on PDF 124 | +| `a3_6_income_support_elderly_external_2021` | `income_support_elderly_bsaoa_s` | 2021 | 767 million EUR | 767,000,000 EUR | administrative | CSV 30 / `G30`; A3.6 report 125, PDF 127; NBB amounts on PDF 124 | +| `a3_6_income_support_elderly_external_2022` | `income_support_elderly_bsaoa_s` | 2022 | 824 million EUR | 824,000,000 EUR | administrative | CSV 36 / `G36`; A3.6 report 125, PDF 127; NBB amounts on PDF 124 | +| `a3_6_income_support_elderly_external_2023` | `income_support_elderly_bsaoa_s` | 2023 | 941 million EUR | 941,000,000 EUR | administrative | CSV 42 / `G42`; A3.6 report 125, PDF 127; NBB amounts on PDF 124 | +| `a3_6_child_benefits_external_2021` | `child_benefits_bch_s` | 2021 | 7,305 million EUR | 7,305,000,000 EUR | administrative | CSV 31 / `G31`; A3.6 report 125, PDF 127; NBB on PDF 124 | +| `a3_6_child_benefits_external_2022` | `child_benefits_bch_s` | 2022 | 7,738 million EUR | 7,738,000,000 EUR | administrative | CSV 37 / `G37`; A3.6 report 125, PDF 127; NBB on PDF 124 | +| `a3_6_child_benefits_external_2023` | `child_benefits` | 2023 | 8,191 million EUR | 8,191,000,000 EUR | administrative | Existing CSV 7 / `G7`; A3.6 report 125, PDF 127; NBB on PDF 124 | +| `a3_6_unemployment_benefits_external_2021` | `unemployment_benefits_bun` | 2021 | 8,197 million EUR | 8,197,000,000 EUR | administrative | CSV 32 / `G32`; A3.6 report 125, PDF 127; RVA/ONEM on PDF 125 | +| `a3_6_unemployment_benefits_external_2022` | `unemployment_benefits_bun` | 2022 | 6,670 million EUR | 6,670,000,000 EUR | administrative | CSV 38 / `G38`; A3.6 report 125, PDF 127; RVA/ONEM on PDF 125 | +| `a3_6_unemployment_benefits_external_2023` | `unemployment_benefits` | 2023 | 6,391 million EUR | 6,391,000,000 EUR | administrative | Existing CSV 9 / `G9`; A3.6 report 125, PDF 127; RVA/ONEM on PDF 125 | +| `a3_6_old_age_survivor_pension_external_2023` | `old_age_survivor_pension_il_ext_poapsu` | 2023 | 64,443 million EUR | 64,443,000,000 EUR | administrative | CSV 40 / `G40`; A3.6 continuation report 127, PDF 129; NBB on PDF 126 | + +The other two administrative JRC facts are the pre-existing 2023 national- +income-tax and employee-SIC External sums. They were moved out of the formerly +mixed `model_output` record set into the administrative record set without +changing their CSV rows or values. + +## Microcosm mapping + +Chronicle does not activate targets. For Microcosm consumption, the eligible +source facts and the hard exclusions are: + +- Candidate calibration-grade source sums: all 78 Eurostat facts + (`administrative`, `aggregation: sum`) and all 25 JRC External administrative + facts (5 recipient-count sums and 20 annual-amount sums). Each remains subject + to the exact definition and period below. +- Validation-only: the 2 SILC `poa`/`psu` recipient-count facts and all 14 JRC + `model_output` facts, including EUROMOD values, ratios, Gini, and poverty + statistics. A `sum` aggregation never overrides survey/model provenance. +- Do not simultaneously target overlapping national-account rows: B2G/B3G/B6G + are duplicate balancing levels under PAID and RECV; D1 equals the D11+D12 + hierarchy; D4 overlaps its components; D62 overlaps benefit-specific sums. +- The YSE External count is stored exactly as JRC's External statistic, but the + report gives no primary issuer. That unknown issuer is a downstream caveat. +- Any selection, reconciliation, aging, period alignment, support-aware + activation, or solver construction belongs to Microcosm, never Chronicle. + +### National-account definitional gaps + +Every row covers institutional sector `S14_S15`, which includes NPISH alongside +households. That is a common scope gap against household/person microdata. PAID +and RECV are sector-account uses/resources, not person-level signs. + +| ESA item | Likely Axiom/EUROMOD target | Known gap | +|---|---|---| +| B2G | household gross operating surplus | Gross production balance for household/NPISH producers, not generic cash capital income; repeated under both directions. | +| B3G | `yse` / mixed income | Gross of consumption of fixed capital and combines labour and capital returns of unincorporated enterprises; broader than survey self-employment cash income; repeated under both directions. | +| B6G | gross disposable income | National-account balancing item with imputed components and NPISH, not a simple sum of survey cash disposable income; repeated under both directions. | +| D1 | compensation of employees | D11 + D12; do not target alongside both components. PAID is households/NPISH as employers; RECV is the resident-sector resource. | +| D11 | `yem` / wages and salaries | ESA cash-and-in-kind wages under residence/sector accounting differ from EUROMOD/SILC and ONSS wage concepts. | +| D12 | employers' social contributions | Includes actual and imputed contributions. On the resource side it is imputed to households and is not cash wages or disposable income. | +| D4 | property income | Overlaps D41, D42, D44, D45 and may contain other ESA components; not an independent survey capital-income target if components are used. | +| D41 | interest | FISIM-adjusted ESA interest, not gross bank interest and not taxable movable income. | +| D42 | distributed corporate income | Broader than a taxable-dividend variable; only RECV cells are populated. | +| D44 | insurance/pension/fund investment income | Income attributed to policyholders, pension-entitlement holders, and collective-fund shareholders; not taxable movable income and not necessarily cash received. | +| D45 | rent | Rent on natural resources, not tenant housing rent or ordinary dwelling rental income. | +| D5 | personal/current tax | Current taxes on income, wealth, etc.; broader than personal income tax alone. Only PAID cells are populated. | +| D61 | social contributions | Broad ESA net-social-contribution aggregate across actual/imputed and contributor classes; not employee contributions alone. | +| D62 | cash social benefits | All social benefits other than social transfers in kind; broader than any individual EUROMOD benefit. PAID is a household/NPISH-sector use, not a benefit deduction. | + +### JRC comparator gaps + +- `yem`: ONSS excludes a substantial portion of holiday pay, performance + bonuses, and meal vouchers that EUROMOD employment income includes (report + 100, PDF 102; C2). +- `yse`: the report attributes the survey/external gap to insufficient EU-SILC + coverage and underreporting of small self-employment incomes; no External + issuer is identified (reports 100/113, PDFs 102/115; C2). +- `tinkt_s`: the NBB comparator is the advance levy on movable property and + covers more sources than capital income alone (report 101, PDF 103; C2). +- `bsa_s`: validation covers regular support only and excludes equivalent + support received by precarious foreign populations; the family-income + condition also differs from administration (report 101, PDF 103; C2). +- `bsaoa_s`: stored values are NBB annual amounts. FPD/SFPD is listed only for + recipient counts, for which External values are absent (report 122, PDF 124; + C2). +- `bch_s`: child disability is unobserved in the input, so higher disability + allowances cannot be simulated. The Annex amount source is NBB, not + FAMIFED/regional agencies (reports 102/122, PDFs 104/124; C2). +- `bun`: ONEM/RVA recipient and amount concepts differ from SILC reporting, + especially for short unemployment spells (reports 101–102, PDFs 103–104; + C2). +- `il_ext_poapsu`: NBB publishes one combined old-age-plus-survivor-pension + amount; it cannot support separate `poa` and `psu` amount targets. +- `poa`/`psu` counts: 2,273k/79k are SILC observations with External `NaN` and + cannot be relabelled as SFPD administrative totals (report 120, PDFs 122/124; + C2). + +## Command ledger + +All commands ran from +`/Users/maxghenis/TheAxiomFoundation/_cape-prep/chronicle-be` with network +disabled. The repository's default uv cache was not writable in the sandbox, +so repository commands use a task-specific cache plus `--offline --no-sync`. + +### C1 — artifact hashes, sizes, unchanged JRC prefix, and URL equality + +```sh +shasum -a 256 \ + db/data/eurostat/nasa_10_nf_tr/nasa_10_nf_tr.json \ + db/data/jrc/euromod_be_baseline_statistics_2025/jrc_euromod_be_baseline_statistics_2025.csv \ + /Users/maxghenis/TheAxiomFoundation/_cape-prep/Y15_CR_BE_final.pdf +wc -c \ + db/data/eurostat/nasa_10_nf_tr/nasa_10_nf_tr.json \ + db/data/jrc/euromod_be_baseline_statistics_2025/jrc_euromod_be_baseline_statistics_2025.csv \ + /Users/maxghenis/TheAxiomFoundation/_cape-prep/Y15_CR_BE_final.pdf +diff -u \ + <(git show origin/main:db/data/jrc/euromod_be_baseline_statistics_2025/jrc_euromod_be_baseline_statistics_2025.csv | sed -n '1,19p') \ + <(sed -n '1,19p' db/data/jrc/euromod_be_baseline_statistics_2025/jrc_euromod_be_baseline_statistics_2025.csv) +UV_CACHE_DIR=/tmp/chronicle-c2-uv-cache uv run --offline --no-sync python - <<'PY' +from pathlib import Path +import json +import yaml + +base = Path("db/data/eurostat/nasa_10_nf_tr") +manifest = yaml.safe_load((base / "manifest.yaml").read_text()) +file_spec = manifest["files"][2024] +fetches = json.loads(Path("FETCH-MANIFEST-EUROSTAT.json").read_text())["fetches"] +fetch = next(item for item in fetches if item["dataset_id"] == "nasa_10_nf_tr") +print((base / "SOURCE_URL.txt").read_text().strip() == file_spec["source_url"]) +print(fetch["source_url"] == file_spec["source_url"]) +print(fetch["sha256"] == file_spec["sha256"]) +PY +``` + +Output: the three pins and byte counts in the artifact table; the `diff` had no +output; both URL equalities and fetch-manifest hash equality printed `True`. + +### C2 — cached-PDF verification + +The requested `uv run --with pdfplumber` resolver could not write its cache in +this detached sandbox. No package was downloaded: the already-cached +pdfplumber 0.11.10 interpreter was invoked directly. + +```sh +/Users/maxghenis/.cache/uv/archive-v0/HLlfXwC9DMcE0Q6gCdMwl/bin/python -c \ + 'import pdfplumber; print(pdfplumber.__version__)' +/Users/maxghenis/.cache/uv/archive-v0/HLlfXwC9DMcE0Q6gCdMwl/bin/python -c \ + 'import pdfplumber; path="/Users/maxghenis/TheAxiomFoundation/_cape-prep/Y15_CR_BE_final.pdf"; pages=(102,103,104,114,115,116,118,120,122,124,125,126,127,129); p=pdfplumber.open(path); [print(f"=== PDF PAGE {n} ===\\n"+(p.pages[n-1].extract_text(x_tolerance=2,y_tolerance=3) or "")) for n in pages]' +``` + +This printed the Annex headers, all table rows in the JRC fact table, the +issuer continuations, and the narrative definition warnings cited above. + +### C3 — cube structure and populated-coordinate check + +```sh +UV_CACHE_DIR=/tmp/chronicle-c2-uv-cache uv run --offline --no-sync python - <<'PY' +import json +from pathlib import Path + +data = json.loads(Path("db/data/eurostat/nasa_10_nf_tr/nasa_10_nf_tr.json").read_text()) +print(data["id"], data["size"], len(data["value"]), data["dimension"]["na_item"]["category"]["index"]) +PY +``` + +The dimension sizes multiply to 84, `value` contains 78 populated entries, and +the returned `na_item` index contains 14 categories with no B3N. + +### C4 — fact and lineage inventory used by both tables + +```sh +UV_CACHE_DIR=/tmp/chronicle-c2-uv-cache uv run --offline --no-sync python - <<'PY' +from chronicle.source_package import load_source_package +from chronicle.sources.cells import build_source_cell_key +from chronicle.sources.rows import build_source_row_key + +for alias, year, value_column in ( + ("eurostat-nasa-10-nf-tr", 2024, 8), + ("jrc-euromod-be-baseline-statistics-2025", 2025, 7), +): + package = load_source_package(alias) + rows = package.build_source_rows(year) + cells = package.build_source_cells(year, source_rows=rows) + facts = package.build_facts(year, cells=cells, source_rows=rows) + rows_by_key = {build_source_row_key(row): row for row in rows} + cells_by_key = {build_source_cell_key(cell): cell for cell in cells} + print(alias, len(rows), len(cells), len(facts)) + for fact in facts: + row = rows_by_key[fact.source_row_keys[0]] + value_cell = next( + cells_by_key[key] + for key in fact.source_cell_keys + if cells_by_key[key].column_number == value_column + ) + print( + fact.layout.groupby_value_id, + fact.filters, + fact.value, + fact.period.value, + fact.provenance_class, + row.row_number, + row.values.get("source_index"), + value_cell.address, + ) +PY +``` + +Header output: Eurostat `84 1343 78`; JRC `41 294 41`. + +### C5 — package validators + +```sh +UV_CACHE_DIR=/tmp/chronicle-c2-uv-cache uv run --offline --no-sync \ + python -m chronicle.cli validate-package eurostat-nasa-10-nf-tr --year 2024 +UV_CACHE_DIR=/tmp/chronicle-c2-uv-cache uv run --offline --no-sync \ + python -m chronicle.cli validate-package jrc-euromod-be-baseline-statistics-2025 --year 2025 +``` + +### C6 — full package build suites + +```sh +EUROSTAT_SUITE_DIR=$(mktemp -d /tmp/chronicle-c2-eurostat.XXXXXX) +JRC_SUITE_DIR=$(mktemp -d /tmp/chronicle-c2-jrc.XXXXXX) +UV_CACHE_DIR=/tmp/chronicle-c2-uv-cache uv run --offline --no-sync \ + python -m chronicle.cli build-suite eurostat-nasa-10-nf-tr \ + --year 2024 --out "$EUROSTAT_SUITE_DIR" --replace +UV_CACHE_DIR=/tmp/chronicle-c2-uv-cache uv run --offline --no-sync \ + python -m chronicle.cli build-suite jrc-euromod-be-baseline-statistics-2025 \ + --year 2025 --out "$JRC_SUITE_DIR" --replace +``` + +### C7 — emitted-row, cell, and fact validators + +Run in the same shell as C6 so its two task-specific output variables remain +defined. + +```sh +for VALIDATION_KIND in source-rows source-cells facts; do + VALIDATION_FILE=$(printf '%s' "$VALIDATION_KIND" | tr '-' '_').jsonl + UV_CACHE_DIR=/tmp/chronicle-c2-uv-cache uv run --offline --no-sync \ + python -m chronicle.cli "validate-$VALIDATION_KIND" \ + --input "$EUROSTAT_SUITE_DIR/$VALIDATION_FILE" + UV_CACHE_DIR=/tmp/chronicle-c2-uv-cache uv run --offline --no-sync \ + python -m chronicle.cli "validate-$VALIDATION_KIND" \ + --input "$JRC_SUITE_DIR/$VALIDATION_FILE" +done +``` + +### C8 — repository tests + +```sh +UV_CACHE_DIR=/tmp/chronicle-c2-uv-cache uv run --offline --no-sync pytest -q +``` + +### C9 — clean-diff and branch checks + +```sh +git diff --check +git status --short --branch +git branch --show-current +``` + +## Validation output + +| Check | Result | Command | +|---|---|---| +| Eurostat package structure | valid; 6 record sets, 78 selected rows, 6 measures, 78 source records, 6 regions; 0 errors, 0 warnings | C5 | +| JRC package structure | valid; 10 record sets, 41 selected rows, 10 measures, 41 source records, 10 regions; 0 errors, 0 warnings | C5 | +| Eurostat build suite | valid; 84 complete-cube rows, 1,343 cells, 78 facts, 78 consumer facts, 546 constraints, lineage 1.0, 0 acceptance errors | C6 | +| JRC build suite | valid; 41 rows, 294 cells, 41 facts, 41 consumer facts, 82 constraints, lineage 1.0, 0 acceptance errors | C6 | +| Eurostat row/cell/fact validators | all valid; counts 84 / 1,343 / 78; 0 errors and warnings | C7 | +| JRC row/cell/fact validators | all valid; counts 41 / 294 / 41; 0 errors and warnings | C7 | +| Repository test suite | 691 passed, 1 skipped, 14 warnings in 991.52s (0:16:31); exit 0 | C8 | +| `ledger-source-fidelity` judge | PASS; selected coordinates exactly equal all 78 populated cube observations, all JRC additions match cached PDF rows and publisher periods | independent judge review after C1–C7 | +| `ledger-boundary` judge | PASS; provenance split is correct and no target values, aging, alignment, reconciliation, activation, or solver construction entered Chronicle | independent judge review after C1–C7 | + +Both acceptance reports contain one non-fatal environmental warning: +`concept_alignment_validation_skipped`, because no Axiom CLI command is +configured. Evidence presence, manual concept review, row semantics, package +acceptance, and both required Chronicle judge reviews pass. + +## Handoff + +- Final C9 checks reported no whitespace errors and confirmed branch + `be-national-accounts-packages`. +- The local commit message is + `Add Belgium national accounts and JRC external facts`. +- No push and no R2 upload were performed. The two manifests merely declare the + required content-addressed R2 keys. +- A consumer using a fact outside its publisher period must supply an explicit + `PeriodAlignmentDeclaration`; Chronicle returns the published value and does + not compute an aligned value. + +LANE C2 DONE diff --git a/chronicle/source_package.py b/chronicle/source_package.py index 3d9d2e03..25d9e89f 100644 --- a/chronicle/source_package.py +++ b/chronicle/source_package.py @@ -266,6 +266,7 @@ ), "eurostat-gov-10a-taxag": Path("eurostat/gov_10a_taxag"), "eurostat-spr-exp-func": Path("eurostat/spr_exp_func"), + "eurostat-nasa-10-nf-tr": Path("eurostat/nasa_10_nf_tr"), "eurostat-ilc-li02": Path("eurostat/ilc_li02"), "eurostat-ilc-di01": Path("eurostat/ilc_di01"), "kff-marketplace-effectuated-enrollment": Path( diff --git a/db/data/eurostat/nasa_10_nf_tr/SOURCE_URL.txt b/db/data/eurostat/nasa_10_nf_tr/SOURCE_URL.txt new file mode 100644 index 00000000..75d1ee5e --- /dev/null +++ b/db/data/eurostat/nasa_10_nf_tr/SOURCE_URL.txt @@ -0,0 +1 @@ +https://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/nasa_10_nf_tr?format=JSON&lang=en&freq=A&unit=CP_MEUR§or=S14_S15&na_item=B2G&na_item=B3G&na_item=B3N&na_item=B6G&na_item=D1&na_item=D11&na_item=D12&na_item=D4&na_item=D41&na_item=D42&na_item=D44&na_item=D45&na_item=D5&na_item=D61&na_item=D62&direct=RECV&direct=PAID&geo=BE&time=2022&time=2023&time=2024 diff --git a/db/data/eurostat/nasa_10_nf_tr/manifest.yaml b/db/data/eurostat/nasa_10_nf_tr/manifest.yaml new file mode 100644 index 00000000..9cf0822b --- /dev/null +++ b/db/data/eurostat/nasa_10_nf_tr/manifest.yaml @@ -0,0 +1,26 @@ +source_id: eurostat-nasa-10-nf-tr +source_name: Eurostat nasa_10_nf_tr non-financial transactions +publisher: Eurostat +source_page: https://ec.europa.eu/eurostat/databrowser/view/nasa_10_nf_tr/default/table?lang=en +files: + 2024: + filename: nasa_10_nf_tr.json + source_url: https://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/nasa_10_nf_tr?format=JSON&lang=en&freq=A&unit=CP_MEUR§or=S14_S15&na_item=B2G&na_item=B3G&na_item=B3N&na_item=B6G&na_item=D1&na_item=D11&na_item=D12&na_item=D4&na_item=D41&na_item=D42&na_item=D44&na_item=D45&na_item=D5&na_item=D61&na_item=D62&direct=RECV&direct=PAID&geo=BE&time=2022&time=2023&time=2024 + source_table: Eurostat nasa_10_nf_tr Non-financial transactions - annual data for Belgian households and NPISH + sha256: 30d3f5bf3d1414c78633d13f505558b837b84e92c24b17050249ab19cec20a6d + size_bytes: 5098 + storage: + r2: + provider: r2 + bucket: ledger-raw + key: raw/eurostat/eurostat-nasa-10-nf-tr/2024/30d3f5bf3d1414c78633d13f505558b837b84e92c24b17050249ab19cec20a6d/nasa_10_nf_tr.json + uri: r2://ledger-raw/raw/eurostat/eurostat-nasa-10-nf-tr/2024/30d3f5bf3d1414c78633d13f505558b837b84e92c24b17050249ab19cec20a6d/nasa_10_nf_tr.json + source_urls: + - https://ec.europa.eu/eurostat/databrowser/view/nasa_10_nf_tr/default/table?lang=en + - https://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/nasa_10_nf_tr?format=JSON&lang=en&freq=A&unit=CP_MEUR§or=S14_S15&na_item=B2G&na_item=B3G&na_item=B3N&na_item=B6G&na_item=D1&na_item=D11&na_item=D12&na_item=D4&na_item=D41&na_item=D42&na_item=D44&na_item=D45&na_item=D5&na_item=D61&na_item=D62&direct=RECV&direct=PAID&geo=BE&time=2022&time=2023&time=2024 + notes: >- + Real Eurostat dissemination API bytes for the filtered request in + source_url; hash-pinned and content-addressed. Different bytes at + the mutable API endpoint are a new vintage, never a pin update. The + request includes B3N, but the returned cube contains no B3N category; + PAID D42 and RECV D5 are present as cube coordinates with null values. diff --git a/db/data/eurostat/nasa_10_nf_tr/nasa_10_nf_tr.json b/db/data/eurostat/nasa_10_nf_tr/nasa_10_nf_tr.json new file mode 100644 index 00000000..abd1d2b4 --- /dev/null +++ b/db/data/eurostat/nasa_10_nf_tr/nasa_10_nf_tr.json @@ -0,0 +1 @@ +{"version":"2.0","class":"dataset","label":"Non-financial transactions - annual data","source":"ESTAT","updated":"2026-07-27T11:00:00+0200","value":{"0":36960,"1":41351,"2":41447,"3":36718,"4":38850,"5":39700,"6":329780,"7":359164,"8":369313,"9":6011,"10":6174,"11":6359,"12":4758,"13":4919,"14":4978,"15":1253,"16":1255,"17":1381,"18":4940,"19":11584,"20":10622,"21":4572,"22":11184,"23":10226,"27":0,"28":0,"29":0,"30":368,"31":400,"32":396,"33":69114,"34":72794,"35":77033,"36":99704,"37":108000,"38":112346,"39":64,"40":62,"41":86,"42":36960,"43":41351,"44":41447,"45":36718,"46":38850,"47":39700,"48":329780,"49":359164,"50":369313,"51":277464,"52":299696,"53":310278,"54":209481,"55":226018,"56":233080,"57":67983,"58":73677,"59":77198,"60":40867,"61":52674,"62":52437,"63":6334,"64":15962,"65":13943,"66":23090,"67":25012,"68":26144,"69":10463,"70":10605,"71":11223,"72":980,"73":1094,"74":1128,"78":64,"79":62,"80":86,"81":108435,"82":116832,"83":124608},"status":{"2":"p","5":"p","8":"p","11":"p","14":"p","17":"p","20":"p","23":"p","29":"p","32":"p","35":"p","38":"p","41":"p","44":"p","47":"p","50":"p","53":"p","56":"p","59":"p","62":"p","65":"p","68":"p","71":"p","74":"p","80":"p","83":"p"},"id":["freq","unit","direct","na_item","sector","geo","time"],"size":[1,1,2,14,1,1,3],"dimension":{"freq":{"label":"Time frequency","category":{"index":{"A":0},"label":{"A":"Annual"}}},"unit":{"label":"Unit of measure","category":{"index":{"CP_MEUR":0},"label":{"CP_MEUR":"Current prices, million euro"}}},"direct":{"label":"Direction of flow","category":{"index":{"PAID":0,"RECV":1},"label":{"PAID":"Paid","RECV":"Received"}}},"na_item":{"label":"National accounts indicator (ESA 2010)","category":{"index":{"B2G":0,"B3G":1,"B6G":2,"D1":3,"D11":4,"D12":5,"D4":6,"D41":7,"D42":8,"D44":9,"D45":10,"D5":11,"D61":12,"D62":13},"label":{"B2G":"Operating surplus, gross","B3G":"Mixed income, gross","B6G":"Disposable income, gross","D1":"Compensation of employees","D11":"Wages and salaries","D12":"Employers' social contributions","D4":"Property income","D41":"Interest","D42":"Distributed income of corporations","D44":"Other investment income","D45":"Rents","D5":"Current taxes on income, wealth, etc.","D61":"Net social contributions","D62":"Social benefits other than social transfers in kind"}}},"sector":{"label":"Sector","category":{"index":{"S14_S15":0},"label":{"S14_S15":"Households; non-profit institutions serving households"}}},"geo":{"label":"Geopolitical entity (reporting)","category":{"index":{"BE":0},"label":{"BE":"Belgium"}}},"time":{"label":"Time","category":{"index":{"2022":0,"2023":1,"2024":2},"label":{"2022":"2022","2023":"2023","2024":"2024"}}}},"extension":{"lang":"EN","description":"

Annual non-financial transactions cover production, income generation, distribution and use, as well as consumption and capital investments. 

The data is available broken down by institutional sectors (households, government, financial and non-financial corporations, and the rest of the world), illustrating their economic behaviour and interactions between them. 

The series are calculated following the European System of Accounts (ESA 2010) methodology.

","id":"NASA_10_NF_TR","agencyId":"ESTAT","version":"1.0","datastructure":{"id":"NASA_10_NF_TR","agencyId":"ESTAT","version":"109.0"},"annotation":[{"type":"CREATED","date":"2014-10-13T17:05:33+0200"},{"type":"DISSEMINATION_DOI_XML","title":"10.2908/NASA_10_NF_TR2023-01-19"},{"type":"DISSEMINATION_OBJECT_TYPE","title":"DATASET"},{"type":"DISSEMINATION_TIMESTAMP_DATA","date":"2026-07-27T11:00:00+0200"},{"type":"DISSEMINATION_TIMESTAMP_GLOBAL","date":"2026-07-27T11:00:00+0200"},{"type":"DISSEMINATION_TIMESTAMP_PLANNED","date":"2026-07-27T11:00:00+0200"},{"type":"ESMS_HTML","title":"Explanatory texts (metadata)","href":"https://ec.europa.eu/eurostat/cache/metadata/en/nasa_10_nf_tr_esms.htm"},{"type":"ESMS_SDMX","title":"Explanatory texts (metadata)","href":"https://ec.europa.eu/eurostat/api/dissemination/files?file=metadata/nasa_10_nf_tr_esms.sdmx.zip"},{"type":"OBS_COUNT","title":"2088821"},{"type":"OBS_PERIOD_OVERALL_LATEST","title":"2025"},{"type":"OBS_PERIOD_OVERALL_OLDEST","title":"1949"},{"type":"SOURCE_INSTITUTIONS","text":"Eurostat"},{"type":"UPDATE_DATA","date":"2026-07-27T11:00:00+0200"},{"type":"UPDATE_STRUCTURE","date":"2026-07-03T11:00:00+0200"}],"status":{"label":{"p":"provisional"}},"positions-with-no-data":{"freq":[],"unit":[],"direct":[],"na_item":[],"sector":[],"geo":[],"time":[]}}} \ No newline at end of file diff --git a/db/data/jrc/euromod_be_baseline_statistics_2025/jrc_euromod_be_baseline_statistics_2025.csv b/db/data/jrc/euromod_be_baseline_statistics_2025/jrc_euromod_be_baseline_statistics_2025.csv index 5070a044..5359c8bf 100644 --- a/db/data/jrc/euromod_be_baseline_statistics_2025/jrc_euromod_be_baseline_statistics_2025.csv +++ b/db/data/jrc/euromod_be_baseline_statistics_2025/jrc_euromod_be_baseline_statistics_2025.csv @@ -17,3 +17,26 @@ a3_8_poverty_60_total_euromod_2022,2022,at_risk_poverty_60_median_total,euromod, a3_8_poverty_60_total_external_2022,2022,at_risk_poverty_60_median_total,external,A3.8,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,12.30 a3_7_gini_ratio_2022,2022,gini,ratio,A3.7,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,0.92 a3_8_poverty_60_total_ratio_2022,2022,at_risk_poverty_60_median_total,ratio,A3.8,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,0.91 +a3_5_income_support_external_2021,2021,income_support_bsa_s,external,A3.5,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,215 +a3_5_unemployment_benefits_external_2021,2021,unemployment_benefits_bun,external,A3.5,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,992 +a3_1_self_employment_income_external_2022,2022,self_employment_income_yse,external,A3.1,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,1257 +a3_5_income_support_external_2022,2022,income_support_bsa_s,external,A3.5,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,241 +a3_5_unemployment_benefits_external_2022,2022,unemployment_benefits_bun,external,A3.5,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,813 +a3_5_old_age_pension_silc_2022,2022,old_age_pension_poa,silc,A3.5,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,2273 +a3_5_survivor_pension_silc_2022,2022,survivor_pension_psu,silc,A3.5,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,79 +a3_2_employment_income_external_2021,2021,employment_income_yem,external,A3.2,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,147112 +a3_4_capital_income_tax_external_2021,2021,capital_income_tax_tinkt_s,external,A3.4,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,3522 +a3_6_income_support_external_2021,2021,income_support_bsa_s,external,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,1656 +a3_6_income_support_elderly_external_2021,2021,income_support_elderly_bsaoa_s,external,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,767 +a3_6_child_benefits_external_2021,2021,child_benefits_bch_s,external,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,7305 +a3_6_unemployment_benefits_external_2021,2021,unemployment_benefits_bun,external,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,8197 +a3_2_employment_income_external_2022,2022,employment_income_yem,external,A3.2,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,161644 +a3_4_capital_income_tax_external_2022,2022,capital_income_tax_tinkt_s,external,A3.4,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,4152 +a3_6_income_support_external_2022,2022,income_support_bsa_s,external,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,1809 +a3_6_income_support_elderly_external_2022,2022,income_support_elderly_bsaoa_s,external,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,824 +a3_6_child_benefits_external_2022,2022,child_benefits_bch_s,external,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,7738 +a3_6_unemployment_benefits_external_2022,2022,unemployment_benefits_bun,external,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,6670 +a3_2_employment_income_external_2023,2023,employment_income_yem,external,A3.2,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,175998 +a3_6_old_age_survivor_pension_external_2023,2023,old_age_survivor_pension_il_ext_poapsu,external,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,64443 +a3_6_income_support_external_2023,2023,income_support_bsa_s,external,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,2049 +a3_6_income_support_elderly_external_2023,2023,income_support_elderly_bsaoa_s,external,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,941 diff --git a/db/data/jrc/euromod_be_baseline_statistics_2025/manifest.yaml b/db/data/jrc/euromod_be_baseline_statistics_2025/manifest.yaml index e4e1be17..a0ae1710 100644 --- a/db/data/jrc/euromod_be_baseline_statistics_2025/manifest.yaml +++ b/db/data/jrc/euromod_be_baseline_statistics_2025/manifest.yaml @@ -8,16 +8,19 @@ files: filename: jrc_euromod_be_baseline_statistics_2025.csv source_url: https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf source_table: EUROMOD Country Report Belgium 2025 validation tables - sha256: 2ed1f8a677799fefe7cc2f092b4f30221940a2a2fc9deecbf29e7a5f7d71b69f - size_bytes: 3024 + sha256: 2ef69251a72caaab042706c77143fa4f86dde2f800747ebb421b5f7b9a45e394 + size_bytes: 6956 storage: r2: provider: r2 bucket: ledger-raw - key: raw/belgium/jrc-euromod-be-baseline-statistics-2025/2025/2ed1f8a677799fefe7cc2f092b4f30221940a2a2fc9deecbf29e7a5f7d71b69f/jrc_euromod_be_baseline_statistics_2025.csv - uri: r2://ledger-raw/raw/belgium/jrc-euromod-be-baseline-statistics-2025/2025/2ed1f8a677799fefe7cc2f092b4f30221940a2a2fc9deecbf29e7a5f7d71b69f/jrc_euromod_be_baseline_statistics_2025.csv + key: raw/belgium/jrc-euromod-be-baseline-statistics-2025/2025/2ef69251a72caaab042706c77143fa4f86dde2f800747ebb421b5f7b9a45e394/jrc_euromod_be_baseline_statistics_2025.csv + uri: r2://ledger-raw/raw/belgium/jrc-euromod-be-baseline-statistics-2025/2025/2ef69251a72caaab042706c77143fa4f86dde2f800747ebb421b5f7b9a45e394/jrc_euromod_be_baseline_statistics_2025.csv source_urls: - https://euromod-web.jrc.ec.europa.eu/resources/country-reports - https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf - notes: Curated comparator rows from Annex 3 validation tables in the 2025 EUROMOD - Country Report for Belgium. Each row carries the report PDF URL. + notes: >- + Curated comparator rows from Annex 3 validation tables in the 2025 + EUROMOD Country Report for Belgium. Each row carries the report PDF URL; + publisher periods are preserved exactly, including the administrative + External series ending in 2023. diff --git a/packages/eurostat/nasa_10_nf_tr/source_package.yaml b/packages/eurostat/nasa_10_nf_tr/source_package.yaml new file mode 100644 index 00000000..3fecec49 --- /dev/null +++ b/packages/eurostat/nasa_10_nf_tr/source_package.yaml @@ -0,0 +1,667 @@ +schema_version: ledger.source_package.v1 +package_id: eurostat-nasa-10-nf-tr +label: Eurostat nasa_10_nf_tr Belgian household-sector non-financial transactions +artifact: + source_name: eurostat + source_table: Eurostat nasa_10_nf_tr Non-financial transactions - annual data for Belgian households and NPISH + resource_package: db + resource_directory: data/eurostat/nasa_10_nf_tr + manifest: manifest.yaml + vintage: eurostat_nasa_10_nf_tr_2024 + extracted_at: "2026-08-23" + extraction_method: >- + Eurostat dissemination API v1.0 JSON-stat 2.0 full-cube row parse of + the filtered request recorded in the manifest source_url + parser: json_stat_2_full_rows + artifact_year: 2024 + sheet_name: nasa_10_nf_tr + # The returned cube has 84 positions. Chronicle preserves every position + # as a source row, including null PAID D42 and RECV D5 cells, but selects + # only the 78 publisher-populated observations as facts. B3N was requested + # but is absent from the returned na_item dimension and is not fabricated. + selected_rows: + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: B2G, sector: S14_S15, geo: BE, time: "2022"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: B3G, sector: S14_S15, geo: BE, time: "2022"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: B6G, sector: S14_S15, geo: BE, time: "2022"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D1, sector: S14_S15, geo: BE, time: "2022"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D11, sector: S14_S15, geo: BE, time: "2022"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D12, sector: S14_S15, geo: BE, time: "2022"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D4, sector: S14_S15, geo: BE, time: "2022"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D41, sector: S14_S15, geo: BE, time: "2022"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D44, sector: S14_S15, geo: BE, time: "2022"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D45, sector: S14_S15, geo: BE, time: "2022"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D5, sector: S14_S15, geo: BE, time: "2022"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D61, sector: S14_S15, geo: BE, time: "2022"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D62, sector: S14_S15, geo: BE, time: "2022"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: B2G, sector: S14_S15, geo: BE, time: "2022"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: B3G, sector: S14_S15, geo: BE, time: "2022"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: B6G, sector: S14_S15, geo: BE, time: "2022"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D1, sector: S14_S15, geo: BE, time: "2022"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D11, sector: S14_S15, geo: BE, time: "2022"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D12, sector: S14_S15, geo: BE, time: "2022"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D4, sector: S14_S15, geo: BE, time: "2022"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D41, sector: S14_S15, geo: BE, time: "2022"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D42, sector: S14_S15, geo: BE, time: "2022"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D44, sector: S14_S15, geo: BE, time: "2022"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D45, sector: S14_S15, geo: BE, time: "2022"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D61, sector: S14_S15, geo: BE, time: "2022"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D62, sector: S14_S15, geo: BE, time: "2022"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: B2G, sector: S14_S15, geo: BE, time: "2023"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: B3G, sector: S14_S15, geo: BE, time: "2023"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: B6G, sector: S14_S15, geo: BE, time: "2023"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D1, sector: S14_S15, geo: BE, time: "2023"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D11, sector: S14_S15, geo: BE, time: "2023"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D12, sector: S14_S15, geo: BE, time: "2023"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D4, sector: S14_S15, geo: BE, time: "2023"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D41, sector: S14_S15, geo: BE, time: "2023"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D44, sector: S14_S15, geo: BE, time: "2023"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D45, sector: S14_S15, geo: BE, time: "2023"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D5, sector: S14_S15, geo: BE, time: "2023"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D61, sector: S14_S15, geo: BE, time: "2023"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D62, sector: S14_S15, geo: BE, time: "2023"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: B2G, sector: S14_S15, geo: BE, time: "2023"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: B3G, sector: S14_S15, geo: BE, time: "2023"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: B6G, sector: S14_S15, geo: BE, time: "2023"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D1, sector: S14_S15, geo: BE, time: "2023"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D11, sector: S14_S15, geo: BE, time: "2023"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D12, sector: S14_S15, geo: BE, time: "2023"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D4, sector: S14_S15, geo: BE, time: "2023"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D41, sector: S14_S15, geo: BE, time: "2023"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D42, sector: S14_S15, geo: BE, time: "2023"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D44, sector: S14_S15, geo: BE, time: "2023"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D45, sector: S14_S15, geo: BE, time: "2023"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D61, sector: S14_S15, geo: BE, time: "2023"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D62, sector: S14_S15, geo: BE, time: "2023"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: B2G, sector: S14_S15, geo: BE, time: "2024"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: B3G, sector: S14_S15, geo: BE, time: "2024"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: B6G, sector: S14_S15, geo: BE, time: "2024"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D1, sector: S14_S15, geo: BE, time: "2024"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D11, sector: S14_S15, geo: BE, time: "2024"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D12, sector: S14_S15, geo: BE, time: "2024"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D4, sector: S14_S15, geo: BE, time: "2024"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D41, sector: S14_S15, geo: BE, time: "2024"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D44, sector: S14_S15, geo: BE, time: "2024"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D45, sector: S14_S15, geo: BE, time: "2024"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D5, sector: S14_S15, geo: BE, time: "2024"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D61, sector: S14_S15, geo: BE, time: "2024"} + - {freq: A, unit: CP_MEUR, direct: PAID, na_item: D62, sector: S14_S15, geo: BE, time: "2024"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: B2G, sector: S14_S15, geo: BE, time: "2024"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: B3G, sector: S14_S15, geo: BE, time: "2024"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: B6G, sector: S14_S15, geo: BE, time: "2024"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D1, sector: S14_S15, geo: BE, time: "2024"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D11, sector: S14_S15, geo: BE, time: "2024"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D12, sector: S14_S15, geo: BE, time: "2024"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D4, sector: S14_S15, geo: BE, time: "2024"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D41, sector: S14_S15, geo: BE, time: "2024"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D42, sector: S14_S15, geo: BE, time: "2024"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D44, sector: S14_S15, geo: BE, time: "2024"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D45, sector: S14_S15, geo: BE, time: "2024"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D61, sector: S14_S15, geo: BE, time: "2024"} + - {freq: A, unit: CP_MEUR, direct: RECV, na_item: D62, sector: S14_S15, geo: BE, time: "2024"} +record_sets: + - &paid_record_set + record_set_id: eurostat.nasa_10_nf_tr.cy2022.household_non_financial_transactions.paid.be + provenance_class: administrative + record_set_spec_id: eurostat.nasa_10_nf_tr.household_non_financial_transactions.direction.country.v1 + source_record_id_prefix: eurostat.nasa_10_nf_tr.cy2022.household_non_financial_transactions.paid.be + sheet_name: nasa_10_nf_tr + period_type: calendar_year + period: 2022 + geography_id: BE + geography_level: country + geography_name: Belgium + geography_vintage: current + entity: household + entity_role: resident_households_and_npish + domain: national_accounts + groupby_dimension: na_item + shared_filters: + freq: A + unit: CP_MEUR + direct: PAID + sector: S14_S15 + geo: BE + time: "2022" + shared_constraints: + - {variable: freq, operator: "==", value: A, label: annual frequency} + - {variable: unit, operator: "==", value: CP_MEUR, label: current-price million euro source unit} + - {variable: direct, operator: "==", value: PAID, label: paid direction} + - {variable: sector, operator: "==", value: S14_S15, label: households and NPISH institutional sector} + - {variable: geo, operator: "==", value: BE, label: Belgium} + - {variable: time, operator: "==", value: "2022", label: source time} + rows: + - &paid_b2g_row + value_id: belgium_household_operating_surplus_gross + label: Operating surplus, gross (B.2G), paid-direction cell + ordinal: 0 + row_number: 2 + expected_row_header_column: D + expected_row_header: B2G + filters: {na_item: B2G} + constraints: + - {variable: na_item, operator: "==", value: B2G, label: ESA 2010 operating surplus gross} + guard_cells: &paid_2022_guards + - {column: A, expected_value: A, label: annual frequency} + - {column: B, expected_value: CP_MEUR, label: current-price million euro source unit} + - {column: C, expected_value: PAID, label: paid direction} + - {column: E, expected_value: S14_S15, label: households and NPISH institutional sector} + - {column: F, expected_value: BE, label: Belgium} + - {column: G, row: 1, expected_value: time, label: time dimension header} + - &paid_b3g_row + value_id: belgium_household_mixed_income_gross + label: Mixed income, gross (B.3G), paid-direction cell + ordinal: 1 + row_number: 3 + expected_row_header_column: D + expected_row_header: B3G + filters: {na_item: B3G} + constraints: + - {variable: na_item, operator: "==", value: B3G, label: ESA 2010 mixed income gross} + guard_cells: *paid_2022_guards + - &paid_b6g_row + value_id: belgium_household_disposable_income_gross + label: Disposable income, gross (B.6G), paid-direction cell + ordinal: 2 + row_number: 4 + expected_row_header_column: D + expected_row_header: B6G + filters: {na_item: B6G} + constraints: + - {variable: na_item, operator: "==", value: B6G, label: ESA 2010 disposable income gross} + guard_cells: *paid_2022_guards + - &paid_d1_row + value_id: belgium_household_compensation_of_employees_paid + label: Compensation of employees paid (D.1) + ordinal: 3 + row_number: 5 + expected_row_header_column: D + expected_row_header: D1 + filters: {na_item: D1} + constraints: + - {variable: na_item, operator: "==", value: D1, label: ESA 2010 compensation of employees} + guard_cells: *paid_2022_guards + - &paid_d11_row + value_id: belgium_household_wages_and_salaries_paid + label: Wages and salaries paid (D.11) + ordinal: 4 + row_number: 6 + expected_row_header_column: D + expected_row_header: D11 + filters: {na_item: D11} + constraints: + - {variable: na_item, operator: "==", value: D11, label: ESA 2010 wages and salaries} + guard_cells: *paid_2022_guards + - &paid_d12_row + value_id: belgium_household_employers_social_contributions_paid + label: Employers' social contributions paid (D.12) + ordinal: 5 + row_number: 7 + expected_row_header_column: D + expected_row_header: D12 + filters: {na_item: D12} + constraints: + - {variable: na_item, operator: "==", value: D12, label: ESA 2010 employers' social contributions} + guard_cells: *paid_2022_guards + - &paid_d4_row + value_id: belgium_household_property_income_paid + label: Property income paid (D.4) + ordinal: 6 + row_number: 8 + expected_row_header_column: D + expected_row_header: D4 + filters: {na_item: D4} + constraints: + - {variable: na_item, operator: "==", value: D4, label: ESA 2010 property income} + guard_cells: *paid_2022_guards + - &paid_d41_row + value_id: belgium_household_interest_paid + label: Interest paid (D.41) + ordinal: 7 + row_number: 9 + expected_row_header_column: D + expected_row_header: D41 + filters: {na_item: D41} + constraints: + - {variable: na_item, operator: "==", value: D41, label: ESA 2010 interest} + guard_cells: *paid_2022_guards + - &paid_d44_row + value_id: belgium_household_other_investment_income_paid + label: Other investment income paid (D.44) + ordinal: 8 + row_number: 10 + expected_row_header_column: D + expected_row_header: D44 + filters: {na_item: D44} + constraints: + - {variable: na_item, operator: "==", value: D44, label: ESA 2010 other investment income} + guard_cells: *paid_2022_guards + - &paid_d45_row + value_id: belgium_household_rents_paid + label: Rents paid (D.45) + ordinal: 9 + row_number: 11 + expected_row_header_column: D + expected_row_header: D45 + filters: {na_item: D45} + constraints: + - {variable: na_item, operator: "==", value: D45, label: ESA 2010 rents} + guard_cells: *paid_2022_guards + - &paid_d5_row + value_id: belgium_household_current_taxes_on_income_paid + label: Current taxes on income, wealth, etc. paid (D.5) + ordinal: 10 + row_number: 12 + expected_row_header_column: D + expected_row_header: D5 + filters: {na_item: D5} + constraints: + - {variable: na_item, operator: "==", value: D5, label: ESA 2010 current taxes on income, wealth, etc.} + guard_cells: *paid_2022_guards + - &paid_d61_row + value_id: belgium_household_net_social_contributions_paid + label: Net social contributions paid (D.61) + ordinal: 11 + row_number: 13 + expected_row_header_column: D + expected_row_header: D61 + filters: {na_item: D61} + constraints: + - {variable: na_item, operator: "==", value: D61, label: ESA 2010 net social contributions} + guard_cells: *paid_2022_guards + - &paid_d62_row + value_id: belgium_household_social_benefits_paid + label: Social benefits other than social transfers in kind paid (D.62) + ordinal: 12 + row_number: 14 + expected_row_header_column: D + expected_row_header: D62 + filters: {na_item: D62} + constraints: + - {variable: na_item, operator: "==", value: D62, label: ESA 2010 social benefits other than social transfers in kind} + guard_cells: *paid_2022_guards + measures: &transaction_measure + - measure_id: amount + label: Household-sector national-accounts non-financial transaction amount + ordinal: 0 + column: H + source_column_id: value + expected_column_header_row: 1 + expected_column_header: value + concept: belgium_household_national_accounts_non_financial_transaction_amount + source_concept: eurostat.nasa_10_nf_tr.non_financial_transaction_amount + concept_relation: exact + concept_authority: ledger-be + concept_evidence_url: https://ec.europa.eu/eurostat/databrowser/view/nasa_10_nf_tr/default/table?lang=en + concept_evidence_notes: >- + Each row is the exact current-price ESA 2010 amount published by + Eurostat for Belgium and institutional sector S14_S15, which combines + households and non-profit institutions serving households. B.2G, + B.3G, and B.6G are balancing items, not independent paid and received + flows; the API repeats their published levels under both directions. + Eurostat marks the populated 2024 observations provisional in the + returned status dimension. + B.3G is mixed income before deducting consumption of fixed capital + and combines labour and capital returns of household unincorporated + enterprises. D.1 comprises D.11 wages and salaries plus D.12 actual + and imputed employers' social contributions; on the resources side, + D.12 is imputed to households and is not cash wages. D.4 and its + components overlap: D.41 is ESA interest after the FISIM adjustment; + D.42 is distributed income of corporations; D.44 is investment + income attributable to insurance policyholders, pension entitlement + holders, and collective investment fund shareholders, not taxable + movable income; and D.45 is rent on natural resources, not tenant + housing rent. D.5 covers current taxes on income, wealth, etc., not + personal income tax alone. D.61 is the broad ESA net social + contribution aggregate, and D.62 covers social benefits other than + social transfers in kind. Chronicle stores every published aggregate + without reconciling overlapping totals or constructing calibration + targets. + unit: eur + aggregation: sum + value_scale: 1000000 + expected_cell_type: number + - &received_record_set + record_set_id: eurostat.nasa_10_nf_tr.cy2022.household_non_financial_transactions.received.be + provenance_class: administrative + record_set_spec_id: eurostat.nasa_10_nf_tr.household_non_financial_transactions.direction.country.v1 + source_record_id_prefix: eurostat.nasa_10_nf_tr.cy2022.household_non_financial_transactions.received.be + sheet_name: nasa_10_nf_tr + period_type: calendar_year + period: 2022 + geography_id: BE + geography_level: country + geography_name: Belgium + geography_vintage: current + entity: household + entity_role: resident_households_and_npish + domain: national_accounts + groupby_dimension: na_item + shared_filters: + freq: A + unit: CP_MEUR + direct: RECV + sector: S14_S15 + geo: BE + time: "2022" + shared_constraints: + - {variable: freq, operator: "==", value: A, label: annual frequency} + - {variable: unit, operator: "==", value: CP_MEUR, label: current-price million euro source unit} + - {variable: direct, operator: "==", value: RECV, label: received direction} + - {variable: sector, operator: "==", value: S14_S15, label: households and NPISH institutional sector} + - {variable: geo, operator: "==", value: BE, label: Belgium} + - {variable: time, operator: "==", value: "2022", label: source time} + rows: + - &received_b2g_row + value_id: belgium_household_operating_surplus_gross + label: Operating surplus, gross (B.2G), received-direction cell + ordinal: 0 + row_number: 15 + expected_row_header_column: D + expected_row_header: B2G + filters: {na_item: B2G} + constraints: + - {variable: na_item, operator: "==", value: B2G, label: ESA 2010 operating surplus gross} + guard_cells: &received_2022_guards + - {column: A, expected_value: A, label: annual frequency} + - {column: B, expected_value: CP_MEUR, label: current-price million euro source unit} + - {column: C, expected_value: RECV, label: received direction} + - {column: E, expected_value: S14_S15, label: households and NPISH institutional sector} + - {column: F, expected_value: BE, label: Belgium} + - {column: G, row: 1, expected_value: time, label: time dimension header} + - &received_b3g_row + value_id: belgium_household_mixed_income_gross + label: Mixed income, gross (B.3G), received-direction cell + ordinal: 1 + row_number: 16 + expected_row_header_column: D + expected_row_header: B3G + filters: {na_item: B3G} + constraints: + - {variable: na_item, operator: "==", value: B3G, label: ESA 2010 mixed income gross} + guard_cells: *received_2022_guards + - &received_b6g_row + value_id: belgium_household_disposable_income_gross + label: Disposable income, gross (B.6G), received-direction cell + ordinal: 2 + row_number: 17 + expected_row_header_column: D + expected_row_header: B6G + filters: {na_item: B6G} + constraints: + - {variable: na_item, operator: "==", value: B6G, label: ESA 2010 disposable income gross} + guard_cells: *received_2022_guards + - &received_d1_row + value_id: belgium_household_compensation_of_employees_received + label: Compensation of employees received (D.1) + ordinal: 3 + row_number: 18 + expected_row_header_column: D + expected_row_header: D1 + filters: {na_item: D1} + constraints: + - {variable: na_item, operator: "==", value: D1, label: ESA 2010 compensation of employees} + guard_cells: *received_2022_guards + - &received_d11_row + value_id: belgium_household_wages_and_salaries_received + label: Wages and salaries received (D.11) + ordinal: 4 + row_number: 19 + expected_row_header_column: D + expected_row_header: D11 + filters: {na_item: D11} + constraints: + - {variable: na_item, operator: "==", value: D11, label: ESA 2010 wages and salaries} + guard_cells: *received_2022_guards + - &received_d12_row + value_id: belgium_household_employers_social_contributions_received + label: Employers' social contributions received (D.12) + ordinal: 5 + row_number: 20 + expected_row_header_column: D + expected_row_header: D12 + filters: {na_item: D12} + constraints: + - {variable: na_item, operator: "==", value: D12, label: ESA 2010 employers' social contributions} + guard_cells: *received_2022_guards + - &received_d4_row + value_id: belgium_household_property_income_received + label: Property income received (D.4) + ordinal: 6 + row_number: 21 + expected_row_header_column: D + expected_row_header: D4 + filters: {na_item: D4} + constraints: + - {variable: na_item, operator: "==", value: D4, label: ESA 2010 property income} + guard_cells: *received_2022_guards + - &received_d41_row + value_id: belgium_household_interest_received + label: Interest received (D.41) + ordinal: 7 + row_number: 22 + expected_row_header_column: D + expected_row_header: D41 + filters: {na_item: D41} + constraints: + - {variable: na_item, operator: "==", value: D41, label: ESA 2010 interest} + guard_cells: *received_2022_guards + - &received_d42_row + value_id: belgium_household_distributed_income_of_corporations_received + label: Distributed income of corporations received (D.42) + ordinal: 8 + row_number: 23 + expected_row_header_column: D + expected_row_header: D42 + filters: {na_item: D42} + constraints: + - {variable: na_item, operator: "==", value: D42, label: ESA 2010 distributed income of corporations} + guard_cells: *received_2022_guards + - &received_d44_row + value_id: belgium_household_other_investment_income_received + label: Other investment income received (D.44) + ordinal: 9 + row_number: 24 + expected_row_header_column: D + expected_row_header: D44 + filters: {na_item: D44} + constraints: + - {variable: na_item, operator: "==", value: D44, label: ESA 2010 other investment income} + guard_cells: *received_2022_guards + - &received_d45_row + value_id: belgium_household_rents_received + label: Rents received (D.45) + ordinal: 10 + row_number: 25 + expected_row_header_column: D + expected_row_header: D45 + filters: {na_item: D45} + constraints: + - {variable: na_item, operator: "==", value: D45, label: ESA 2010 rents} + guard_cells: *received_2022_guards + - &received_d61_row + value_id: belgium_household_net_social_contributions_received + label: Net social contributions received (D.61) + ordinal: 11 + row_number: 26 + expected_row_header_column: D + expected_row_header: D61 + filters: {na_item: D61} + constraints: + - {variable: na_item, operator: "==", value: D61, label: ESA 2010 net social contributions} + guard_cells: *received_2022_guards + - &received_d62_row + value_id: belgium_household_social_benefits_received + label: Social benefits other than social transfers in kind received (D.62) + ordinal: 12 + row_number: 27 + expected_row_header_column: D + expected_row_header: D62 + filters: {na_item: D62} + constraints: + - {variable: na_item, operator: "==", value: D62, label: ESA 2010 social benefits other than social transfers in kind} + guard_cells: *received_2022_guards + measures: *transaction_measure + - <<: *paid_record_set + record_set_id: eurostat.nasa_10_nf_tr.cy2023.household_non_financial_transactions.paid.be + provenance_class: administrative + source_record_id_prefix: eurostat.nasa_10_nf_tr.cy2023.household_non_financial_transactions.paid.be + period: 2023 + shared_filters: + freq: A + unit: CP_MEUR + direct: PAID + sector: S14_S15 + geo: BE + time: "2023" + shared_constraints: + - {variable: freq, operator: "==", value: A, label: annual frequency} + - {variable: unit, operator: "==", value: CP_MEUR, label: current-price million euro source unit} + - {variable: direct, operator: "==", value: PAID, label: paid direction} + - {variable: sector, operator: "==", value: S14_S15, label: households and NPISH institutional sector} + - {variable: geo, operator: "==", value: BE, label: Belgium} + - {variable: time, operator: "==", value: "2023", label: source time} + rows: + - <<: *paid_b2g_row + row_number: 28 + guard_cells: &paid_2023_guards + - {column: A, expected_value: A, label: annual frequency} + - {column: B, expected_value: CP_MEUR, label: current-price million euro source unit} + - {column: C, expected_value: PAID, label: paid direction} + - {column: E, expected_value: S14_S15, label: households and NPISH institutional sector} + - {column: F, expected_value: BE, label: Belgium} + - {column: G, row: 1, expected_value: time, label: time dimension header} + - {<<: *paid_b3g_row, row_number: 29, guard_cells: *paid_2023_guards} + - {<<: *paid_b6g_row, row_number: 30, guard_cells: *paid_2023_guards} + - {<<: *paid_d1_row, row_number: 31, guard_cells: *paid_2023_guards} + - {<<: *paid_d11_row, row_number: 32, guard_cells: *paid_2023_guards} + - {<<: *paid_d12_row, row_number: 33, guard_cells: *paid_2023_guards} + - {<<: *paid_d4_row, row_number: 34, guard_cells: *paid_2023_guards} + - {<<: *paid_d41_row, row_number: 35, guard_cells: *paid_2023_guards} + - {<<: *paid_d44_row, row_number: 36, guard_cells: *paid_2023_guards} + - {<<: *paid_d45_row, row_number: 37, guard_cells: *paid_2023_guards} + - {<<: *paid_d5_row, row_number: 38, guard_cells: *paid_2023_guards} + - {<<: *paid_d61_row, row_number: 39, guard_cells: *paid_2023_guards} + - {<<: *paid_d62_row, row_number: 40, guard_cells: *paid_2023_guards} + - <<: *received_record_set + record_set_id: eurostat.nasa_10_nf_tr.cy2023.household_non_financial_transactions.received.be + provenance_class: administrative + source_record_id_prefix: eurostat.nasa_10_nf_tr.cy2023.household_non_financial_transactions.received.be + period: 2023 + shared_filters: + freq: A + unit: CP_MEUR + direct: RECV + sector: S14_S15 + geo: BE + time: "2023" + shared_constraints: + - {variable: freq, operator: "==", value: A, label: annual frequency} + - {variable: unit, operator: "==", value: CP_MEUR, label: current-price million euro source unit} + - {variable: direct, operator: "==", value: RECV, label: received direction} + - {variable: sector, operator: "==", value: S14_S15, label: households and NPISH institutional sector} + - {variable: geo, operator: "==", value: BE, label: Belgium} + - {variable: time, operator: "==", value: "2023", label: source time} + rows: + - <<: *received_b2g_row + row_number: 41 + guard_cells: &received_2023_guards + - {column: A, expected_value: A, label: annual frequency} + - {column: B, expected_value: CP_MEUR, label: current-price million euro source unit} + - {column: C, expected_value: RECV, label: received direction} + - {column: E, expected_value: S14_S15, label: households and NPISH institutional sector} + - {column: F, expected_value: BE, label: Belgium} + - {column: G, row: 1, expected_value: time, label: time dimension header} + - {<<: *received_b3g_row, row_number: 42, guard_cells: *received_2023_guards} + - {<<: *received_b6g_row, row_number: 43, guard_cells: *received_2023_guards} + - {<<: *received_d1_row, row_number: 44, guard_cells: *received_2023_guards} + - {<<: *received_d11_row, row_number: 45, guard_cells: *received_2023_guards} + - {<<: *received_d12_row, row_number: 46, guard_cells: *received_2023_guards} + - {<<: *received_d4_row, row_number: 47, guard_cells: *received_2023_guards} + - {<<: *received_d41_row, row_number: 48, guard_cells: *received_2023_guards} + - {<<: *received_d42_row, row_number: 49, guard_cells: *received_2023_guards} + - {<<: *received_d44_row, row_number: 50, guard_cells: *received_2023_guards} + - {<<: *received_d45_row, row_number: 51, guard_cells: *received_2023_guards} + - {<<: *received_d61_row, row_number: 52, guard_cells: *received_2023_guards} + - {<<: *received_d62_row, row_number: 53, guard_cells: *received_2023_guards} + - <<: *paid_record_set + record_set_id: eurostat.nasa_10_nf_tr.cy2024.household_non_financial_transactions.paid.be + provenance_class: administrative + source_record_id_prefix: eurostat.nasa_10_nf_tr.cy2024.household_non_financial_transactions.paid.be + period: 2024 + shared_filters: + freq: A + unit: CP_MEUR + direct: PAID + sector: S14_S15 + geo: BE + time: "2024" + shared_constraints: + - {variable: freq, operator: "==", value: A, label: annual frequency} + - {variable: unit, operator: "==", value: CP_MEUR, label: current-price million euro source unit} + - {variable: direct, operator: "==", value: PAID, label: paid direction} + - {variable: sector, operator: "==", value: S14_S15, label: households and NPISH institutional sector} + - {variable: geo, operator: "==", value: BE, label: Belgium} + - {variable: time, operator: "==", value: "2024", label: source time} + rows: + - <<: *paid_b2g_row + row_number: 54 + guard_cells: &paid_2024_guards + - {column: A, expected_value: A, label: annual frequency} + - {column: B, expected_value: CP_MEUR, label: current-price million euro source unit} + - {column: C, expected_value: PAID, label: paid direction} + - {column: E, expected_value: S14_S15, label: households and NPISH institutional sector} + - {column: F, expected_value: BE, label: Belgium} + - {column: G, row: 1, expected_value: time, label: time dimension header} + - {<<: *paid_b3g_row, row_number: 55, guard_cells: *paid_2024_guards} + - {<<: *paid_b6g_row, row_number: 56, guard_cells: *paid_2024_guards} + - {<<: *paid_d1_row, row_number: 57, guard_cells: *paid_2024_guards} + - {<<: *paid_d11_row, row_number: 58, guard_cells: *paid_2024_guards} + - {<<: *paid_d12_row, row_number: 59, guard_cells: *paid_2024_guards} + - {<<: *paid_d4_row, row_number: 60, guard_cells: *paid_2024_guards} + - {<<: *paid_d41_row, row_number: 61, guard_cells: *paid_2024_guards} + - {<<: *paid_d44_row, row_number: 62, guard_cells: *paid_2024_guards} + - {<<: *paid_d45_row, row_number: 63, guard_cells: *paid_2024_guards} + - {<<: *paid_d5_row, row_number: 64, guard_cells: *paid_2024_guards} + - {<<: *paid_d61_row, row_number: 65, guard_cells: *paid_2024_guards} + - {<<: *paid_d62_row, row_number: 66, guard_cells: *paid_2024_guards} + - <<: *received_record_set + record_set_id: eurostat.nasa_10_nf_tr.cy2024.household_non_financial_transactions.received.be + provenance_class: administrative + source_record_id_prefix: eurostat.nasa_10_nf_tr.cy2024.household_non_financial_transactions.received.be + period: 2024 + shared_filters: + freq: A + unit: CP_MEUR + direct: RECV + sector: S14_S15 + geo: BE + time: "2024" + shared_constraints: + - {variable: freq, operator: "==", value: A, label: annual frequency} + - {variable: unit, operator: "==", value: CP_MEUR, label: current-price million euro source unit} + - {variable: direct, operator: "==", value: RECV, label: received direction} + - {variable: sector, operator: "==", value: S14_S15, label: households and NPISH institutional sector} + - {variable: geo, operator: "==", value: BE, label: Belgium} + - {variable: time, operator: "==", value: "2024", label: source time} + rows: + - <<: *received_b2g_row + row_number: 67 + guard_cells: &received_2024_guards + - {column: A, expected_value: A, label: annual frequency} + - {column: B, expected_value: CP_MEUR, label: current-price million euro source unit} + - {column: C, expected_value: RECV, label: received direction} + - {column: E, expected_value: S14_S15, label: households and NPISH institutional sector} + - {column: F, expected_value: BE, label: Belgium} + - {column: G, row: 1, expected_value: time, label: time dimension header} + - {<<: *received_b3g_row, row_number: 68, guard_cells: *received_2024_guards} + - {<<: *received_b6g_row, row_number: 69, guard_cells: *received_2024_guards} + - {<<: *received_d1_row, row_number: 70, guard_cells: *received_2024_guards} + - {<<: *received_d11_row, row_number: 71, guard_cells: *received_2024_guards} + - {<<: *received_d12_row, row_number: 72, guard_cells: *received_2024_guards} + - {<<: *received_d4_row, row_number: 73, guard_cells: *received_2024_guards} + - {<<: *received_d41_row, row_number: 74, guard_cells: *received_2024_guards} + - {<<: *received_d42_row, row_number: 75, guard_cells: *received_2024_guards} + - {<<: *received_d44_row, row_number: 76, guard_cells: *received_2024_guards} + - {<<: *received_d45_row, row_number: 77, guard_cells: *received_2024_guards} + - {<<: *received_d61_row, row_number: 78, guard_cells: *received_2024_guards} + - {<<: *received_d62_row, row_number: 79, guard_cells: *received_2024_guards} diff --git a/packages/jrc/euromod_be_baseline_statistics_2025/source_package.yaml b/packages/jrc/euromod_be_baseline_statistics_2025/source_package.yaml index a2feb96a..66400d2f 100644 --- a/packages/jrc/euromod_be_baseline_statistics_2025/source_package.yaml +++ b/packages/jrc/euromod_be_baseline_statistics_2025/source_package.yaml @@ -8,7 +8,7 @@ artifact: resource_directory: data/jrc/euromod_be_baseline_statistics_2025 manifest: manifest.yaml vintage: euromod_be_country_report_2025 - extracted_at: '2026-07-02' + extracted_at: '2026-08-23' extraction_method: curated CSV extract from JRC EUROMOD Country Report Belgium Annex 3 validation tables parser: delimited_text_full_rows @@ -49,27 +49,9 @@ record_sets: operator: == value: euromod label: Validation series - - value_id: a3_4_national_income_tax_external_2023 - label: a3 4 national income tax external 2023 - ordinal: 1 - row_number: 3 - expected_row_header_column: A - expected_row_header: a3_4_national_income_tax_external_2023 - filters: - validation.metric: national_income_tax - validation.series: external - constraints: - - variable: validation.metric - operator: == - value: national_income_tax - label: Validation metric - - variable: validation.series - operator: == - value: external - label: Validation series - value_id: a3_4_employee_sics_euromod_2023 label: a3 4 employee sics euromod 2023 - ordinal: 2 + ordinal: 1 row_number: 4 expected_row_header_column: A expected_row_header: a3_4_employee_sics_euromod_2023 @@ -85,27 +67,9 @@ record_sets: operator: == value: euromod label: Validation series - - value_id: a3_4_employee_sics_external_2023 - label: a3 4 employee sics external 2023 - ordinal: 3 - row_number: 5 - expected_row_header_column: A - expected_row_header: a3_4_employee_sics_external_2023 - filters: - validation.metric: employee_social_insurance_contributions - validation.series: external - constraints: - - variable: validation.metric - operator: == - value: employee_social_insurance_contributions - label: Validation metric - - variable: validation.series - operator: == - value: external - label: Validation series - value_id: a3_6_child_benefits_euromod_2023 label: a3 6 child benefits euromod 2023 - ordinal: 4 + ordinal: 2 row_number: 6 expected_row_header_column: A expected_row_header: a3_6_child_benefits_euromod_2023 @@ -121,27 +85,9 @@ record_sets: operator: == value: euromod label: Validation series - - value_id: a3_6_child_benefits_external_2023 - label: a3 6 child benefits external 2023 - ordinal: 5 - row_number: 7 - expected_row_header_column: A - expected_row_header: a3_6_child_benefits_external_2023 - filters: - validation.metric: child_benefits - validation.series: external - constraints: - - variable: validation.metric - operator: == - value: child_benefits - label: Validation metric - - variable: validation.series - operator: == - value: external - label: Validation series - value_id: a3_6_unemployment_benefits_euromod_2023 label: a3 6 unemployment benefits euromod 2023 - ordinal: 6 + ordinal: 3 row_number: 8 expected_row_header_column: A expected_row_header: a3_6_unemployment_benefits_euromod_2023 @@ -157,24 +103,6 @@ record_sets: operator: == value: euromod label: Validation series - - value_id: a3_6_unemployment_benefits_external_2023 - label: a3 6 unemployment benefits external 2023 - ordinal: 7 - row_number: 9 - expected_row_header_column: A - expected_row_header: a3_6_unemployment_benefits_external_2023 - filters: - validation.metric: unemployment_benefits - validation.series: external - constraints: - - variable: validation.metric - operator: == - value: unemployment_benefits - label: Validation metric - - variable: validation.series - operator: == - value: external - label: Validation series measures: - measure_id: value label: Validation table value @@ -301,6 +229,759 @@ record_sets: aggregation: sum value_scale: 1 expected_cell_type: number +- record_set_id: jrc.euromod_be.cy2021.macrovalidation.external_recipient_counts + provenance_class: administrative + record_set_spec_id: jrc.euromod_be.macrovalidation.external_recipient_counts.cy2021.v1 + source_record_id_prefix: jrc.euromod_be.cy2021.macrovalidation.external_recipient_counts + sheet_name: jrc_euromod_be_baseline_statistics_2025 + period_type: calendar_year + period: 2021 + geography_id: BE + geography_level: country + geography_name: Belgium + geography_vintage: current + entity: person + entity_role: validation_comparator + domain: euromod_be_macrovalidation + groupby_dimension: validation.metric_series + rows: + - value_id: a3_5_income_support_external_2021 + label: A3.5 income support external recipients 2021 + ordinal: 0 + row_number: 20 + expected_row_header_column: A + expected_row_header: a3_5_income_support_external_2021 + filters: + validation.metric: income_support_bsa_s + validation.series: external + constraints: + - variable: validation.metric + operator: == + value: income_support_bsa_s + label: Validation metric + - variable: validation.series + operator: == + value: external + label: Validation series + - value_id: a3_5_unemployment_benefits_external_2021 + label: A3.5 unemployment benefits external recipients 2021 + ordinal: 1 + row_number: 21 + expected_row_header_column: A + expected_row_header: a3_5_unemployment_benefits_external_2021 + filters: + validation.metric: unemployment_benefits_bun + validation.series: external + constraints: + - variable: validation.metric + operator: == + value: unemployment_benefits_bun + label: Validation metric + - variable: validation.series + operator: == + value: external + label: Validation series + measures: + - measure_id: value + label: External administrative recipient count + ordinal: 0 + column: G + source_column_id: value + expected_column_header_row: 1 + expected_column_header: value + concept: euromod_be.external_macrovalidation_recipient_count + source_concept: jrc.euromod_be.external_validation_statistic + concept_relation: source_label + concept_authority: jrc + concept_evidence_url: https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf + concept_evidence_notes: >- + JRC Annex 3 Table A3.5, report page 120 (PDF page 122), publishes + 2021 External recipient counts in thousands. Its source continuation on + report pages 122-123 (PDF pages 124-125) names POD MI/SPP IS for income + support recipients and RVA/ONEM for unemployment-benefit recipients. + These are administrative statistics republished secondarily by JRC. + unit: count + aggregation: sum + value_scale: 1000 + expected_cell_type: number +- record_set_id: jrc.euromod_be.cy2022.macrovalidation.external_recipient_counts + provenance_class: administrative + record_set_spec_id: jrc.euromod_be.macrovalidation.external_recipient_counts.cy2022.v1 + source_record_id_prefix: jrc.euromod_be.cy2022.macrovalidation.external_recipient_counts + sheet_name: jrc_euromod_be_baseline_statistics_2025 + period_type: calendar_year + period: 2022 + geography_id: BE + geography_level: country + geography_name: Belgium + geography_vintage: current + entity: person + entity_role: validation_comparator + domain: euromod_be_macrovalidation + groupby_dimension: validation.metric_series + rows: + - value_id: a3_1_self_employment_income_external_2022 + label: A3.1 self-employment income external recipients 2022 + ordinal: 0 + row_number: 22 + expected_row_header_column: A + expected_row_header: a3_1_self_employment_income_external_2022 + filters: + validation.metric: self_employment_income_yse + validation.series: external + constraints: + - variable: validation.metric + operator: == + value: self_employment_income_yse + label: Validation metric + - variable: validation.series + operator: == + value: external + label: Validation series + - value_id: a3_5_income_support_external_2022 + label: A3.5 income support external recipients 2022 + ordinal: 1 + row_number: 23 + expected_row_header_column: A + expected_row_header: a3_5_income_support_external_2022 + filters: + validation.metric: income_support_bsa_s + validation.series: external + constraints: + - variable: validation.metric + operator: == + value: income_support_bsa_s + label: Validation metric + - variable: validation.series + operator: == + value: external + label: Validation series + - value_id: a3_5_unemployment_benefits_external_2022 + label: A3.5 unemployment benefits external recipients 2022 + ordinal: 2 + row_number: 24 + expected_row_header_column: A + expected_row_header: a3_5_unemployment_benefits_external_2022 + filters: + validation.metric: unemployment_benefits_bun + validation.series: external + constraints: + - variable: validation.metric + operator: == + value: unemployment_benefits_bun + label: Validation metric + - variable: validation.series + operator: == + value: external + label: Validation series + measures: + - measure_id: value + label: External administrative recipient count + ordinal: 0 + column: G + source_column_id: value + expected_column_header_row: 1 + expected_column_header: value + concept: euromod_be.external_macrovalidation_recipient_count + source_concept: jrc.euromod_be.external_validation_statistic + concept_relation: source_label + concept_authority: jrc + concept_evidence_url: https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf + concept_evidence_notes: >- + JRC Annex 3 Table A3.1, report page 112 (PDF page 114), publishes + 1,257 thousand External self-employment-income recipients for 2022; its + source continuation on report page 113 (PDF page 115) shows a dash and + does not identify a primary issuer for yse. Table A3.5, report page 120 + (PDF page 122), publishes the 2022 income-support and unemployment + recipient counts; its source continuation names POD MI/SPP IS and + RVA/ONEM, respectively. The named series are administrative statistics + republished secondarily by JRC; no issuer is invented for yse. + unit: count + aggregation: sum + value_scale: 1000 + expected_cell_type: number +- record_set_id: jrc.euromod_be.cy2022.macrovalidation.silc_recipient_counts + provenance_class: survey_aggregate + survey_instrument: EU-SILC + record_set_spec_id: jrc.euromod_be.macrovalidation.silc_recipient_counts.cy2022.v1 + source_record_id_prefix: jrc.euromod_be.cy2022.macrovalidation.silc_recipient_counts + sheet_name: jrc_euromod_be_baseline_statistics_2025 + period_type: calendar_year + period: 2022 + geography_id: BE + geography_level: country + geography_name: Belgium + geography_vintage: current + entity: person + entity_role: validation_comparator + domain: euromod_be_macrovalidation + groupby_dimension: validation.metric_series + rows: + - value_id: a3_5_old_age_pension_silc_2022 + label: A3.5 old-age pension EU-SILC recipients 2022 + ordinal: 0 + row_number: 25 + expected_row_header_column: A + expected_row_header: a3_5_old_age_pension_silc_2022 + filters: + validation.metric: old_age_pension_poa + validation.series: silc + constraints: + - variable: validation.metric + operator: == + value: old_age_pension_poa + label: Validation metric + - variable: validation.series + operator: == + value: silc + label: Validation series + - value_id: a3_5_survivor_pension_silc_2022 + label: A3.5 survivor pension EU-SILC recipients 2022 + ordinal: 1 + row_number: 26 + expected_row_header_column: A + expected_row_header: a3_5_survivor_pension_silc_2022 + filters: + validation.metric: survivor_pension_psu + validation.series: silc + constraints: + - variable: validation.metric + operator: == + value: survivor_pension_psu + label: Validation metric + - variable: validation.series + operator: == + value: silc + label: Validation series + measures: + - measure_id: value + label: EU-SILC recipient count + ordinal: 0 + column: G + source_column_id: value + expected_column_header_row: 1 + expected_column_header: value + concept: euromod_be.silc_macrovalidation_recipient_count + source_concept: jrc.euromod_be.silc_validation_statistic + concept_relation: source_label + concept_authority: jrc + concept_evidence_url: https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf + concept_evidence_notes: >- + JRC Annex 3 Table A3.5, report page 120 (PDF page 122), publishes + 2,273 thousand old-age-pension (poa) and 79 thousand survivor-pension + (psu) recipients in the 2022 SILC column. The corresponding External + cells are NaN and the source continuation shows dashes, so these are + EU-SILC survey aggregates, not SFPD administrative totals. They are + validation-only and must not be used as calibration targets. + unit: count + aggregation: sum + value_scale: 1000 + expected_cell_type: number +- record_set_id: jrc.euromod_be.cy2021.macrovalidation.external_amounts + provenance_class: administrative + record_set_spec_id: jrc.euromod_be.macrovalidation.external_amounts.cy2021.v1 + source_record_id_prefix: jrc.euromod_be.cy2021.macrovalidation.external_amounts + sheet_name: jrc_euromod_be_baseline_statistics_2025 + period_type: calendar_year + period: 2021 + geography_id: BE + geography_level: country + geography_name: Belgium + geography_vintage: current + entity: government + entity_role: validation_comparator + domain: euromod_be_macrovalidation + groupby_dimension: validation.metric_series + rows: + - value_id: a3_2_employment_income_external_2021 + label: A3.2 employment income external amount 2021 + ordinal: 0 + row_number: 27 + expected_row_header_column: A + expected_row_header: a3_2_employment_income_external_2021 + filters: + validation.metric: employment_income_yem + validation.series: external + constraints: + - variable: validation.metric + operator: == + value: employment_income_yem + label: Validation metric + - variable: validation.series + operator: == + value: external + label: Validation series + - value_id: a3_4_capital_income_tax_external_2021 + label: A3.4 capital income tax external amount 2021 + ordinal: 1 + row_number: 28 + expected_row_header_column: A + expected_row_header: a3_4_capital_income_tax_external_2021 + filters: + validation.metric: capital_income_tax_tinkt_s + validation.series: external + constraints: + - variable: validation.metric + operator: == + value: capital_income_tax_tinkt_s + label: Validation metric + - variable: validation.series + operator: == + value: external + label: Validation series + - value_id: a3_6_income_support_external_2021 + label: A3.6 income support external amount 2021 + ordinal: 2 + row_number: 29 + expected_row_header_column: A + expected_row_header: a3_6_income_support_external_2021 + filters: + validation.metric: income_support_bsa_s + validation.series: external + constraints: + - variable: validation.metric + operator: == + value: income_support_bsa_s + label: Validation metric + - variable: validation.series + operator: == + value: external + label: Validation series + - value_id: a3_6_income_support_elderly_external_2021 + label: A3.6 income support for the elderly external amount 2021 + ordinal: 3 + row_number: 30 + expected_row_header_column: A + expected_row_header: a3_6_income_support_elderly_external_2021 + filters: + validation.metric: income_support_elderly_bsaoa_s + validation.series: external + constraints: + - variable: validation.metric + operator: == + value: income_support_elderly_bsaoa_s + label: Validation metric + - variable: validation.series + operator: == + value: external + label: Validation series + - value_id: a3_6_child_benefits_external_2021 + label: A3.6 child benefits external amount 2021 + ordinal: 4 + row_number: 31 + expected_row_header_column: A + expected_row_header: a3_6_child_benefits_external_2021 + filters: + validation.metric: child_benefits_bch_s + validation.series: external + constraints: + - variable: validation.metric + operator: == + value: child_benefits_bch_s + label: Validation metric + - variable: validation.series + operator: == + value: external + label: Validation series + - value_id: a3_6_unemployment_benefits_external_2021 + label: A3.6 unemployment benefits external amount 2021 + ordinal: 5 + row_number: 32 + expected_row_header_column: A + expected_row_header: a3_6_unemployment_benefits_external_2021 + filters: + validation.metric: unemployment_benefits_bun + validation.series: external + constraints: + - variable: validation.metric + operator: == + value: unemployment_benefits_bun + label: Validation metric + - variable: validation.series + operator: == + value: external + label: Validation series + measures: + - measure_id: value + label: External administrative annual amount + ordinal: 0 + column: G + source_column_id: value + expected_column_header_row: 1 + expected_column_header: value + concept: euromod_be.external_macrovalidation_amount + source_concept: jrc.euromod_be.external_validation_statistic + concept_relation: source_label + concept_authority: jrc + concept_evidence_url: https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf + concept_evidence_notes: >- + JRC Annex 3 Tables A3.2, A3.4, and A3.6 publish the 2021 External + annual amounts in millions on report pages 114, 118, and 125 (PDF + pages 116, 120, and 127). The source continuations on report pages 113, + 116, and 122-124 (PDF pages 115, 118, and 124-126) name RSZ/ONSS for + employment income, NBB for capital-income tax and both income-support + amount rows, NBB for child-benefit amounts, and RVA/ONEM for + unemployment-benefit amounts. These are administrative statistics + republished secondarily by JRC; the Annex source row names NBB, not + FAMIFED or a regional agency, for the child-benefit amount, and names + FPD/SFPD only for elderly-income-support recipient counts, not amounts. + The report's narrative on page 101 says + the employment-income comparator excludes substantial holiday pay, + performance-related bonuses, and meal vouchers included in EUROMOD, + and that the external capital-income-tax series is the broader advance + levy on movable property rather than capital income alone. + unit: eur + aggregation: sum + value_scale: 1000000 + expected_cell_type: number +- record_set_id: jrc.euromod_be.cy2022.macrovalidation.external_amounts + provenance_class: administrative + record_set_spec_id: jrc.euromod_be.macrovalidation.external_amounts.cy2022.v1 + source_record_id_prefix: jrc.euromod_be.cy2022.macrovalidation.external_amounts + sheet_name: jrc_euromod_be_baseline_statistics_2025 + period_type: calendar_year + period: 2022 + geography_id: BE + geography_level: country + geography_name: Belgium + geography_vintage: current + entity: government + entity_role: validation_comparator + domain: euromod_be_macrovalidation + groupby_dimension: validation.metric_series + rows: + - value_id: a3_2_employment_income_external_2022 + label: A3.2 employment income external amount 2022 + ordinal: 0 + row_number: 33 + expected_row_header_column: A + expected_row_header: a3_2_employment_income_external_2022 + filters: + validation.metric: employment_income_yem + validation.series: external + constraints: + - variable: validation.metric + operator: == + value: employment_income_yem + label: Validation metric + - variable: validation.series + operator: == + value: external + label: Validation series + - value_id: a3_4_capital_income_tax_external_2022 + label: A3.4 capital income tax external amount 2022 + ordinal: 1 + row_number: 34 + expected_row_header_column: A + expected_row_header: a3_4_capital_income_tax_external_2022 + filters: + validation.metric: capital_income_tax_tinkt_s + validation.series: external + constraints: + - variable: validation.metric + operator: == + value: capital_income_tax_tinkt_s + label: Validation metric + - variable: validation.series + operator: == + value: external + label: Validation series + - value_id: a3_6_income_support_external_2022 + label: A3.6 income support external amount 2022 + ordinal: 2 + row_number: 35 + expected_row_header_column: A + expected_row_header: a3_6_income_support_external_2022 + filters: + validation.metric: income_support_bsa_s + validation.series: external + constraints: + - variable: validation.metric + operator: == + value: income_support_bsa_s + label: Validation metric + - variable: validation.series + operator: == + value: external + label: Validation series + - value_id: a3_6_income_support_elderly_external_2022 + label: A3.6 income support for the elderly external amount 2022 + ordinal: 3 + row_number: 36 + expected_row_header_column: A + expected_row_header: a3_6_income_support_elderly_external_2022 + filters: + validation.metric: income_support_elderly_bsaoa_s + validation.series: external + constraints: + - variable: validation.metric + operator: == + value: income_support_elderly_bsaoa_s + label: Validation metric + - variable: validation.series + operator: == + value: external + label: Validation series + - value_id: a3_6_child_benefits_external_2022 + label: A3.6 child benefits external amount 2022 + ordinal: 4 + row_number: 37 + expected_row_header_column: A + expected_row_header: a3_6_child_benefits_external_2022 + filters: + validation.metric: child_benefits_bch_s + validation.series: external + constraints: + - variable: validation.metric + operator: == + value: child_benefits_bch_s + label: Validation metric + - variable: validation.series + operator: == + value: external + label: Validation series + - value_id: a3_6_unemployment_benefits_external_2022 + label: A3.6 unemployment benefits external amount 2022 + ordinal: 5 + row_number: 38 + expected_row_header_column: A + expected_row_header: a3_6_unemployment_benefits_external_2022 + filters: + validation.metric: unemployment_benefits_bun + validation.series: external + constraints: + - variable: validation.metric + operator: == + value: unemployment_benefits_bun + label: Validation metric + - variable: validation.series + operator: == + value: external + label: Validation series + measures: + - measure_id: value + label: External administrative annual amount + ordinal: 0 + column: G + source_column_id: value + expected_column_header_row: 1 + expected_column_header: value + concept: euromod_be.external_macrovalidation_amount + source_concept: jrc.euromod_be.external_validation_statistic + concept_relation: source_label + concept_authority: jrc + concept_evidence_url: https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf + concept_evidence_notes: >- + JRC Annex 3 Tables A3.2, A3.4, and A3.6 publish the 2022 External + annual amounts in millions on report pages 114, 118, and 125 (PDF + pages 116, 120, and 127). The source continuations on report pages 113, + 116, and 122-124 (PDF pages 115, 118, and 124-126) name RSZ/ONSS for + employment income, NBB for capital-income tax and both income-support + amount rows, NBB for child-benefit amounts, and RVA/ONEM for + unemployment-benefit amounts. These are administrative statistics + republished secondarily by JRC; the Annex source row names NBB, not + FAMIFED or a regional agency, for the child-benefit amount, and names + FPD/SFPD only for elderly-income-support recipient counts, not amounts. + The report's narrative on page 101 says + the employment-income comparator excludes substantial holiday pay, + performance-related bonuses, and meal vouchers included in EUROMOD, + and that the external capital-income-tax series is the broader advance + levy on movable property rather than capital income alone. + unit: eur + aggregation: sum + value_scale: 1000000 + expected_cell_type: number +- record_set_id: jrc.euromod_be.cy2023.macrovalidation.external_amounts + provenance_class: administrative + record_set_spec_id: jrc.euromod_be.macrovalidation.external_amounts.cy2023.v1 + source_record_id_prefix: jrc.euromod_be.cy2023.macrovalidation.external_amounts + sheet_name: jrc_euromod_be_baseline_statistics_2025 + period_type: calendar_year + period: 2023 + geography_id: BE + geography_level: country + geography_name: Belgium + geography_vintage: current + entity: government + entity_role: validation_comparator + domain: euromod_be_macrovalidation + groupby_dimension: validation.metric_series + rows: + - value_id: a3_4_national_income_tax_external_2023 + label: a3 4 national income tax external 2023 + ordinal: 0 + row_number: 3 + expected_row_header_column: A + expected_row_header: a3_4_national_income_tax_external_2023 + filters: + validation.metric: national_income_tax + validation.series: external + constraints: + - variable: validation.metric + operator: == + value: national_income_tax + label: Validation metric + - variable: validation.series + operator: == + value: external + label: Validation series + - value_id: a3_4_employee_sics_external_2023 + label: a3 4 employee sics external 2023 + ordinal: 1 + row_number: 5 + expected_row_header_column: A + expected_row_header: a3_4_employee_sics_external_2023 + filters: + validation.metric: employee_social_insurance_contributions + validation.series: external + constraints: + - variable: validation.metric + operator: == + value: employee_social_insurance_contributions + label: Validation metric + - variable: validation.series + operator: == + value: external + label: Validation series + - value_id: a3_6_child_benefits_external_2023 + label: a3 6 child benefits external 2023 + ordinal: 2 + row_number: 7 + expected_row_header_column: A + expected_row_header: a3_6_child_benefits_external_2023 + filters: + validation.metric: child_benefits + validation.series: external + constraints: + - variable: validation.metric + operator: == + value: child_benefits + label: Validation metric + - variable: validation.series + operator: == + value: external + label: Validation series + - value_id: a3_6_unemployment_benefits_external_2023 + label: a3 6 unemployment benefits external 2023 + ordinal: 3 + row_number: 9 + expected_row_header_column: A + expected_row_header: a3_6_unemployment_benefits_external_2023 + filters: + validation.metric: unemployment_benefits + validation.series: external + constraints: + - variable: validation.metric + operator: == + value: unemployment_benefits + label: Validation metric + - variable: validation.series + operator: == + value: external + label: Validation series + - value_id: a3_2_employment_income_external_2023 + label: A3.2 employment income external amount 2023 + ordinal: 4 + row_number: 39 + expected_row_header_column: A + expected_row_header: a3_2_employment_income_external_2023 + filters: + validation.metric: employment_income_yem + validation.series: external + constraints: + - variable: validation.metric + operator: == + value: employment_income_yem + label: Validation metric + - variable: validation.series + operator: == + value: external + label: Validation series + - value_id: a3_6_old_age_survivor_pension_external_2023 + label: A3.6 old-age and survivor pension external amount 2023 + ordinal: 5 + row_number: 40 + expected_row_header_column: A + expected_row_header: a3_6_old_age_survivor_pension_external_2023 + filters: + validation.metric: old_age_survivor_pension_il_ext_poapsu + validation.series: external + constraints: + - variable: validation.metric + operator: == + value: old_age_survivor_pension_il_ext_poapsu + label: Validation metric + - variable: validation.series + operator: == + value: external + label: Validation series + - value_id: a3_6_income_support_external_2023 + label: A3.6 income support external amount 2023 + ordinal: 6 + row_number: 41 + expected_row_header_column: A + expected_row_header: a3_6_income_support_external_2023 + filters: + validation.metric: income_support_bsa_s + validation.series: external + constraints: + - variable: validation.metric + operator: == + value: income_support_bsa_s + label: Validation metric + - variable: validation.series + operator: == + value: external + label: Validation series + - value_id: a3_6_income_support_elderly_external_2023 + label: A3.6 income support for the elderly external amount 2023 + ordinal: 7 + row_number: 42 + expected_row_header_column: A + expected_row_header: a3_6_income_support_elderly_external_2023 + filters: + validation.metric: income_support_elderly_bsaoa_s + validation.series: external + constraints: + - variable: validation.metric + operator: == + value: income_support_elderly_bsaoa_s + label: Validation metric + - variable: validation.series + operator: == + value: external + label: Validation series + measures: + - measure_id: value + label: External administrative annual amount + ordinal: 0 + column: G + source_column_id: value + expected_column_header_row: 1 + expected_column_header: value + concept: euromod_be.external_macrovalidation_amount + source_concept: jrc.euromod_be.external_validation_statistic + concept_relation: source_label + concept_authority: jrc + concept_evidence_url: https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf + concept_evidence_notes: >- + JRC Annex 3 Tables A3.2, A3.4, and A3.6 publish the 2023 External annual + amounts in millions on report pages 114, 118, and 125-127 (PDF pages + 116, 120, and 127-129). The source continuations on report pages 113, + 116, and 122-124 (PDF pages 115, 118, and 124-126) name RSZ/ONSS for + employment income; NBB for national income tax, employee social + insurance contributions, child benefits, old-age plus survivor pensions, + and both income-support amount rows; and RVA/ONEM for unemployment + benefits. They name FPD/SFPD only for elderly-income-support recipient + counts, not amounts. These are administrative statistics republished + secondarily by JRC; the Annex names NBB, not FAMIFED or a regional + agency, for the child-benefit amount. The report's narrative on page 101 + says the employment-income comparator excludes substantial holiday pay, + performance-related bonuses, and meal vouchers included in EUROMOD. + unit: eur + aggregation: sum + value_scale: 1000000 + expected_cell_type: number - record_set_id: jrc.euromod_be.cy2022.distribution.percent_values provenance_class: model_output record_set_spec_id: jrc.euromod_be.distribution.percent_values.v1 diff --git a/tests/test_belgium_targets.py b/tests/test_belgium_targets.py index 11db8f72..ebac2a03 100644 --- a/tests/test_belgium_targets.py +++ b/tests/test_belgium_targets.py @@ -205,14 +205,26 @@ def test_belgium_euromod_comparator_has_source_urls_per_row(): ) facts = _facts(EUROMOD_BE_COMPARATOR_ALIAS, 2025) - assert len(comparator_rows) == 18 - assert len(facts) == 18 + assert len(comparator_rows) == 41 + assert len(facts) == 41 assert {row["source_url"] for row in comparator_rows} == { "https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf" } assert {fact.source.source_name for fact in facts} == {"jrc_euromod_be"} assert {fact.geography.id for fact in facts} == {"BE"} - assert {fact.measure.unit for fact in facts} == {"eur", "percent", "ratio"} + assert {fact.measure.unit for fact in facts} == { + "count", + "eur", + "percent", + "ratio", + } + assert sum(fact.provenance_class == "administrative" for fact in facts) == 25 + assert sum(fact.provenance_class == "model_output" for fact in facts) == 14 + assert sum(fact.provenance_class == "survey_aggregate" for fact in facts) == 2 + survey_facts = [ + fact for fact in facts if fact.provenance_class == "survey_aggregate" + ] + assert {fact.survey_instrument for fact in survey_facts} == {"EU-SILC"} assert validate_facts(facts).valid diff --git a/tests/test_chronicle_bundle.py b/tests/test_chronicle_bundle.py index e6ce4768..8a69f79d 100644 --- a/tests/test_chronicle_bundle.py +++ b/tests/test_chronicle_bundle.py @@ -73,16 +73,16 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): "aggregate_duplicate_key_count": 0, "entity_count": 11, "error_count": 0, - "fact_count": 155689, + "fact_count": 155790, "geography_count": 12536, "period_count": 191, "semantic_duplicate_key_count": 12, "skipped_source_count": 10, "source_count": 41, - "source_package_count": 134, + "source_package_count": 135, "warning_count": 1, } - assert len(rows) == 155689 + assert len(rows) == 155790 assert {row["provenance_class"] for row in rows} <= { "administrative", "census", @@ -100,7 +100,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): ) assert rows[0]["aggregate_fact_key"].startswith("ledger.aggregate_fact.v2:") assert rows[0]["semantic_fact_key"].startswith("ledger.semantic_fact.v2:") - assert source_packages["source_package_count"] == 134 + assert source_packages["source_package_count"] == 135 assert source_packages["skipped_source_count"] == 10 assert sorted(item["source"] for item in source_packages["skipped_sources"]) == [ "census-acs-s0101-congressional-district-age-2024", @@ -114,7 +114,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): "jct-obbba-revenue-estimates-2025", "jct-tax-expenditures-2024", ] - assert coverage["fact_count"] == 155689 + assert coverage["fact_count"] == 155790 assert coverage["counts"]["by_source"] == { "bea": 445, "bfp_economic_outlook": 5, @@ -128,7 +128,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): "cms_nhe": 3, "dft": 81, "dwp": 6547, - "eurostat": 108, + "eurostat": 186, "federal_reserve": 1, "hhs_acf_liheap": 2, "hhs_acf_tanf": 110, @@ -136,7 +136,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): "ici": 12, "irs_soi": 40063, "isc": 2, - "jrc_euromod_be": 18, + "jrc_euromod_be": 41, "kff": 52, "mhclg": 2672, "nbb_national_accounts": 1, @@ -159,7 +159,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): "welshgov": 198, } table_counts = coverage["counts"]["by_source_table"] - assert len(table_counts) == 129 + assert len(table_counts) == 130 assert ( table_counts[ "dwp:Universal Credit childcare element statistics to August 2025, Table 1" @@ -325,7 +325,14 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): table_counts[ "jrc_euromod_be:EUROMOD Country Report Belgium 2025 validation tables" ] - == 18 + == 41 + ) + assert ( + table_counts[ + "eurostat:Eurostat nasa_10_nf_tr Non-financial transactions - " + "annual data for Belgian households and NPISH" + ] + == 78 ) assert ( table_counts[ @@ -404,10 +411,10 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): "calendar_year:2018": 86, "calendar_year:2019": 85, "calendar_year:2020": 85, - "calendar_year:2021": 3992, - "calendar_year:2022": 1913, - "calendar_year:2023": 6202, - "calendar_year:2024": 33799, + "calendar_year:2021": 4000, + "calendar_year:2022": 1950, + "calendar_year:2023": 6232, + "calendar_year:2024": 33825, "calendar_year:2025": 4446, "calendar_year:2026": 241, "calendar_year:2027": 220, @@ -549,7 +556,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): "tax_year:2023": 48436, "tax_year:2024": 40, } - assert coverage["counts"]["by_geography"]["country:BE"] == 67 + assert coverage["counts"]["by_geography"]["country:BE"] == 168 assert coverage["counts"]["by_geography"]["country:DE"] == 36 assert coverage["counts"]["by_geography"]["country:FR"] == 36 assert coverage["counts"]["by_geography"]["nuts1:BE1"] == 6 @@ -569,11 +576,11 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): "dwelling": 12708, "family": 107, "firm": 1439, - "government": 294, - "household": 40435, + "government": 310, + "household": 40513, "institutional_sector": 103, "pension_plan": 2, - "person": 60272, + "person": 60279, "social_protection_scheme": 27, "tax_unit": 40069, } @@ -730,6 +737,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): for source in ( "eurostat-gov-10a-taxag", "eurostat-spr-exp-func", + "eurostat-nasa-10-nf-tr", "eurostat-ilc-li02", "eurostat-ilc-di01", ): diff --git a/tests/test_etl_eurostat.py b/tests/test_etl_eurostat.py index 5618269b..14d939ba 100644 --- a/tests/test_etl_eurostat.py +++ b/tests/test_etl_eurostat.py @@ -33,10 +33,16 @@ EUROSTAT_PACKAGES = { "eurostat-gov-10a-taxag": ("gov_10a_taxag", 2024, 24, 24), "eurostat-spr-exp-func": ("spr_exp_func", 2023, 27, 27), + "eurostat-nasa-10-nf-tr": ("nasa_10_nf_tr", 2024, 78, 84), "eurostat-ilc-li02": ("ilc_li02", 2024, 3, 3), "eurostat-ilc-di01": ("ilc_di01", 2024, 54, 54), } EUROSTAT_DATASET_IDS = {values[0] for values in EUROSTAT_PACKAGES.values()} +NASA_10_NF_TR_ALIAS = "eurostat-nasa-10-nf-tr" +NASA_10_NF_TR_YEAR = 2024 +NASA_10_NF_TR_SHA256 = ( + "30d3f5bf3d1414c78633d13f505558b837b84e92c24b17050249ab19cec20a6d" +) EXPECTED_QUERY_FILTERS = { "gov_10a_taxag": { "freq": ["A"], @@ -64,6 +70,31 @@ "geo": ["BE", "DE", "FR"], "time": ["2023"], }, + "nasa_10_nf_tr": { + "freq": ["A"], + "unit": ["CP_MEUR"], + "sector": ["S14_S15"], + "na_item": [ + "B2G", + "B3G", + "B3N", + "B6G", + "D1", + "D11", + "D12", + "D4", + "D41", + "D42", + "D44", + "D45", + "D5", + "D61", + "D62", + ], + "direct": ["RECV", "PAID"], + "geo": ["BE"], + "time": ["2022", "2023", "2024"], + }, "ilc_li02": { "freq": ["A"], "statinfo": ["MED_EI"], @@ -95,6 +126,130 @@ def _package_outputs(alias: str): return package, rows, cells, facts +@lru_cache +def _nasa_10_nf_tr_outputs(): + return _package_outputs(NASA_10_NF_TR_ALIAS) + + +def test_nasa_10_nf_tr_preserves_full_cube_and_selected_fact_lineage(): + package, rows, cells, facts = _nasa_10_nf_tr_outputs() + package_report = validate_source_package( + NASA_10_NF_TR_ALIAS, + year=NASA_10_NF_TR_YEAR, + ) + rows_by_key = {build_source_row_key(row): row for row in rows} + + assert NASA_10_NF_TR_ALIAS in SOURCE_PACKAGE_ALIASES + assert package.artifact.parser == "json_stat_2_full_rows" + assert package_report.valid, package_report.to_dict() + assert package_report.counts == { + "record_set_count": 6, + "row_count": 78, + "measure_count": 6, + "source_record_count": 78, + "source_region_count": 6, + } + assert len(package.record_sets) == 6 + assert len(rows) == 84 + assert len(facts) == 78 + assert validate_source_rows(rows).valid + assert validate_source_cells(cells).valid + assert validate_facts(facts).valid + contract_report = validate_consumer_fact_contract(facts) + assert contract_report.valid, contract_report.to_dict() + + assert Counter((fact.period.type, fact.period.value) for fact in facts) == { + ("calendar_year", 2022): 26, + ("calendar_year", 2023): 26, + ("calendar_year", 2024): 26, + } + assert Counter(fact.filters["direct"] for fact in facts) == { + "PAID": 39, + "RECV": 39, + } + assert {fact.provenance_class for fact in facts} == {"administrative"} + assert {fact.survey_instrument for fact in facts} == {None} + assert {fact.entity.name for fact in facts} == {"household"} + assert {fact.entity.role for fact in facts} == { + "resident_households_and_npish" + } + assert {fact.measure.unit for fact in facts} == {"eur"} + assert {fact.measure.concept_relation for fact in facts} == {"exact"} + assert {fact.measure.concept_authority for fact in facts} == {"ledger-be"} + assert {fact.measure.concept for fact in facts} == { + "belgium_household_national_accounts_non_financial_transaction_amount" + } + + groupby_value_ids = {fact.layout.groupby_value_id for fact in facts} + assert { + "belgium_household_mixed_income_gross", + "belgium_household_disposable_income_gross", + "belgium_household_interest_received", + "belgium_household_distributed_income_of_corporations_received", + "belgium_household_wages_and_salaries_received", + "belgium_household_current_taxes_on_income_paid", + "belgium_household_net_social_contributions_paid", + "belgium_household_social_benefits_received", + } <= groupby_value_ids + + null_coordinates = { + ( + row.values["direct"], + row.values["na_item"], + str(row.values["time"]), + ) + for row in rows + if row.values["value"] is None + } + assert null_coordinates == { + (direction, item, str(year)) + for direction, item in (("PAID", "D42"), ("RECV", "D5")) + for year in (2022, 2023, 2024) + } + + assert len({fact.source_record_id for fact in facts}) == 78 + for fact in facts: + assert len(fact.source_row_keys) == 1 + assert len(fact.source_cell_keys) == 8 + source_row = rows_by_key[fact.source_row_keys[0]] + assert source_row.values["value"] is not None + assert fact.value == source_row.values["value"] * 1_000_000 + assert fact.filters["direct"] == source_row.values["direct"] + assert fact.filters["na_item"] == source_row.values["na_item"] + assert str(fact.period.value) == str(source_row.values["time"]) + assert fact.source.source_sha256 == NASA_10_NF_TR_SHA256 + assert NASA_10_NF_TR_SHA256 in fact.source.raw_r2_key + assert fact.source.raw_r2_uri == ( + f"r2://{fact.source.raw_r2_bucket}/{fact.source.raw_r2_key}" + ) + + manifest_path = ( + REPO_ROOT + / "db" + / "data" + / "eurostat" + / "nasa_10_nf_tr" + / "manifest.yaml" + ) + manifest = yaml.safe_load(manifest_path.read_text()) + file_spec = manifest["files"][NASA_10_NF_TR_YEAR] + artifact_path = manifest_path.parent / file_spec["filename"] + artifact_bytes = artifact_path.read_bytes() + expected_r2_key = ( + "raw/eurostat/eurostat-nasa-10-nf-tr/2024/" + f"{NASA_10_NF_TR_SHA256}/nasa_10_nf_tr.json" + ) + + assert hashlib.sha256(artifact_bytes).hexdigest() == NASA_10_NF_TR_SHA256 + assert len(artifact_bytes) == 5098 + assert file_spec["sha256"] == NASA_10_NF_TR_SHA256 + assert file_spec["size_bytes"] == 5098 + assert file_spec["storage"]["r2"]["key"] == expected_r2_key + assert file_spec["storage"]["r2"]["uri"] == ( + f"r2://ledger-raw/{expected_r2_key}" + ) + + def test_eurostat_aliases_and_packages_validate_end_to_end(): assert set(EUROSTAT_PACKAGES) <= set(SOURCE_PACKAGE_ALIASES) @@ -133,6 +288,7 @@ def test_eurostat_packages_pass_full_agent_acceptance(alias, tmp_path): def test_eurostat_facts_preserve_raw_cube_dimensions_and_scaling(): unit_mapping = { "MIO_EUR": ("eur", 1_000_000), + "CP_MEUR": ("eur", 1_000_000), "PC": ("percent", 1), "EUR": ("eur", 1), } @@ -166,6 +322,7 @@ def test_eurostat_provenance_and_evaluation_only_boundary(): administrative_aliases = { "eurostat-gov-10a-taxag", "eurostat-spr-exp-func", + "eurostat-nasa-10-nf-tr", } survey_aliases = {"eurostat-ilc-li02", "eurostat-ilc-di01"} @@ -247,6 +404,10 @@ def test_eurostat_production_surfaces_carry_no_fixture_identity(): def test_eurostat_artifacts_match_verified_live_dimension_shapes_and_labels(): expected_shapes = { + "nasa_10_nf_tr": ( + ["freq", "unit", "direct", "na_item", "sector", "geo", "time"], + [1, 1, 2, 14, 1, 1, 3], + ), "spr_exp_func": ( ["freq", "spdeps", "spfunc", "unit", "geo", "time"], [1, 1, 9, 1, 3, 1],