Hospital Capex Signals
Description
A derived slice of Provider Change Events:
every capex_jump event — a hospital whose cost report shows major movable
equipment purchases of at least $1M and at least 2× the prior fiscal
year — joined back to CMS HCRIS Worksheet A-7 Part I for the complete
purchase breakdown by asset class in the trigger year, plus the prior-year
comparison and the year-over-year multiple. One row per (hospital, trigger
fiscal year).
Worksheet A-7 Part I is the hospital's own reconciliation of capital asset balances, filed with CMS: annual purchases in dollars split across land, land improvements, buildings & fixtures, building improvements, fixed equipment, major movable equipment, and HIT-designated assets. The framing is observational: the hospital reported a step-up in equipment purchases on its cost report — who they bought from, and why, is not in the data.
- Source: CMS HCRIS HOSP10 (form 2552-10) Worksheet A-7 Part I, numeric files from downloads.cms.gov; hospital identity from the filed cost report header.
- Refresh cadence: quarterly, on the HCRIS release cycle.
- Row count: 4,277 across 3,138 hospitals (2026-09-08 export). Trigger fiscal years 2019–2025: 7 · 422 · 920 · 833 · 831 · 782 · 482. FY2019 is thin because the loaded A-7 history starts there and a jump needs a prior year.
- Two bases, recorded per row in
prior_year_basis:positive(3,638 rows: prior-year movable line > 0 and this year ≥ 2× it) andno_movable_filed(639 rows: no prior-year movable line — CMS files never contain a zero, so absent means zero or unfiled — while other capital purchases were filed that year: a first equipment purchase after a year without one). Hospital years whose prior A-7 schedule was blank, or whose prior line was negative (a reclassification), are excluded. - Correction 2026-09-08: the rule originally read any missing or negative
prior line as zero and flagged 958 rows against it; those were removed, the
rule split into the two bases above, and the 639
no_movable_filedrows reinstated with that label. - Vintage: 2026-07-22 (A-7 ingest run).
- Jump rule:
movable_equipment_purchases >= 1,000,000 AND ( (prior FY movable > 0 AND movable >= 2 × prior FY movable) OR (prior FY movable absent AND prior FY total_purchases > 0))(thresholds recorded per event in the underlying events table).
Table: hospital_capex_signals
Snowflake: HEALTHPARSE_DATA.HOSPITAL_CAPEX_SIGNALS.HOSPITAL_CAPEX_SIGNALS
| Column | Type | Description | Notes |
|---|---|---|---|
ccn |
VARCHAR | CMS Certification Number of the hospital. | Joins to HCRIS Hospital Financials (beds, revenues, margins) and Facility Quality. |
hospital_name |
VARCHAR | Provider name from the filed cost report. | — |
address / city / state / zip |
VARCHAR | Hospital location from the cost report. | — |
fy_end_year |
INTEGER | The trigger fiscal year (year the reporting FY ends). | — |
event_date |
DATE | The fiscal-year-end date of the trigger year's report (Dec 31 of fy_end_year when the exact FY end wasn't on file). |
— |
prior_year_basis |
VARCHAR | positive or no_movable_filed — see Description. |
Filter to positive for a strict 2× screen. |
land_purchases |
DOUBLE | A-7 Part I line 1, purchases column: land bought in the FY, dollars. | Any A-7 amount can be null (line not filed) or, rarely, negative (filed reclassification/correction) — take coalesce(x, 0) before aggregating. |
land_improvement_purchases |
DOUBLE | Line 2: land improvements. | — |
building_purchases |
DOUBLE | Line 3: buildings & fixtures. | — |
building_improvement_purchases |
DOUBLE | Line 4: building improvements. | — |
fixed_equipment_purchases |
DOUBLE | Line 5: fixed (built-in) equipment. | — |
movable_equipment_purchases |
DOUBLE | Line 6: major movable equipment — the trigger class: imaging, surgical, lab, and other relocatable capital equipment. | ≥ $1M by construction of the slice. |
hit_asset_purchases |
DOUBLE | Line 7: health-IT designated assets. | Sparsely filed; null-heavy. |
total_purchases |
DOUBLE | Line 8 (subtotal of lines 1–7): all capital purchases in the FY. | — |
prior_year_movable_equipment_purchases |
DOUBLE | Line 6 purchases from the same hospital's prior-FY report. | > 0 where prior_year_basis = positive; null where no_movable_filed. |
prior_year_total_purchases |
DOUBLE | Line 8 purchases from the prior FY. | — |
movable_equipment_yoy_multiple |
DOUBLE | movable_equipment_purchases / prior_year_movable_equipment_purchases, rounded to 2 places. |
Null where prior_year_basis = no_movable_filed (no base to divide by). |
total_beginning_balance |
DOUBLE | Line 8, beginning-balance column: total capital assets at FY start. | With total_ending_balance, sizes the jump against the hospital's asset base. |
total_ending_balance |
DOUBLE | Line 8, ending-balance column. | — |
_dataset / _vintage / _exported_at |
VARCHAR | See README. | — |
Example queries (Snowflake)
-- 1. "Hospital just bought equipment": biggest movable-equipment jumps in
-- the most recent trigger year, with the YoY multiple.
SELECT "ccn", "hospital_name", "city", "state",
"movable_equipment_purchases", "prior_year_movable_equipment_purchases",
"movable_equipment_yoy_multiple"
FROM HEALTHPARSE_DATA.HOSPITAL_CAPEX_SIGNALS.HOSPITAL_CAPEX_SIGNALS
WHERE "fy_end_year" = 2025
ORDER BY "movable_equipment_purchases" DESC
LIMIT 25;
-- 2. Territory planning for an imaging/device vendor: California signals,
-- $5M+ movable-equipment years, newest first.
SELECT "event_date", "hospital_name", "city",
"movable_equipment_purchases", "total_purchases"
FROM HEALTHPARSE_DATA.HOSPITAL_CAPEX_SIGNALS.HOSPITAL_CAPEX_SIGNALS
WHERE "state" = 'CA'
AND "movable_equipment_purchases" >= 5000000
ORDER BY "event_date" DESC;
-- 3. Construction-adjacent: hospitals whose building + building-improvement
-- purchases ALSO exceeded $10M in a movable-equipment trigger year
-- (equipment jump riding a build-out).
SELECT "ccn", "hospital_name", "state", "fy_end_year",
"building_purchases" + coalesce("building_improvement_purchases", 0) AS building_spend,
"movable_equipment_purchases"
FROM HEALTHPARSE_DATA.HOSPITAL_CAPEX_SIGNALS.HOSPITAL_CAPEX_SIGNALS
WHERE coalesce("building_purchases", 0) + coalesce("building_improvement_purchases", 0) >= 10000000
ORDER BY building_spend DESC;