PolicyEngine / PolicyEngine/policyengine-uk
Council tax integration: Nuffield Workstream 2 deliverable tracker
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 50
- Forks
- 33
- Avg merge
- 20h 58m
- Merged PRs (30d)
- 14
Description
Tracking issue for the council tax workstream committed in the Nuffield R&D 2025 application (Workstream 2, "Council Tax Integration", £32,000 / 4 person-months, Year 1 Q1 kickoff).
Application text: https://policyengine.github.io/nuffield-rda-2025
What we promised
We will add council tax to microsimulation, enabling combined local and national tax burden analysis. This addresses a significant gap—existing models omit local taxation despite £40bn annual revenue.
Method committed (test-driven, citing the childcare precedent):
- Implement council tax bands and local authority rates from MHCLG data
- Validation test cases
- Compare against administrative totals
- Validate distributional impacts
Deliverables committed:
- Council tax by band and local authority
- National model integration
- Validation report
- Policy examples
Current state
More exists than the deliverable list suggests — the data layer is substantially built, the liability calculation is not.
Already in place:
policyengine-uk-data:policyengine_uk_data/storage/la_council_tax.csv— 360 LAs (England, Scotland, Wales) withband_d_amount, VOA dwelling counts for bands A–I, and net council tax requirement.policyengine-uk-data: band assignment to households indatasets/enhanced_cps.py(_assign_council_tax_bands), usingstorage/council_tax_bands_2024.csvregional shares.policyengine-uk-data: calibration targetsons/council_tax_band_d/{code}andvoa/council_tax/{code}/{band}emitted fromtargets/sources/la_council_tax.py.policyengine-uk: the full Council Tax Reduction stack undervariables/gov/local_authorities/council_tax_reduction/, with bespoke schemes for Kingston upon Thames, Merton, Newham, Oxford and Westminster, plus England pensioner / Scotland / Wales parameters.TheAxiomFoundation/rulespec-uk: the national England pension-age CTR scheme (SI 2012/2885) and 100 local authority CTR schemes encoded with proof citations, plus a 297-row LA registry.
Not in place:
- Council tax liability is not computed anywhere.
variables/input/consumption/property/council_tax.pyis an input variable whose own docstring says it is "supplied by the household dataset rather than recomputed from local authority council tax schedules".council_tax_bandis likewise an input defaulting to Band D. - No statutory band-ratio parameters (A=6/9 … H=18/9 relative to Band D).
- No
council_tax_band_d_amountvariable in policyengine-uk, despite the data repo emitting a calibration target against that name (separate issue to follow). - No discounts, exemptions or premiums: single-person 25%, student/SMI exemptions, empty-home and second-home premiums.
- No parish/precept handling.
- Liability sourcing is England-only — Wales (StatsWales) and Scotland (Scottish Government) band amounts are not sourced.
- No validation against the MHCLG administrative total.
Work items
Deliverable 1 — council tax by band and local authority
- Refresh
la_council_tax.csvto MHCLG 2026-27 and extend Band D to all eight bands (Table 9 ofTables_1-9_2026-27.odsgives ONS code + Band A–H for 296 English authorities) - Alias map for the 12 authorities whose MHCLG name does not exactly match the
LocalAuthorityenum: Bristol, Cumberland, Durham, Herefordshire, Kings Lynn and West Norfolk, Kingston upon Hull, North Northamptonshire, North Yorkshire, Somerset, St Helens, West Northamptonshire, Westmorland and Furness - Source Wales band amounts (StatsWales)
- Source Scotland band amounts (Scottish Government council tax datasets)
Deliverable 2 — national model integration
-
council_tax_band_d_amountvariable - Statutory band-ratio parameters, including Band I for Wales
- Computed gross liability = Band D amount × band ratio
- Single-person discount (25%)
- Exemptions: students, severe mental impairment, Class A–W exempt dwellings
- Empty-home and second-home premiums
- Decide and document the relationship between computed liability and the existing
council_taxinput, including the effect on downstream CTR results
Deliverable 3 — validation report
- Aggregate computed liability vs MHCLG administrative total (~£40bn England)
- Per-LA comparison against
total_council_tax_net - Band distribution vs VOA dwelling counts
- Distributional validation (decile incidence) against an external benchmark
- Write up as a published validation note
Deliverable 4 — policy examples
- Band revaluation scenario
- Proportional property tax / council tax replacement
- Single-person discount reform
- Band D rate change by LA
Reference data
- MHCLG council tax levels 2026-27: https://www.gov.uk/government/statistics/council-tax-levels-set-by-local-authorities-in-england-2026-to-2027
- MHCLG council tax statistics collection: https://www.gov.uk/government/collections/council-tax-statistics
- Statutory band proportions: Local Government Finance Act 1992 s.5
Notes
Band amounts in MHCLG Table 9 are area figures — they include county, police, fire and parish precepts, not just the billing authority's own requirement. Any comparison against a billing-authority-only total needs to account for that.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reading variables/input/consumption/property/council_tax.py, datasets/enhanced_cps.py, and the existing la_council_tax.csv and calibration-target files. This is a multi-deliverable tracker, so first agree on one unchecked work item; done requires that item, its validation, and the relevant model or data integration to be completed.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- backend, data
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 25/100