PolicyEngine / PolicyEngine/policyengine-uk

Council tax integration: Nuffield Workstream 2 deliverable tracker

Open
#1,854 2 comments 0 reactions 0 assignees View on GitHub

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):

  1. Implement council tax bands and local authority rates from MHCLG data
  2. Validation test cases
  3. Compare against administrative totals
  4. Validate distributional impacts

Deliverables committed:

  1. Council tax by band and local authority
  2. National model integration
  3. Validation report
  4. 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) with band_d_amount, VOA dwelling counts for bands A–I, and net council tax requirement.
  • policyengine-uk-data: band assignment to households in datasets/enhanced_cps.py (_assign_council_tax_bands), using storage/council_tax_bands_2024.csv regional shares.
  • policyengine-uk-data: calibration targets ons/council_tax_band_d/{code} and voa/council_tax/{code}/{band} emitted from targets/sources/la_council_tax.py.
  • policyengine-uk: the full Council Tax Reduction stack under variables/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.py is 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_band is 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_amount variable 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.csv to MHCLG 2026-27 and extend Band D to all eight bands (Table 9 of Tables_1-9_2026-27.ods gives ONS code + Band A–H for 296 English authorities)
  • Alias map for the 12 authorities whose MHCLG name does not exactly match the LocalAuthority enum: 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_amount variable
  • 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_tax input, 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

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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.