diff --git a/LANE_C4_REPORT.md b/LANE_C4_REPORT.md new file mode 100644 index 0000000..ef8f14c --- /dev/null +++ b/LANE_C4_REPORT.md @@ -0,0 +1,225 @@ +# Lane C4 — JRC EUROMOD-BE Annex 3 model columns + +## Outcome + +This lane extends the JRC EUROMOD-BE 2025 comparator from 41 to 90 source +facts by appending 49 publisher cells: + +- 26 `validation.series = euromod` model-output rows; +- 23 `validation.series = ratio` rows, only where the report prints the + relevant comparator ratio; +- no new External or SILC facts, no imputation, alignment, reconciliation, or + PolicyEngine-computed values. + +All 49 additions are `provenance_class: model_output` and validation-only. +The package now contains 32 EUROMOD rows, 29 ratio rows, 27 External rows, and +2 SILC rows. Provenance totals are 63 model outputs, 25 administrative facts, +and 2 survey aggregates. + +The explicit `yse` amount instruction is represented by the 2021–2023 A3.2 +EUROMOD cells even though their External and ratio cells are blank. All other +EUROMOD/ratio additions use the same period as a packaged External or SILC +fact. The original CSV header plus 41 rows remains byte-for-byte identical to +the C2 artifact: SHA-256 +`2ef69251a72caaab042706c77143fa4f86dde2f800747ebb421b5f7b9a45e394`. + +## Artifact pins + +| Artifact | SHA-256 | Bytes | +|---|---|---:| +| Cached JRC PDF | `7c4b0aa4f1f96161e1ce7e4ad300a3fa56cdad7241f82fb650eeec03d30f087b` | 4,184,683 | +| C2 curated CSV prefix (header + 41 rows) | `2ef69251a72caaab042706c77143fa4f86dde2f800747ebb421b5f7b9a45e394` | 6,956 | +| Lane C4 curated CSV | `1258dc2a6dd76d3fcf5895c62d36229c03b9cc1c8fac5be49619cf7adbc1496d` | 15,198 | + +The manifest declares, but this lane does not upload, the content-addressed +key: + +`raw/belgium/jrc-euromod-be-baseline-statistics-2025/2025/1258dc2a6dd76d3fcf5895c62d36229c03b9cc1c8fac5be49619cf7adbc1496d/jrc_euromod_be_baseline_statistics_2025.csv` + +## PDF extraction + +The cached `pdfplumber` 0.11.10 interpreter and these file-page numbers were +used. Printed report pages are two lower than PDF file pages. + +```sh +/Users/maxghenis/.cache/uv/archive-v0/HLlfXwC9DMcE0Q6gCdMwl/bin/python - <<'PY' +import pdfplumber + +path = ".lane-raw/Y15_CR_BE_final.pdf" +pages = (114, 116, 120, 122, 127, 129) +with pdfplumber.open(path) as pdf: + for number in pages: + print(f"=== PDF PAGE {number} ===") + print( + pdf.pages[number - 1].extract_text( + x_tolerance=2, + y_tolerance=3, + ) + or "" + ) +PY +``` + +| Annex table | Printed report page | PDF file page | +|---|---:|---:| +| A3.1 recipient counts | 112 | 114 | +| A3.2 annual amounts | 114 | 116 | +| A3.4 direct taxes and SIC amounts | 118 | 120 | +| A3.5 benefit recipient counts | 120 | 122 | +| A3.6 benefit annual amounts | 125 | 127 | +| A3.6 combined-pension continuation | 127 | 129 | + +For administrative facts, each ratio below is the report's rightmost +EUROMOD/External ratio. For the A3.5 `poa` and `psu` survey facts, it is the +middle EUROMOD/SILC ratio because the External cells are blank. + +## New rows + +Values below are verbatim printed cells before the package's declared scaling. +Count records use `unit: count` with `value_scale: 1000`; amount records use +`unit: eur` with `value_scale: 1000000`; ratios use `unit: ratio` and +`value_scale: 1`. + +| Record id | Period | Printed value | Record unit / printed table unit | Report / PDF page | +|---|---:|---:|---|---| +| `a3_5_income_support_euromod_2021` | 2021 | 133 | count (printed thousands) | 120 / PDF 122 | +| `a3_5_unemployment_benefits_euromod_2021` | 2021 | 1,930 | count (printed thousands) | 120 / PDF 122 | +| `a3_1_self_employment_income_euromod_2022` | 2022 | 851 | count (printed thousands) | 112 / PDF 114 | +| `a3_5_income_support_euromod_2022` | 2022 | 159 | count (printed thousands) | 120 / PDF 122 | +| `a3_5_unemployment_benefits_euromod_2022` | 2022 | 1,930 | count (printed thousands) | 120 / PDF 122 | +| `a3_5_old_age_pension_euromod_2022` | 2022 | 2,273 | count (printed thousands) | 120 / PDF 122 | +| `a3_5_survivor_pension_euromod_2022` | 2022 | 79 | count (printed thousands) | 120 / PDF 122 | +| `a3_2_self_employment_income_euromod_2021` | 2021 | 20,965 | EUR (printed millions) | 114 / PDF 116 | +| `a3_2_employment_income_euromod_2021` | 2021 | 197,874 | EUR (printed millions) | 114 / PDF 116 | +| `a3_4_capital_income_tax_euromod_2021` | 2021 | 1,412 | EUR (printed millions) | 118 / PDF 120 | +| `a3_6_income_support_euromod_2021` | 2021 | 1,055 | EUR (printed millions) | 125 / PDF 127 | +| `a3_6_income_support_elderly_euromod_2021` | 2021 | 0 | EUR (printed millions) | 125 / PDF 127 | +| `a3_6_child_benefits_euromod_2021` | 2021 | 6,885 | EUR (printed millions) | 125 / PDF 127 | +| `a3_6_unemployment_benefits_euromod_2021` | 2021 | 10,416 | EUR (printed millions) | 125 / PDF 127 | +| `a3_2_self_employment_income_euromod_2022` | 2022 | 21,981 | EUR (printed millions) | 114 / PDF 116 | +| `a3_2_employment_income_euromod_2022` | 2022 | 212,332 | EUR (printed millions) | 114 / PDF 116 | +| `a3_4_capital_income_tax_euromod_2022` | 2022 | 1,646 | EUR (printed millions) | 118 / PDF 120 | +| `a3_6_income_support_euromod_2022` | 2022 | 1,242 | EUR (printed millions) | 125 / PDF 127 | +| `a3_6_income_support_elderly_euromod_2022` | 2022 | 0 | EUR (printed millions) | 125 / PDF 127 | +| `a3_6_child_benefits_euromod_2022` | 2022 | 7,160 | EUR (printed millions) | 125 / PDF 127 | +| `a3_6_unemployment_benefits_euromod_2022` | 2022 | 11,010 | EUR (printed millions) | 125 / PDF 127 | +| `a3_2_self_employment_income_euromod_2023` | 2023 | 23,764 | EUR (printed millions) | 114 / PDF 116 | +| `a3_2_employment_income_euromod_2023` | 2023 | 228,596 | EUR (printed millions) | 114 / PDF 116 | +| `a3_6_income_support_euromod_2023` | 2023 | 1,356 | EUR (printed millions) | 125 / PDF 127 | +| `a3_6_income_support_elderly_euromod_2023` | 2023 | 0 | EUR (printed millions) | 125 / PDF 127 | +| `a3_6_old_age_survivor_pension_euromod_2023` | 2023 | 62,827 | EUR (printed millions) | 127 / PDF 129 | +| `a3_5_income_support_ratio_2021` | 2021 | 0.62 | ratio | 120 / PDF 122 | +| `a3_5_unemployment_benefits_ratio_2021` | 2021 | 1.95 | ratio | 120 / PDF 122 | +| `a3_2_employment_income_ratio_2021` | 2021 | 1.35 | ratio | 114 / PDF 116 | +| `a3_4_capital_income_tax_ratio_2021` | 2021 | 0.40 | ratio | 118 / PDF 120 | +| `a3_6_income_support_ratio_2021` | 2021 | 0.64 | ratio | 125 / PDF 127 | +| `a3_6_income_support_elderly_ratio_2021` | 2021 | 0.00 | ratio | 125 / PDF 127 | +| `a3_6_child_benefits_ratio_2021` | 2021 | 0.94 | ratio | 125 / PDF 127 | +| `a3_6_unemployment_benefits_ratio_2021` | 2021 | 1.27 | ratio | 125 / PDF 127 | +| `a3_1_self_employment_income_ratio_2022` | 2022 | 0.68 | ratio | 112 / PDF 114 | +| `a3_5_income_support_ratio_2022` | 2022 | 0.66 | ratio | 120 / PDF 122 | +| `a3_5_unemployment_benefits_ratio_2022` | 2022 | 2.37 | ratio | 120 / PDF 122 | +| `a3_5_old_age_pension_ratio_2022` | 2022 | 1.00 | ratio | 120 / PDF 122 | +| `a3_5_survivor_pension_ratio_2022` | 2022 | 1.00 | ratio | 120 / PDF 122 | +| `a3_2_employment_income_ratio_2022` | 2022 | 1.31 | ratio | 114 / PDF 116 | +| `a3_4_capital_income_tax_ratio_2022` | 2022 | 0.40 | ratio | 118 / PDF 120 | +| `a3_6_income_support_ratio_2022` | 2022 | 0.69 | ratio | 125 / PDF 127 | +| `a3_6_income_support_elderly_ratio_2022` | 2022 | 0.00 | ratio | 125 / PDF 127 | +| `a3_6_child_benefits_ratio_2022` | 2022 | 0.93 | ratio | 125 / PDF 127 | +| `a3_6_unemployment_benefits_ratio_2022` | 2022 | 1.65 | ratio | 125 / PDF 127 | +| `a3_2_employment_income_ratio_2023` | 2023 | 1.30 | ratio | 114 / PDF 116 | +| `a3_6_income_support_ratio_2023` | 2023 | 0.66 | ratio | 125 / PDF 127 | +| `a3_6_income_support_elderly_ratio_2023` | 2023 | 0.00 | ratio | 125 / PDF 127 | +| `a3_6_old_age_survivor_pension_ratio_2023` | 2023 | 0.97 | ratio | 127 / PDF 129 | + +## Blanks and exclusions + +- Every one of C2's 21 appended External facts and two appended SILC facts has + a nonblank same-period EUROMOD counterpart and a printed relevant ratio. + The documented missing-counterpart set is therefore empty. +- A3.2 `yse` prints EUROMOD amounts of 20,965, 21,981, and 23,764 million for + 2021–2023. Its External and ratio cells are `NaN` in every year, so only + the explicitly requested EUROMOD rows are present. +- A3.5 `poa` and `psu` have blank External and External-ratio cells. Their + packaged 2022 comparators are SILC, and the printed EUROMOD/SILC ratios are + 1.00. +- A3.6 `bsaoa_s` EUROMOD cells are printed zeroes and its ratios are printed + `0.00`; these are values, not blanks. +- A3.4 `tinkt_s` External and External-ratio cells are blank for 2023–2024. + The unpaired 2023/2024 EUROMOD cells are absent. +- A3.5 `bsa_s` and `bun` External and External-ratio cells are blank for + 2023–2024. Requested A3.6 rows have blank 2024 External/ratio cells. +- A3.1 `yse` has a populated 2021 External cell, and A3.6 + `il_ext_poapsu` has populated 2021/2022 External cells, but those periods + are not facts in the package. Under the same-period rule, this lane does not + expand their External scope; the requested combined-pension pair remains + 2023 only. +- No blank cell was converted to zero and no ratio was calculated from the + printed values. + +## Package structure and source boundary + +The 18 record sets separate recipient counts from annual amounts and also +separate their ratios: + +- person/count records preserve the table's thousands with scale 1,000; +- government/EUR records preserve the table's millions with scale 1,000,000; +- person recipient-count ratios and government amount ratios use distinct + concepts so identically named `bsa_s` and `bun` metrics do not collide; +- every EUROMOD and ratio row is a publisher model output and validation-only. + +Chronicle stores only JRC's published cells. It performs no aging, period +alignment, target activation, support selection, or solver construction. + +## Validation commands and tails + +```sh +.venv/bin/python -m chronicle.harness validate-package \ + jrc-euromod-be-baseline-statistics-2025 --year 2025 + +JRC_C4_SUITE_DIR=$(mktemp -d /tmp/chronicle-c4-jrc.XXXXXX) +.venv/bin/python -m chronicle.harness build-suite \ + jrc-euromod-be-baseline-statistics-2025 --year 2025 \ + --out "$JRC_C4_SUITE_DIR" --replace +.venv/bin/python -m chronicle.harness validate-source-rows \ + --input "$JRC_C4_SUITE_DIR/source_rows.jsonl" +.venv/bin/python -m chronicle.harness validate-source-cells \ + --input "$JRC_C4_SUITE_DIR/source_cells.jsonl" +.venv/bin/python -m chronicle.harness validate-facts \ + --input "$JRC_C4_SUITE_DIR/facts.jsonl" + +.venv/bin/python -m pytest -q tests/test_belgium_targets.py +.venv/bin/python -m pytest -q +git diff --check +``` + +| Check | Tail / result | +|---|---| +| `validate-package` | valid; 18 record sets, 90 selected rows, 18 measures, 90 source records, 18 source regions; 0 errors, 0 warnings | +| `build-suite` | valid; 90 source rows, 637 source cells, 90 facts, 90 consumer facts, 180 constraints, lineage 1.0, 0 acceptance errors | +| source-row validator | valid; 90 rows; 0 errors, 0 warnings | +| source-cell validator | valid; 637 cells; 0 errors, 0 warnings | +| fact validator | valid; 90 facts; 25 administrative, 63 model-output, 2 survey-aggregate; 0 errors, 0 warnings | +| Belgium tests | 13 passed; 12 warnings | +| repository tests | 693 passed, 1 skipped, 14 warnings in 1,056.53s (0:17:36) | +| `git diff --check` | clean | + +The build acceptance report has the expected single nonfatal +`concept_alignment_validation_skipped` warning because no Axiom CLI command +is configured. Evidence presence, row semantics, artifact R2 declaration, +selectors, lineage, and all other acceptance checks pass. + +## Commit list + +| Commit | Purpose | +|---|---| +| `b12bfde` | Branch base: merge PR #190, including C2 | +| `7a110c8` | Append JRC model/ratio cells, extend selectors/tests, and add the initial report | +| local report-only follow-up, `Finalize Lane C4 validation report` | Record the final 693-test pass and clean-diff audit | + +No push, stash operation, R2 upload, or network access was performed by this +Codex session. During the final audit, both the local branch and the +`origin/jrc-euromod-columns` remote-tracking ref already pointed to `7a110c8`; +the report-only follow-up remains local. + +LANE C4 DONE 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 5359c8b..4757224 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 @@ -40,3 +40,52 @@ a3_2_employment_income_external_2023,2023,employment_income_yem,external,A3.2,ht 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 +a3_5_income_support_euromod_2021,2021,income_support_bsa_s,euromod,A3.5,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,133 +a3_5_unemployment_benefits_euromod_2021,2021,unemployment_benefits_bun,euromod,A3.5,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,1930 +a3_1_self_employment_income_euromod_2022,2022,self_employment_income_yse,euromod,A3.1,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,851 +a3_5_income_support_euromod_2022,2022,income_support_bsa_s,euromod,A3.5,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,159 +a3_5_unemployment_benefits_euromod_2022,2022,unemployment_benefits_bun,euromod,A3.5,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,1930 +a3_5_old_age_pension_euromod_2022,2022,old_age_pension_poa,euromod,A3.5,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,2273 +a3_5_survivor_pension_euromod_2022,2022,survivor_pension_psu,euromod,A3.5,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,79 +a3_2_self_employment_income_euromod_2021,2021,self_employment_income_yse,euromod,A3.2,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,20965 +a3_2_employment_income_euromod_2021,2021,employment_income_yem,euromod,A3.2,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,197874 +a3_4_capital_income_tax_euromod_2021,2021,capital_income_tax_tinkt_s,euromod,A3.4,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,1412 +a3_6_income_support_euromod_2021,2021,income_support_bsa_s,euromod,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,1055 +a3_6_income_support_elderly_euromod_2021,2021,income_support_elderly_bsaoa_s,euromod,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,0 +a3_6_child_benefits_euromod_2021,2021,child_benefits_bch_s,euromod,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,6885 +a3_6_unemployment_benefits_euromod_2021,2021,unemployment_benefits_bun,euromod,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,10416 +a3_2_self_employment_income_euromod_2022,2022,self_employment_income_yse,euromod,A3.2,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,21981 +a3_2_employment_income_euromod_2022,2022,employment_income_yem,euromod,A3.2,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,212332 +a3_4_capital_income_tax_euromod_2022,2022,capital_income_tax_tinkt_s,euromod,A3.4,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,1646 +a3_6_income_support_euromod_2022,2022,income_support_bsa_s,euromod,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,1242 +a3_6_income_support_elderly_euromod_2022,2022,income_support_elderly_bsaoa_s,euromod,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,0 +a3_6_child_benefits_euromod_2022,2022,child_benefits_bch_s,euromod,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,7160 +a3_6_unemployment_benefits_euromod_2022,2022,unemployment_benefits_bun,euromod,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,11010 +a3_2_self_employment_income_euromod_2023,2023,self_employment_income_yse,euromod,A3.2,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,23764 +a3_2_employment_income_euromod_2023,2023,employment_income_yem,euromod,A3.2,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,228596 +a3_6_income_support_euromod_2023,2023,income_support_bsa_s,euromod,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,1356 +a3_6_income_support_elderly_euromod_2023,2023,income_support_elderly_bsaoa_s,euromod,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,0 +a3_6_old_age_survivor_pension_euromod_2023,2023,old_age_survivor_pension_il_ext_poapsu,euromod,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,62827 +a3_5_income_support_ratio_2021,2021,income_support_bsa_s,ratio,A3.5,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,0.62 +a3_5_unemployment_benefits_ratio_2021,2021,unemployment_benefits_bun,ratio,A3.5,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,1.95 +a3_2_employment_income_ratio_2021,2021,employment_income_yem,ratio,A3.2,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,1.35 +a3_4_capital_income_tax_ratio_2021,2021,capital_income_tax_tinkt_s,ratio,A3.4,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,0.40 +a3_6_income_support_ratio_2021,2021,income_support_bsa_s,ratio,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,0.64 +a3_6_income_support_elderly_ratio_2021,2021,income_support_elderly_bsaoa_s,ratio,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,0.00 +a3_6_child_benefits_ratio_2021,2021,child_benefits_bch_s,ratio,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,0.94 +a3_6_unemployment_benefits_ratio_2021,2021,unemployment_benefits_bun,ratio,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,1.27 +a3_1_self_employment_income_ratio_2022,2022,self_employment_income_yse,ratio,A3.1,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,0.68 +a3_5_income_support_ratio_2022,2022,income_support_bsa_s,ratio,A3.5,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,0.66 +a3_5_unemployment_benefits_ratio_2022,2022,unemployment_benefits_bun,ratio,A3.5,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,2.37 +a3_5_old_age_pension_ratio_2022,2022,old_age_pension_poa,ratio,A3.5,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,1.00 +a3_5_survivor_pension_ratio_2022,2022,survivor_pension_psu,ratio,A3.5,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,1.00 +a3_2_employment_income_ratio_2022,2022,employment_income_yem,ratio,A3.2,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,1.31 +a3_4_capital_income_tax_ratio_2022,2022,capital_income_tax_tinkt_s,ratio,A3.4,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,0.40 +a3_6_income_support_ratio_2022,2022,income_support_bsa_s,ratio,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,0.69 +a3_6_income_support_elderly_ratio_2022,2022,income_support_elderly_bsaoa_s,ratio,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,0.00 +a3_6_child_benefits_ratio_2022,2022,child_benefits_bch_s,ratio,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,0.93 +a3_6_unemployment_benefits_ratio_2022,2022,unemployment_benefits_bun,ratio,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,1.65 +a3_2_employment_income_ratio_2023,2023,employment_income_yem,ratio,A3.2,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,1.30 +a3_6_income_support_ratio_2023,2023,income_support_bsa_s,ratio,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,0.66 +a3_6_income_support_elderly_ratio_2023,2023,income_support_elderly_bsaoa_s,ratio,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,0.00 +a3_6_old_age_survivor_pension_ratio_2023,2023,old_age_survivor_pension_il_ext_poapsu,ratio,A3.6,https://euromod-web.jrc.ec.europa.eu/sites/default/files/2025-02/Y15_CR_BE_final.pdf,0.97 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 a0ae171..42c5c0b 100644 --- a/db/data/jrc/euromod_be_baseline_statistics_2025/manifest.yaml +++ b/db/data/jrc/euromod_be_baseline_statistics_2025/manifest.yaml @@ -8,14 +8,14 @@ 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: 2ef69251a72caaab042706c77143fa4f86dde2f800747ebb421b5f7b9a45e394 - size_bytes: 6956 + sha256: 1258dc2a6dd76d3fcf5895c62d36229c03b9cc1c8fac5be49619cf7adbc1496d + size_bytes: 15198 storage: r2: provider: r2 bucket: ledger-raw - 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 + key: raw/belgium/jrc-euromod-be-baseline-statistics-2025/2025/1258dc2a6dd76d3fcf5895c62d36229c03b9cc1c8fac5be49619cf7adbc1496d/jrc_euromod_be_baseline_statistics_2025.csv + uri: r2://ledger-raw/raw/belgium/jrc-euromod-be-baseline-statistics-2025/2025/1258dc2a6dd76d3fcf5895c62d36229c03b9cc1c8fac5be49619cf7adbc1496d/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 @@ -23,4 +23,6 @@ files: 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. + External series ending in 2023. Annex 3 EUROMOD model outputs and only + the ratios printed for their External or SILC comparators are retained + as validation-only facts; blank comparator cells are not filled. 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 66400d2..675ac1a 100644 --- a/packages/jrc/euromod_be_baseline_statistics_2025/source_package.yaml +++ b/packages/jrc/euromod_be_baseline_statistics_2025/source_package.yaml @@ -103,6 +103,96 @@ record_sets: operator: == value: euromod label: Validation series + - value_id: a3_2_self_employment_income_euromod_2023 + label: A3.2 self-employment income EUROMOD amount 2023 + ordinal: 4 + row_number: 64 + expected_row_header_column: A + expected_row_header: a3_2_self_employment_income_euromod_2023 + filters: + validation.metric: self_employment_income_yse + validation.series: euromod + constraints: + - variable: validation.metric + operator: == + value: self_employment_income_yse + label: Validation metric + - variable: validation.series + operator: == + value: euromod + label: Validation series + - value_id: a3_2_employment_income_euromod_2023 + label: A3.2 employment income EUROMOD amount 2023 + ordinal: 5 + row_number: 65 + expected_row_header_column: A + expected_row_header: a3_2_employment_income_euromod_2023 + filters: + validation.metric: employment_income_yem + validation.series: euromod + constraints: + - variable: validation.metric + operator: == + value: employment_income_yem + label: Validation metric + - variable: validation.series + operator: == + value: euromod + label: Validation series + - value_id: a3_6_income_support_euromod_2023 + label: A3.6 income support EUROMOD amount 2023 + ordinal: 6 + row_number: 66 + expected_row_header_column: A + expected_row_header: a3_6_income_support_euromod_2023 + filters: + validation.metric: income_support_bsa_s + validation.series: euromod + constraints: + - variable: validation.metric + operator: == + value: income_support_bsa_s + label: Validation metric + - variable: validation.series + operator: == + value: euromod + label: Validation series + - value_id: a3_6_income_support_elderly_euromod_2023 + label: A3.6 elderly income support EUROMOD amount 2023 + ordinal: 7 + row_number: 67 + expected_row_header_column: A + expected_row_header: a3_6_income_support_elderly_euromod_2023 + filters: + validation.metric: income_support_elderly_bsaoa_s + validation.series: euromod + constraints: + - variable: validation.metric + operator: == + value: income_support_elderly_bsaoa_s + label: Validation metric + - variable: validation.series + operator: == + value: euromod + label: Validation series + - value_id: a3_6_old_age_survivor_pension_euromod_2023 + label: A3.6 old-age and survivor pension EUROMOD amount 2023 + ordinal: 8 + row_number: 68 + expected_row_header_column: A + expected_row_header: a3_6_old_age_survivor_pension_euromod_2023 + filters: + validation.metric: old_age_survivor_pension_il_ext_poapsu + validation.series: euromod + constraints: + - variable: validation.metric + operator: == + value: old_age_survivor_pension_il_ext_poapsu + label: Validation metric + - variable: validation.series + operator: == + value: euromod + label: Validation series measures: - measure_id: value label: Validation table value @@ -210,6 +300,78 @@ record_sets: operator: == value: ratio label: Validation series + - value_id: a3_2_employment_income_ratio_2023 + label: A3.2 employment income external ratio 2023 + ordinal: 4 + row_number: 88 + expected_row_header_column: A + expected_row_header: a3_2_employment_income_ratio_2023 + filters: + validation.metric: employment_income_yem + validation.series: ratio + constraints: + - variable: validation.metric + operator: == + value: employment_income_yem + label: Validation metric + - variable: validation.series + operator: == + value: ratio + label: Validation series + - value_id: a3_6_income_support_ratio_2023 + label: A3.6 income support external ratio 2023 + ordinal: 5 + row_number: 89 + expected_row_header_column: A + expected_row_header: a3_6_income_support_ratio_2023 + filters: + validation.metric: income_support_bsa_s + validation.series: ratio + constraints: + - variable: validation.metric + operator: == + value: income_support_bsa_s + label: Validation metric + - variable: validation.series + operator: == + value: ratio + label: Validation series + - value_id: a3_6_income_support_elderly_ratio_2023 + label: A3.6 elderly income support external ratio 2023 + ordinal: 6 + row_number: 90 + expected_row_header_column: A + expected_row_header: a3_6_income_support_elderly_ratio_2023 + filters: + validation.metric: income_support_elderly_bsaoa_s + validation.series: ratio + constraints: + - variable: validation.metric + operator: == + value: income_support_elderly_bsaoa_s + label: Validation metric + - variable: validation.series + operator: == + value: ratio + label: Validation series + - value_id: a3_6_old_age_survivor_pension_ratio_2023 + label: A3.6 old-age and survivor pension external ratio 2023 + ordinal: 7 + row_number: 91 + expected_row_header_column: A + expected_row_header: a3_6_old_age_survivor_pension_ratio_2023 + filters: + validation.metric: old_age_survivor_pension_il_ext_poapsu + validation.series: ratio + constraints: + - variable: validation.metric + operator: == + value: old_age_survivor_pension_il_ext_poapsu + label: Validation metric + - variable: validation.series + operator: == + value: ratio + label: Validation series measures: - measure_id: value label: Validation table value @@ -1160,3 +1322,1003 @@ record_sets: aggregation: sum value_scale: 1 expected_cell_type: number +- record_set_id: jrc.euromod_be.cy2021.macrovalidation.euromod_recipient_counts + provenance_class: model_output + record_set_spec_id: jrc.euromod_be.macrovalidation.euromod_recipient_counts.cy2021.v1 + source_record_id_prefix: jrc.euromod_be.cy2021.macrovalidation.euromod_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_euromod_2021 + label: A3.5 income support EUROMOD recipients 2021 + ordinal: 0 + row_number: 43 + expected_row_header_column: A + expected_row_header: a3_5_income_support_euromod_2021 + filters: + validation.metric: income_support_bsa_s + validation.series: euromod + constraints: + - variable: validation.metric + operator: == + value: income_support_bsa_s + label: Validation metric + - variable: validation.series + operator: == + value: euromod + label: Validation series + - value_id: a3_5_unemployment_benefits_euromod_2021 + label: A3.5 unemployment benefits EUROMOD recipients 2021 + ordinal: 1 + row_number: 44 + expected_row_header_column: A + expected_row_header: a3_5_unemployment_benefits_euromod_2021 + filters: + validation.metric: unemployment_benefits_bun + validation.series: euromod + constraints: + - variable: validation.metric + operator: == + value: unemployment_benefits_bun + label: Validation metric + - variable: validation.series + operator: == + value: euromod + label: Validation series + measures: + - measure_id: value + label: EUROMOD recipient count + ordinal: 0 + column: G + source_column_id: value + expected_column_header_row: 1 + expected_column_header: value + concept: euromod_be.macrovalidation_recipient_count + source_concept: jrc.euromod_be.validation_table_value + 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 EUROMOD recipient counts in thousands. These are model outputs and validation-only. + unit: count + aggregation: sum + value_scale: 1000 + expected_cell_type: number +- record_set_id: jrc.euromod_be.cy2022.macrovalidation.euromod_recipient_counts + provenance_class: model_output + record_set_spec_id: jrc.euromod_be.macrovalidation.euromod_recipient_counts.cy2022.v1 + source_record_id_prefix: jrc.euromod_be.cy2022.macrovalidation.euromod_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_euromod_2022 + label: A3.1 self-employment income EUROMOD recipients 2022 + ordinal: 0 + row_number: 45 + expected_row_header_column: A + expected_row_header: a3_1_self_employment_income_euromod_2022 + filters: + validation.metric: self_employment_income_yse + validation.series: euromod + constraints: + - variable: validation.metric + operator: == + value: self_employment_income_yse + label: Validation metric + - variable: validation.series + operator: == + value: euromod + label: Validation series + - value_id: a3_5_income_support_euromod_2022 + label: A3.5 income support EUROMOD recipients 2022 + ordinal: 1 + row_number: 46 + expected_row_header_column: A + expected_row_header: a3_5_income_support_euromod_2022 + filters: + validation.metric: income_support_bsa_s + validation.series: euromod + constraints: + - variable: validation.metric + operator: == + value: income_support_bsa_s + label: Validation metric + - variable: validation.series + operator: == + value: euromod + label: Validation series + - value_id: a3_5_unemployment_benefits_euromod_2022 + label: A3.5 unemployment benefits EUROMOD recipients 2022 + ordinal: 2 + row_number: 47 + expected_row_header_column: A + expected_row_header: a3_5_unemployment_benefits_euromod_2022 + filters: + validation.metric: unemployment_benefits_bun + validation.series: euromod + constraints: + - variable: validation.metric + operator: == + value: unemployment_benefits_bun + label: Validation metric + - variable: validation.series + operator: == + value: euromod + label: Validation series + - value_id: a3_5_old_age_pension_euromod_2022 + label: A3.5 old-age pension EUROMOD recipients 2022 + ordinal: 3 + row_number: 48 + expected_row_header_column: A + expected_row_header: a3_5_old_age_pension_euromod_2022 + filters: + validation.metric: old_age_pension_poa + validation.series: euromod + constraints: + - variable: validation.metric + operator: == + value: old_age_pension_poa + label: Validation metric + - variable: validation.series + operator: == + value: euromod + label: Validation series + - value_id: a3_5_survivor_pension_euromod_2022 + label: A3.5 survivor pension EUROMOD recipients 2022 + ordinal: 4 + row_number: 49 + expected_row_header_column: A + expected_row_header: a3_5_survivor_pension_euromod_2022 + filters: + validation.metric: survivor_pension_psu + validation.series: euromod + constraints: + - variable: validation.metric + operator: == + value: survivor_pension_psu + label: Validation metric + - variable: validation.series + operator: == + value: euromod + label: Validation series + measures: + - measure_id: value + label: EUROMOD recipient count + ordinal: 0 + column: G + source_column_id: value + expected_column_header_row: 1 + expected_column_header: value + concept: euromod_be.macrovalidation_recipient_count + source_concept: jrc.euromod_be.validation_table_value + 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.1 and A3.5, report pages 112 and 120 (PDF pages 114 and 122), publish EUROMOD recipient counts in thousands. These are model outputs and validation-only. + unit: count + aggregation: sum + value_scale: 1000 + expected_cell_type: number +- record_set_id: jrc.euromod_be.cy2021.macrovalidation.recipient_count_ratios + provenance_class: model_output + record_set_spec_id: jrc.euromod_be.macrovalidation.recipient_count_ratios.cy2021.v1 + source_record_id_prefix: jrc.euromod_be.cy2021.macrovalidation.recipient_count_ratios + 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_ratio_2021 + label: A3.5 income support External ratio 2021 + ordinal: 0 + row_number: 69 + expected_row_header_column: A + expected_row_header: a3_5_income_support_ratio_2021 + filters: + validation.metric: income_support_bsa_s + validation.series: ratio + constraints: + - variable: validation.metric + operator: == + value: income_support_bsa_s + label: Validation metric + - variable: validation.series + operator: == + value: ratio + label: Validation series + - value_id: a3_5_unemployment_benefits_ratio_2021 + label: A3.5 unemployment benefits External ratio 2021 + ordinal: 1 + row_number: 70 + expected_row_header_column: A + expected_row_header: a3_5_unemployment_benefits_ratio_2021 + filters: + validation.metric: unemployment_benefits_bun + validation.series: ratio + constraints: + - variable: validation.metric + operator: == + value: unemployment_benefits_bun + label: Validation metric + - variable: validation.series + operator: == + value: ratio + label: Validation series + measures: + - measure_id: value + label: EUROMOD to External recipient-count ratio + ordinal: 0 + column: G + source_column_id: value + expected_column_header_row: 1 + expected_column_header: value + concept: euromod_be.macrovalidation_recipient_count_ratio + source_concept: jrc.euromod_be.validation_table_value + 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), prints the EUROMOD-to-External recipient-count ratios. These are model outputs and validation-only. + unit: ratio + aggregation: sum + value_scale: 1 + expected_cell_type: number +- record_set_id: jrc.euromod_be.cy2022.macrovalidation.recipient_count_ratios + provenance_class: model_output + record_set_spec_id: jrc.euromod_be.macrovalidation.recipient_count_ratios.cy2022.v1 + source_record_id_prefix: jrc.euromod_be.cy2022.macrovalidation.recipient_count_ratios + 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_ratio_2022 + label: A3.1 self-employment income External ratio 2022 + ordinal: 0 + row_number: 77 + expected_row_header_column: A + expected_row_header: a3_1_self_employment_income_ratio_2022 + filters: + validation.metric: self_employment_income_yse + validation.series: ratio + constraints: + - variable: validation.metric + operator: == + value: self_employment_income_yse + label: Validation metric + - variable: validation.series + operator: == + value: ratio + label: Validation series + - value_id: a3_5_income_support_ratio_2022 + label: A3.5 income support External ratio 2022 + ordinal: 1 + row_number: 78 + expected_row_header_column: A + expected_row_header: a3_5_income_support_ratio_2022 + filters: + validation.metric: income_support_bsa_s + validation.series: ratio + constraints: + - variable: validation.metric + operator: == + value: income_support_bsa_s + label: Validation metric + - variable: validation.series + operator: == + value: ratio + label: Validation series + - value_id: a3_5_unemployment_benefits_ratio_2022 + label: A3.5 unemployment benefits External ratio 2022 + ordinal: 2 + row_number: 79 + expected_row_header_column: A + expected_row_header: a3_5_unemployment_benefits_ratio_2022 + filters: + validation.metric: unemployment_benefits_bun + validation.series: ratio + constraints: + - variable: validation.metric + operator: == + value: unemployment_benefits_bun + label: Validation metric + - variable: validation.series + operator: == + value: ratio + label: Validation series + - value_id: a3_5_old_age_pension_ratio_2022 + label: A3.5 old-age pension SILC ratio 2022 + ordinal: 3 + row_number: 80 + expected_row_header_column: A + expected_row_header: a3_5_old_age_pension_ratio_2022 + filters: + validation.metric: old_age_pension_poa + validation.series: ratio + constraints: + - variable: validation.metric + operator: == + value: old_age_pension_poa + label: Validation metric + - variable: validation.series + operator: == + value: ratio + label: Validation series + - value_id: a3_5_survivor_pension_ratio_2022 + label: A3.5 survivor pension SILC ratio 2022 + ordinal: 4 + row_number: 81 + expected_row_header_column: A + expected_row_header: a3_5_survivor_pension_ratio_2022 + filters: + validation.metric: survivor_pension_psu + validation.series: ratio + constraints: + - variable: validation.metric + operator: == + value: survivor_pension_psu + label: Validation metric + - variable: validation.series + operator: == + value: ratio + label: Validation series + measures: + - measure_id: value + label: EUROMOD recipient-count comparator ratio + ordinal: 0 + column: G + source_column_id: value + expected_column_header_row: 1 + expected_column_header: value + concept: euromod_be.macrovalidation_recipient_count_ratio + source_concept: jrc.euromod_be.validation_table_value + 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.1 and A3.5, report pages 112 and 120 (PDF pages 114 and 122), print EUROMOD-to-External ratios and, for poa and psu, EUROMOD-to-SILC ratios. These are model outputs and validation-only. + unit: ratio + aggregation: sum + value_scale: 1 + expected_cell_type: number +- record_set_id: jrc.euromod_be.cy2021.macrovalidation.euromod_amounts + provenance_class: model_output + record_set_spec_id: jrc.euromod_be.macrovalidation.euromod_amounts.cy2021.v1 + source_record_id_prefix: jrc.euromod_be.cy2021.macrovalidation.euromod_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_self_employment_income_euromod_2021 + label: A3.2 self-employment income EUROMOD amount 2021 + ordinal: 0 + row_number: 50 + expected_row_header_column: A + expected_row_header: a3_2_self_employment_income_euromod_2021 + filters: + validation.metric: self_employment_income_yse + validation.series: euromod + constraints: + - variable: validation.metric + operator: == + value: self_employment_income_yse + label: Validation metric + - variable: validation.series + operator: == + value: euromod + label: Validation series + - value_id: a3_2_employment_income_euromod_2021 + label: A3.2 employment income EUROMOD amount 2021 + ordinal: 1 + row_number: 51 + expected_row_header_column: A + expected_row_header: a3_2_employment_income_euromod_2021 + filters: + validation.metric: employment_income_yem + validation.series: euromod + constraints: + - variable: validation.metric + operator: == + value: employment_income_yem + label: Validation metric + - variable: validation.series + operator: == + value: euromod + label: Validation series + - value_id: a3_4_capital_income_tax_euromod_2021 + label: A3.4 capital income tax EUROMOD amount 2021 + ordinal: 2 + row_number: 52 + expected_row_header_column: A + expected_row_header: a3_4_capital_income_tax_euromod_2021 + filters: + validation.metric: capital_income_tax_tinkt_s + validation.series: euromod + constraints: + - variable: validation.metric + operator: == + value: capital_income_tax_tinkt_s + label: Validation metric + - variable: validation.series + operator: == + value: euromod + label: Validation series + - value_id: a3_6_income_support_euromod_2021 + label: A3.6 income support EUROMOD amount 2021 + ordinal: 3 + row_number: 53 + expected_row_header_column: A + expected_row_header: a3_6_income_support_euromod_2021 + filters: + validation.metric: income_support_bsa_s + validation.series: euromod + constraints: + - variable: validation.metric + operator: == + value: income_support_bsa_s + label: Validation metric + - variable: validation.series + operator: == + value: euromod + label: Validation series + - value_id: a3_6_income_support_elderly_euromod_2021 + label: A3.6 elderly income support EUROMOD amount 2021 + ordinal: 4 + row_number: 54 + expected_row_header_column: A + expected_row_header: a3_6_income_support_elderly_euromod_2021 + filters: + validation.metric: income_support_elderly_bsaoa_s + validation.series: euromod + constraints: + - variable: validation.metric + operator: == + value: income_support_elderly_bsaoa_s + label: Validation metric + - variable: validation.series + operator: == + value: euromod + label: Validation series + - value_id: a3_6_child_benefits_euromod_2021 + label: A3.6 child benefits EUROMOD amount 2021 + ordinal: 5 + row_number: 55 + expected_row_header_column: A + expected_row_header: a3_6_child_benefits_euromod_2021 + filters: + validation.metric: child_benefits_bch_s + validation.series: euromod + constraints: + - variable: validation.metric + operator: == + value: child_benefits_bch_s + label: Validation metric + - variable: validation.series + operator: == + value: euromod + label: Validation series + - value_id: a3_6_unemployment_benefits_euromod_2021 + label: A3.6 unemployment benefits EUROMOD amount 2021 + ordinal: 6 + row_number: 56 + expected_row_header_column: A + expected_row_header: a3_6_unemployment_benefits_euromod_2021 + filters: + validation.metric: unemployment_benefits_bun + validation.series: euromod + constraints: + - variable: validation.metric + operator: == + value: unemployment_benefits_bun + label: Validation metric + - variable: validation.series + operator: == + value: euromod + label: Validation series + measures: + - measure_id: value + label: EUROMOD annual amount + ordinal: 0 + column: G + source_column_id: value + expected_column_header_row: 1 + expected_column_header: value + concept: euromod_be.macrovalidation_amount + source_concept: jrc.euromod_be.validation_table_value + 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, report pages 114, 118, and 125 (PDF pages 116, 120, and 127), publish EUROMOD annual amounts in EUR millions. These are model outputs and validation-only. + unit: eur + aggregation: sum + value_scale: 1000000 + expected_cell_type: number +- record_set_id: jrc.euromod_be.cy2022.macrovalidation.euromod_amounts + provenance_class: model_output + record_set_spec_id: jrc.euromod_be.macrovalidation.euromod_amounts.cy2022.v1 + source_record_id_prefix: jrc.euromod_be.cy2022.macrovalidation.euromod_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_self_employment_income_euromod_2022 + label: A3.2 self-employment income EUROMOD amount 2022 + ordinal: 0 + row_number: 57 + expected_row_header_column: A + expected_row_header: a3_2_self_employment_income_euromod_2022 + filters: + validation.metric: self_employment_income_yse + validation.series: euromod + constraints: + - variable: validation.metric + operator: == + value: self_employment_income_yse + label: Validation metric + - variable: validation.series + operator: == + value: euromod + label: Validation series + - value_id: a3_2_employment_income_euromod_2022 + label: A3.2 employment income EUROMOD amount 2022 + ordinal: 1 + row_number: 58 + expected_row_header_column: A + expected_row_header: a3_2_employment_income_euromod_2022 + filters: + validation.metric: employment_income_yem + validation.series: euromod + constraints: + - variable: validation.metric + operator: == + value: employment_income_yem + label: Validation metric + - variable: validation.series + operator: == + value: euromod + label: Validation series + - value_id: a3_4_capital_income_tax_euromod_2022 + label: A3.4 capital income tax EUROMOD amount 2022 + ordinal: 2 + row_number: 59 + expected_row_header_column: A + expected_row_header: a3_4_capital_income_tax_euromod_2022 + filters: + validation.metric: capital_income_tax_tinkt_s + validation.series: euromod + constraints: + - variable: validation.metric + operator: == + value: capital_income_tax_tinkt_s + label: Validation metric + - variable: validation.series + operator: == + value: euromod + label: Validation series + - value_id: a3_6_income_support_euromod_2022 + label: A3.6 income support EUROMOD amount 2022 + ordinal: 3 + row_number: 60 + expected_row_header_column: A + expected_row_header: a3_6_income_support_euromod_2022 + filters: + validation.metric: income_support_bsa_s + validation.series: euromod + constraints: + - variable: validation.metric + operator: == + value: income_support_bsa_s + label: Validation metric + - variable: validation.series + operator: == + value: euromod + label: Validation series + - value_id: a3_6_income_support_elderly_euromod_2022 + label: A3.6 elderly income support EUROMOD amount 2022 + ordinal: 4 + row_number: 61 + expected_row_header_column: A + expected_row_header: a3_6_income_support_elderly_euromod_2022 + filters: + validation.metric: income_support_elderly_bsaoa_s + validation.series: euromod + constraints: + - variable: validation.metric + operator: == + value: income_support_elderly_bsaoa_s + label: Validation metric + - variable: validation.series + operator: == + value: euromod + label: Validation series + - value_id: a3_6_child_benefits_euromod_2022 + label: A3.6 child benefits EUROMOD amount 2022 + ordinal: 5 + row_number: 62 + expected_row_header_column: A + expected_row_header: a3_6_child_benefits_euromod_2022 + filters: + validation.metric: child_benefits_bch_s + validation.series: euromod + constraints: + - variable: validation.metric + operator: == + value: child_benefits_bch_s + label: Validation metric + - variable: validation.series + operator: == + value: euromod + label: Validation series + - value_id: a3_6_unemployment_benefits_euromod_2022 + label: A3.6 unemployment benefits EUROMOD amount 2022 + ordinal: 6 + row_number: 63 + expected_row_header_column: A + expected_row_header: a3_6_unemployment_benefits_euromod_2022 + filters: + validation.metric: unemployment_benefits_bun + validation.series: euromod + constraints: + - variable: validation.metric + operator: == + value: unemployment_benefits_bun + label: Validation metric + - variable: validation.series + operator: == + value: euromod + label: Validation series + measures: + - measure_id: value + label: EUROMOD annual amount + ordinal: 0 + column: G + source_column_id: value + expected_column_header_row: 1 + expected_column_header: value + concept: euromod_be.macrovalidation_amount + source_concept: jrc.euromod_be.validation_table_value + 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, report pages 114, 118, and 125 (PDF pages 116, 120, and 127), publish EUROMOD annual amounts in EUR millions. These are model outputs and validation-only. + unit: eur + aggregation: sum + value_scale: 1000000 + expected_cell_type: number +- record_set_id: jrc.euromod_be.cy2021.macrovalidation.amount_ratios + provenance_class: model_output + record_set_spec_id: jrc.euromod_be.macrovalidation.amount_ratios.cy2021.v1 + source_record_id_prefix: jrc.euromod_be.cy2021.macrovalidation.amount_ratios + 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_ratio_2021 + label: A3.2 employment income External ratio 2021 + ordinal: 0 + row_number: 71 + expected_row_header_column: A + expected_row_header: a3_2_employment_income_ratio_2021 + filters: + validation.metric: employment_income_yem + validation.series: ratio + constraints: + - variable: validation.metric + operator: == + value: employment_income_yem + label: Validation metric + - variable: validation.series + operator: == + value: ratio + label: Validation series + - value_id: a3_4_capital_income_tax_ratio_2021 + label: A3.4 capital income tax External ratio 2021 + ordinal: 1 + row_number: 72 + expected_row_header_column: A + expected_row_header: a3_4_capital_income_tax_ratio_2021 + filters: + validation.metric: capital_income_tax_tinkt_s + validation.series: ratio + constraints: + - variable: validation.metric + operator: == + value: capital_income_tax_tinkt_s + label: Validation metric + - variable: validation.series + operator: == + value: ratio + label: Validation series + - value_id: a3_6_income_support_ratio_2021 + label: A3.6 income support External ratio 2021 + ordinal: 2 + row_number: 73 + expected_row_header_column: A + expected_row_header: a3_6_income_support_ratio_2021 + filters: + validation.metric: income_support_bsa_s + validation.series: ratio + constraints: + - variable: validation.metric + operator: == + value: income_support_bsa_s + label: Validation metric + - variable: validation.series + operator: == + value: ratio + label: Validation series + - value_id: a3_6_income_support_elderly_ratio_2021 + label: A3.6 elderly income support External ratio 2021 + ordinal: 3 + row_number: 74 + expected_row_header_column: A + expected_row_header: a3_6_income_support_elderly_ratio_2021 + filters: + validation.metric: income_support_elderly_bsaoa_s + validation.series: ratio + constraints: + - variable: validation.metric + operator: == + value: income_support_elderly_bsaoa_s + label: Validation metric + - variable: validation.series + operator: == + value: ratio + label: Validation series + - value_id: a3_6_child_benefits_ratio_2021 + label: A3.6 child benefits External ratio 2021 + ordinal: 4 + row_number: 75 + expected_row_header_column: A + expected_row_header: a3_6_child_benefits_ratio_2021 + filters: + validation.metric: child_benefits_bch_s + validation.series: ratio + constraints: + - variable: validation.metric + operator: == + value: child_benefits_bch_s + label: Validation metric + - variable: validation.series + operator: == + value: ratio + label: Validation series + - value_id: a3_6_unemployment_benefits_ratio_2021 + label: A3.6 unemployment benefits External ratio 2021 + ordinal: 5 + row_number: 76 + expected_row_header_column: A + expected_row_header: a3_6_unemployment_benefits_ratio_2021 + filters: + validation.metric: unemployment_benefits_bun + validation.series: ratio + constraints: + - variable: validation.metric + operator: == + value: unemployment_benefits_bun + label: Validation metric + - variable: validation.series + operator: == + value: ratio + label: Validation series + measures: + - measure_id: value + label: EUROMOD to External annual-amount ratio + ordinal: 0 + column: G + source_column_id: value + expected_column_header_row: 1 + expected_column_header: value + concept: euromod_be.macrovalidation_ratio + source_concept: jrc.euromod_be.validation_table_value + 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, report pages 114, 118, and 125 (PDF pages 116, 120, and 127), print EUROMOD-to-External annual-amount ratios. These are model outputs and validation-only. + unit: ratio + aggregation: sum + value_scale: 1 + expected_cell_type: number +- record_set_id: jrc.euromod_be.cy2022.macrovalidation.amount_ratios + provenance_class: model_output + record_set_spec_id: jrc.euromod_be.macrovalidation.amount_ratios.cy2022.v1 + source_record_id_prefix: jrc.euromod_be.cy2022.macrovalidation.amount_ratios + 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_ratio_2022 + label: A3.2 employment income External ratio 2022 + ordinal: 0 + row_number: 82 + expected_row_header_column: A + expected_row_header: a3_2_employment_income_ratio_2022 + filters: + validation.metric: employment_income_yem + validation.series: ratio + constraints: + - variable: validation.metric + operator: == + value: employment_income_yem + label: Validation metric + - variable: validation.series + operator: == + value: ratio + label: Validation series + - value_id: a3_4_capital_income_tax_ratio_2022 + label: A3.4 capital income tax External ratio 2022 + ordinal: 1 + row_number: 83 + expected_row_header_column: A + expected_row_header: a3_4_capital_income_tax_ratio_2022 + filters: + validation.metric: capital_income_tax_tinkt_s + validation.series: ratio + constraints: + - variable: validation.metric + operator: == + value: capital_income_tax_tinkt_s + label: Validation metric + - variable: validation.series + operator: == + value: ratio + label: Validation series + - value_id: a3_6_income_support_ratio_2022 + label: A3.6 income support External ratio 2022 + ordinal: 2 + row_number: 84 + expected_row_header_column: A + expected_row_header: a3_6_income_support_ratio_2022 + filters: + validation.metric: income_support_bsa_s + validation.series: ratio + constraints: + - variable: validation.metric + operator: == + value: income_support_bsa_s + label: Validation metric + - variable: validation.series + operator: == + value: ratio + label: Validation series + - value_id: a3_6_income_support_elderly_ratio_2022 + label: A3.6 elderly income support External ratio 2022 + ordinal: 3 + row_number: 85 + expected_row_header_column: A + expected_row_header: a3_6_income_support_elderly_ratio_2022 + filters: + validation.metric: income_support_elderly_bsaoa_s + validation.series: ratio + constraints: + - variable: validation.metric + operator: == + value: income_support_elderly_bsaoa_s + label: Validation metric + - variable: validation.series + operator: == + value: ratio + label: Validation series + - value_id: a3_6_child_benefits_ratio_2022 + label: A3.6 child benefits External ratio 2022 + ordinal: 4 + row_number: 86 + expected_row_header_column: A + expected_row_header: a3_6_child_benefits_ratio_2022 + filters: + validation.metric: child_benefits_bch_s + validation.series: ratio + constraints: + - variable: validation.metric + operator: == + value: child_benefits_bch_s + label: Validation metric + - variable: validation.series + operator: == + value: ratio + label: Validation series + - value_id: a3_6_unemployment_benefits_ratio_2022 + label: A3.6 unemployment benefits External ratio 2022 + ordinal: 5 + row_number: 87 + expected_row_header_column: A + expected_row_header: a3_6_unemployment_benefits_ratio_2022 + filters: + validation.metric: unemployment_benefits_bun + validation.series: ratio + constraints: + - variable: validation.metric + operator: == + value: unemployment_benefits_bun + label: Validation metric + - variable: validation.series + operator: == + value: ratio + label: Validation series + measures: + - measure_id: value + label: EUROMOD to External annual-amount ratio + ordinal: 0 + column: G + source_column_id: value + expected_column_header_row: 1 + expected_column_header: value + concept: euromod_be.macrovalidation_ratio + source_concept: jrc.euromod_be.validation_table_value + 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, report pages 114, 118, and 125 (PDF pages 116, 120, and 127), print EUROMOD-to-External annual-amount ratios. These are model outputs and validation-only. + unit: ratio + aggregation: sum + value_scale: 1 + expected_cell_type: number diff --git a/tests/test_belgium_targets.py b/tests/test_belgium_targets.py index ebac2a0..23a9384 100644 --- a/tests/test_belgium_targets.py +++ b/tests/test_belgium_targets.py @@ -3,6 +3,7 @@ from __future__ import annotations import csv +import hashlib from functools import lru_cache from pathlib import Path @@ -63,6 +64,14 @@ ), ) EUROMOD_BE_COMPARATOR_ALIAS = "jrc-euromod-be-baseline-statistics-2025" +EUROMOD_BE_COMPARATOR_PATH = ( + REPO_ROOT + / "db" + / "data" + / "jrc" + / "euromod_be_baseline_statistics_2025" + / "jrc_euromod_be_baseline_statistics_2025.csv" +) @lru_cache @@ -195,18 +204,11 @@ def test_belgium_nis_2025_crosswalk_round_trips_merged_communes(): def test_belgium_euromod_comparator_has_source_urls_per_row(): - comparator_rows = _csv_rows( - REPO_ROOT - / "db" - / "data" - / "jrc" - / "euromod_be_baseline_statistics_2025" - / "jrc_euromod_be_baseline_statistics_2025.csv" - ) + comparator_rows = _csv_rows(EUROMOD_BE_COMPARATOR_PATH) facts = _facts(EUROMOD_BE_COMPARATOR_ALIAS, 2025) - assert len(comparator_rows) == 41 - assert len(facts) == 41 + assert len(comparator_rows) == 90 + assert len(facts) == 90 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" } @@ -219,8 +221,15 @@ def test_belgium_euromod_comparator_has_source_urls_per_row(): "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 == "model_output" for fact in facts) == 63 assert sum(fact.provenance_class == "survey_aggregate" for fact in facts) == 2 + assert sum(row["validation.series"] == "euromod" for row in comparator_rows) == 32 + assert sum(row["validation.series"] == "ratio" for row in comparator_rows) == 29 + assert { + fact.provenance_class + for fact in facts + if fact.filters["validation.series"] in {"euromod", "ratio"} + } == {"model_output"} survey_facts = [ fact for fact in facts if fact.provenance_class == "survey_aggregate" ] @@ -228,6 +237,64 @@ def test_belgium_euromod_comparator_has_source_urls_per_row(): assert validate_facts(facts).valid +def test_belgium_euromod_comparator_preserves_original_rows_byte_for_byte(): + original_prefix = b"".join( + EUROMOD_BE_COMPARATOR_PATH.read_bytes().splitlines(keepends=True)[:42] + ) + + # Header plus the original 41 rows is exactly the C2 artifact. + assert hashlib.sha256(original_prefix).hexdigest() == ( + "2ef69251a72caaab042706c77143fa4f86dde2f800747ebb421b5f7b9a45e394" + ) + + +def test_belgium_euromod_comparator_pairs_c2_rows_with_model_outputs(): + comparator_rows = _csv_rows(EUROMOD_BE_COMPARATOR_PATH) + ids = {row["value_id"] for row in comparator_rows} + c2_rows = comparator_rows[18:41] + + assert len(c2_rows) == 23 + assert {row["validation.series"] for row in c2_rows} == {"external", "silc"} + + # The cached report has no blank same-period EUROMOD cells for these rows. + documented_euromod_blanks: set[str] = set() + missing_euromod = { + row["value_id"] + for row in c2_rows + if row["value_id"] + .replace("_external_", "_euromod_") + .replace("_silc_", "_euromod_") + not in ids + } + assert missing_euromod == documented_euromod_blanks + + missing_ratios = { + row["value_id"] + for row in c2_rows + if row["value_id"] + .replace("_external_", "_ratio_") + .replace("_silc_", "_ratio_") + not in ids + } + assert not missing_ratios + + # A3.2 prints these EUROMOD yse amounts but no External values or ratios. + yse_amounts = { + int(row["period"]): int(row["value"]) + for row in comparator_rows + if row["table_id"] == "A3.2" + and row["validation.metric"] == "self_employment_income_yse" + and row["validation.series"] == "euromod" + } + assert yse_amounts == {2021: 20_965, 2022: 21_981, 2023: 23_764} + assert not any( + row["table_id"] == "A3.2" + and row["validation.metric"] == "self_employment_income_yse" + and row["validation.series"] == "ratio" + for row in comparator_rows + ) + + SFPD_PENSION_ALIAS = "sfpd-legal-pension-caseload-2025" GROEIPAKKET_ALIAS = "opgroeien-groeipakket-caseload-2025" BFP_OUTLOOK_ALIAS = "bfp-economic-outlook-2026-06" diff --git a/tests/test_chronicle_bundle.py b/tests/test_chronicle_bundle.py index 9c39078..3a1470d 100644 --- a/tests/test_chronicle_bundle.py +++ b/tests/test_chronicle_bundle.py @@ -73,7 +73,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): "aggregate_duplicate_key_count": 0, "entity_count": 11, "error_count": 0, - "fact_count": 156148, + "fact_count": 156197, "geography_count": 12536, "period_count": 191, "semantic_duplicate_key_count": 117, @@ -82,7 +82,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): "source_package_count": 144, "warning_count": 1, } - assert len(rows) == 156148 + assert len(rows) == 156197 assert {row["provenance_class"] for row in rows} <= { "administrative", "census", @@ -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"] == 156148 + assert coverage["fact_count"] == 156197 assert coverage["counts"]["by_source"] == { "bea": 445, "bfp_economic_outlook": 5, @@ -136,7 +136,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): "ici": 12, "irs_soi": 40063, "isc": 2, - "jrc_euromod_be": 41, + "jrc_euromod_be": 90, "kff": 52, "mhclg": 2712, "nbb_national_accounts": 1, @@ -391,7 +391,7 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): table_counts[ "jrc_euromod_be:EUROMOD Country Report Belgium 2025 validation tables" ] - == 41 + == 90 ) assert ( table_counts[ @@ -477,9 +477,9 @@ 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": 4000, - "calendar_year:2022": 1950, - "calendar_year:2023": 6232, + "calendar_year:2021": 4017, + "calendar_year:2022": 1973, + "calendar_year:2023": 6241, "calendar_year:2024": 33825, "calendar_year:2025": 4446, "calendar_year:2026": 241, @@ -622,7 +622,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"] == 168 + assert coverage["counts"]["by_geography"]["country:BE"] == 217 assert coverage["counts"]["by_geography"]["country:DE"] == 36 assert coverage["counts"]["by_geography"]["country:FR"] == 36 assert coverage["counts"]["by_geography"]["nuts1:BE1"] == 6 @@ -642,11 +642,11 @@ def test_build_bundle_writes_merged_consumer_contract(tmp_path): "dwelling": 12733, "family": 107, "firm": 1439, - "government": 626, + "government": 661, "household": 40513, "institutional_sector": 103, "pension_plan": 2, - "person": 60296, + "person": 60310, "social_protection_scheme": 27, "tax_unit": 40069, }