# Medicare PFS Conversion Factor (by effective period)

`medicare_silver.medicare_conversion_factor` · Medicare Advantage, Part D, Medicaid · status live · 27 rows

The CMS Physician Fee Schedule conversion factor (dollars per RVU), keyed by calendar year, effective date, and payment track so mid-year changes and the CY2026 qpp/nonqpp split do not collapse into one scalar. Default/general serving is nonqpp, the full fee schedule; qpp applies only to qualifying APM participants.

**Grain.** One row per Medicare calendar year. There are exactly 7 rows, one each for CY2020 through CY2026 (the latest, 2026, just added). Each row carries that year's national PFS conversion factor and its year-over-year change.

**How to use it.** SELECT calendar_year, pfs_conversion_factor, percent_change FROM medicare_silver.medicare_conversion_factor ORDER BY calendar_year — returns the 7 annual national PFS conversion factors (2020-2026) with their YoY change, e.g. to look up the multiplier for converting a code's RVUs into a Medicare-allowed amount for a given year, or to show the CF trend (steady decline 2020-2025, +2.92% rebound to 33.29 in 2026).

**Traps.**
- Grain is calendar_year, NOT id. The profiler reports id as the unique key, but id is a pure sequential surrogate equal to calendar_year-2019 (VERIFIED 0 mismatches) — it adds nothing. Join and filter on calendar_year.
- Five columns are 100% NULL and are dead/aspirational schema, not meaningful: end_date, anesthesia_conversion_factor, rule_number, public_law, source_file_id. In particular there is NO usable anesthesia conversion factor here, and NO rule/public-law/file provenance — only the coarse mirror_source string. Don't try to price anesthesia or cite the enacting law from this table.
- No is_current / no snapshot duplication. This is a single mirrored snapshot: created_at is one identical timestamp for all rows and asserted_at is a single date (2026-06-03). There is exactly one row per year, so no dedup/as-of filtering is needed — but also don't expect bitemporal history of CF revisions.
- The table models only ONE CF per year at Jan-1 effective_date. It does NOT capture intra-year/mid-year CF revisions that occurred via legislation in some of these years (end_date is null, no second row). Treat each year's value as the single representative annual CF.
- prior_year_cf for the earliest year (2020 = 36.0391) is an external anchor with no matching row in this table; every other year's prior_year_cf is just the previous row's pfs_conversion_factor. Don't assume prior_year_cf is always derivable from this table — it isn't for the first year.
- This is the standard PFS conversion factor only. To get a Medicare-allowed dollar amount you must multiply by per-code geographically-adjusted RVUs from the fee-schedule tables (PFS RVU/GPCI sources) — this table is just the scalar multiplier, not a fee schedule itself. The 2026 value (33.29) reverses the multi-year decline (first positive percent_change, +2.92%).

| column | type | meaning |
|---|---|---|
| id | bigint | Sequential surrogate integer 1..7. VERIFIED to equal exactly calendar_year - 2019 for every row, so it carries no information beyond calendar_year and is just a row id mirrored from the source RDS table. Do not treat as a meaningful key — use calendar_year. |
| calendar_year | bigint | The Medicare calendar year the conversion factor applies to (2020-2026). THE real grain key — individually unique across all 7 rows. This is the join/filter column for picking the right year's factor. |
| effective_date | date | First day the factor is in effect — always Jan 1 of calendar_year (2020-01-01 ... 2026-01-01). Individually unique; redundant with calendar_year. Note: this does NOT capture historical mid-year CF revisions (e.g. legislative patches) — there is exactly one row per year with a clean Jan-1 effective date. |
| end_date | date | Intended last-effective date. ALWAYS NULL (0 of 7 populated). Null here means open-ended / not tracked, not a real interval — the table does not model intra-year CF changes via this column. |
| pfs_conversion_factor | double | THE core value: the national PFS conversion factor in dollars-per-RVU for that year. Observed: 2020=36.0896, 2021=34.8931, 2022=34.6062, 2023=33.8872, 2024=32.7442, 2025=32.3465, 2026=33.29. Steady decline 2020-2025, then a jump up in 2026. Allowed payment = (sum of geographically-adjusted RVUs for a code) x this factor. |
| anesthesia_conversion_factor | double | Intended to hold the separate, lower anesthesia-specific national CF (anesthesia uses base+time units, not RVUs). ALWAYS NULL (0 of 7 populated). This table currently only carries the standard PFS CF — for anesthesia pricing this column is unusable; the value is not present in this mirror. |
| rule_number | string | Intended CFR/Federal Register rule citation that set the factor. ALWAYS NULL (0 of 7). No provenance-to-rule linkage is populated. |
| public_law | string | Intended public-law citation (e.g. the Act that overrode a scheduled cut). ALWAYS NULL (0 of 7). Legislative provenance is not populated despite several of these years being legislatively adjusted. |
| prior_year_cf | double | The conversion factor used as the prior-year baseline for computing percent_change. VERIFIED: for 2021-2026 it exactly equals the previous row's pfs_conversion_factor (e.g. 2021's prior=36.0896 = 2020's CF). The 2020 row's prior_year_cf (36.0391) is the ONLY one with no matching row in this table — it is an external 2019 anchor carried in from the source. |
| percent_change | double | Year-over-year percent change of the CF vs prior_year_cf. VERIFIED to reproduce (cur/prior - 1)*100 within rounding (2020=+0.14, 2021=-3.31, 2022=-0.82, 2023=-2.08, 2024=-3.37, 2025=-1.21, 2026=+2.92). 2026 is the only positive year (the CF rebound). |
| source_file_id | bigint | Intended FK to a source-file registry. ALWAYS NULL (0 of 7). File-level provenance is not wired up; provenance is only the coarse mirror_source string below. |
| created_at | timestamp | Load timestamp. A single identical value for all 7 rows (2026-04-04 19:35:46.454) — the whole table was mirrored in one batch. Not a per-year publish date. |
| asserted_at | date | Bitemporal 'as-asserted' date. A single identical value for all rows (2026-06-03, = today's mirror run). All 7 rows share one assertion date; this is not a per-row history axis here. |
| mirror_source | string | Provenance string, identical for all rows: 'rds:vlada_enterprise.public.medicare_conversion_factor'. Confirms this Glue/Iceberg table is a mirror of the operational RDS table (the source of truth lives in hospital-server RDS vlada_enterprise). |
| source_url | string |  |
| sha256_content_hash | string |  |
| source_id | string |  |
| is_current | boolean |  |
| vintage_tag | string |  |
| parser_artifact_hash | string |  |
| parse_revision | int |  |
| fetcher_version | string |  |
| parser_version | string |  |
| parsed_member | string |  |
| payment_track | string |  |

Query it: `query_substrate` with `SELECT ... FROM medicare_silver.medicare_conversion_factor WHERE ... LIMIT 100`; read `describe_data_source("medicare_silver.medicare_conversion_factor")` first.
