Skip to content

Commit 36293f8

Browse files
committed
Add CBO income tax receipts source package
1 parent c97b5c7 commit 36293f8

5 files changed

Lines changed: 150 additions & 0 deletions

File tree

arch/source_package.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@
7878
"cbo-revenue-projections-income-by-source-2026-02": Path(
7979
"cbo/revenue_projections_income_by_source_2026_02"
8080
),
81+
"cbo-individual-income-tax-receipts-2026-02": Path(
82+
"cbo/individual_income_tax_receipts_2026_02"
83+
),
8184
"census-acs-s0101-congressional-district-age-2024": Path(
8285
"census/acs_s0101_district_2024"
8386
),
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
source_concept_id,label,definition_note,year_2021,year_2022,year_2023,year_2024
2+
individual_income_taxes,Individual income taxes,Federal individual income tax receipts in CBO budget data; dollars,2044000000000,2632146000000,2176481000000,2426067000000
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
source_id: cbo
2+
package_id: cbo-individual-income-tax-receipts-2026-02
3+
dataset: cbo_individual_income_tax_receipts_2026_02
4+
source_page: https://www.cbo.gov/data/budget-economic-data
5+
table: CBO budget and economic data, individual income tax receipts
6+
notes: >-
7+
Curated Arch extract of CBO federal individual income tax receipts from the
8+
February 2026 Historical Budget Data workbook. Values mirror the CBO receipts
9+
series used by PolicyEngine-US calibration parameters and are stored as a
10+
source-backed Ledger package for Populace fiscal targeting.
11+
files:
12+
2026:
13+
filename: cbo_individual_income_tax_receipts_2026_02.csv
14+
source_url: https://www.cbo.gov/system/files/2026-02/51134-2026-02-Historical-Budget-Data.xlsx
15+
source_table: CBO budget and economic data, individual income tax receipts
16+
sha256: 9cd016b7b3ed0c9602b8ad9f75f859c13e2636fb7c2e16a678b388b0fd17aeea
17+
size_bytes: 251
18+
storage:
19+
r2:
20+
provider: r2
21+
bucket: arch-raw
22+
key: raw/cbo/cbo-individual-income-tax-receipts-2026-02/2026/9cd016b7b3ed0c9602b8ad9f75f859c13e2636fb7c2e16a678b388b0fd17aeea/cbo_individual_income_tax_receipts_2026_02.csv
23+
uri: r2://arch-raw/raw/cbo/cbo-individual-income-tax-receipts-2026-02/2026/9cd016b7b3ed0c9602b8ad9f75f859c13e2636fb7c2e16a678b388b0fd17aeea/cbo_individual_income_tax_receipts_2026_02.csv
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
schema_version: arch.source_package.v1
2+
package_id: cbo-individual-income-tax-receipts-2026-02
3+
label: CBO federal individual income tax receipts
4+
artifact:
5+
source_name: cbo
6+
source_table: CBO budget and economic data, individual income tax receipts
7+
resource_package: db
8+
resource_directory: data/cbo/individual_income_tax_receipts_2026_02
9+
manifest: manifest.yaml
10+
vintage: cbo_2026_02_budget_projections
11+
extracted_at: "2026-06-16"
12+
extraction_method: >-
13+
curated CSV extract from CBO February 2026 Historical Budget Data workbook.
14+
Values mirror CBO individual income tax receipts used in PolicyEngine-US
15+
calibration parameters and are stored here as source-backed Ledger facts
16+
for Populace fiscal targeting.
17+
parser: delimited_text_full_rows
18+
sheet_name: income_tax_receipts
19+
artifact_year: 2026
20+
selected_rows:
21+
- source_concept_id: individual_income_taxes
22+
record_sets:
23+
- record_set_id: cbo.fy{year}.revenues
24+
record_set_spec_id: cbo.individual_income_tax_receipts.v1
25+
source_record_id_prefix: cbo.fy{year}.revenues
26+
sheet_name: income_tax_receipts
27+
period_type: fiscal_year
28+
period: "{year}"
29+
geography_id: 0100000US
30+
geography_level: country
31+
geography_name: United States
32+
geography_vintage: current
33+
entity: government
34+
entity_role: federal_government
35+
domain: federal_receipts
36+
groupby_dimension: cbo.revenue_source
37+
rows:
38+
- value_id: individual_income_taxes
39+
label: Individual income taxes
40+
ordinal: 0
41+
row_number: 2
42+
table_record_kind: total
43+
expected_row_header_column: A
44+
expected_row_header: individual_income_taxes
45+
guard_cells:
46+
- column: B
47+
expected_value: Individual income taxes
48+
label: CBO row label
49+
measures:
50+
- measure_id: actual_amount
51+
label: CBO individual income tax receipts
52+
ordinal: 0
53+
column_by_year:
54+
2021: D
55+
2022: E
56+
2023: F
57+
2024: G
58+
source_column_id: year_{year}
59+
expected_column_header_row: 1
60+
expected_column_header: year_{year}
61+
concept: cbo.individual_income_tax_receipts
62+
source_concept: cbo.individual_income_tax_receipts
63+
concept_relation: exact
64+
concept_authority: cbo
65+
concept_evidence_url: https://www.cbo.gov/system/files/2026-02/51134-2026-02-Historical-Budget-Data.xlsx
66+
concept_evidence_notes: >-
67+
CBO reports federal individual income tax receipts in budget and
68+
economic data historical and projection tables. Populace maps this
69+
fiscal-year receipts aggregate to its federal income_tax macro
70+
calibration control; IRS SOI liability totals are distributional
71+
controls and do not replace this row.
72+
unit: usd
73+
aggregation: sum
74+
expected_cell_type: number

tests/test_arch_source_package.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -489,6 +489,54 @@ def test_cbo_income_by_source_package_preserves_cbo_projection_concepts():
489489
)
490490

491491

492+
def test_cbo_individual_income_tax_receipts_package_builds_fy2024_fact():
493+
package = load_source_package("cbo-individual-income-tax-receipts-2026-02")
494+
cells = package.build_source_cells(2024)
495+
records = package.build_source_records(2024, cells=cells)
496+
facts = package.build_facts(2024, cells=cells)
497+
consumer_rows = consumer_fact_rows(facts)
498+
values_by_record = {fact.source_record_id: fact for fact in facts}
499+
expected_record_id = "cbo.fy2024.revenues.individual_income_taxes.actual_amount"
500+
expected_sha = "9cd016b7b3ed0c9602b8ad9f75f859c13e2636fb7c2e16a678b388b0fd17aeea"
501+
expected_url = (
502+
"https://www.cbo.gov/system/files/2026-02/"
503+
"51134-2026-02-Historical-Budget-Data.xlsx"
504+
)
505+
expected_r2_uri = (
506+
"r2://arch-raw/raw/cbo/"
507+
"cbo-individual-income-tax-receipts-2026-02/2026/"
508+
f"{expected_sha}/cbo_individual_income_tax_receipts_2026_02.csv"
509+
)
510+
511+
assert package.package_id == "cbo-individual-income-tax-receipts-2026-02"
512+
assert len(cells) == 14
513+
assert validate_source_cells(cells).valid
514+
assert len(records) == 1
515+
assert len(facts) == 1
516+
assert validate_facts(facts).valid
517+
assert validate_consumer_fact_contract(facts).valid
518+
assert len(consumer_rows) == 1
519+
assert {record.source_record_id for record in records} == {expected_record_id}
520+
assert all(fact.source.source_name == "cbo" for fact in facts)
521+
assert {fact.source.source_sha256 for fact in facts} == {expected_sha}
522+
assert {fact.source.source_size_bytes for fact in facts} == {251}
523+
assert {fact.source.url for fact in facts} == {expected_url}
524+
assert {fact.source.raw_r2_uri for fact in facts} == {expected_r2_uri}
525+
526+
fact = values_by_record[expected_record_id]
527+
assert fact.value == 2_426_067_000_000
528+
assert fact.period.type == "fiscal_year"
529+
assert fact.period.value == 2024
530+
assert fact.geography.id == "0100000US"
531+
assert fact.entity.name == "government"
532+
assert fact.measure.concept == "cbo.individual_income_tax_receipts"
533+
assert fact.measure.source_concept == "cbo.individual_income_tax_receipts"
534+
assert fact.measure.unit == "usd"
535+
assert fact.layout.groupby_value_id == "individual_income_taxes"
536+
assert fact.layout.measure_id == "actual_amount"
537+
assert consumer_rows[0]["lineage"]["source_record_id"] == expected_record_id
538+
539+
492540
def test_validate_source_package_reports_fixture_counts():
493541
report = validate_source_package("soi-table-1-1", year=2023)
494542

0 commit comments

Comments
 (0)