From 8707375355636af710b77c07129d8bcc08e3f53e Mon Sep 17 00:00:00 2001 From: Vahid Ahmadi Date: Tue, 21 Apr 2026 12:39:43 +0100 Subject: [PATCH 01/10] Add LA-level council tax calibration targets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two families of LA-level targets, covering all 360 LAs in local_authorities_2021.csv, built from four public sources: - `ons/council_tax_band_d/{code}` (350 targets): average Band D council tax inclusive of all precepts per billing authority. Sources: MHCLG *Council Tax levels set by local authorities in England 2026-27*, Welsh Government *Council Tax levels April 2026 to March 2027*, Scottish Government *Council Tax Assumptions 2025*. All 296 English + 22 Welsh + 32 Scottish LAs covered. - `ons/council_tax_band_count/{code}/{band}` (2,541 targets): number of dwellings per band A-H per LA. Source: VOA *Council Tax: Stock of Properties, 2025*. Covers England + Wales (318 LAs × ~8 bands, minus City of London Band A which is VOA-suppressed). NI is excluded: domestic rates, not council tax. Scotland band counts are not in VOA; Scottish Assessors publishes them separately and is a follow-up. Files ----- - `storage/la_council_tax.csv` (31 KB, 360 rows): canonical CSV joining DLUHC Table 10 column 17, Welsh Table 1 "Overall average band D", Scottish Gov "CT by Band 2025-26" Band D column, and VOA CTSOP1.0 bands A-H onto the reference LA list. - Post-2023 South Yorkshire E-codes (E08000038/39) re-mapped to pre-2023 codes (E08000016/19) to match the reference list. - Scottish ampersand/double-space naming normalised ("Argyll & Bute" → "Argyll and Bute", etc.). - `targets/sources/la_council_tax.py`: reads the CSV, emits Target objects at geographic_level=LOCAL_AUTHORITY with per-country year tagging and per-country reference URL. Testing ------- 22 hermetic tests (no network access, no baseline fixture needed): Structure - Row count matches local_authorities_2021.csv. - Every expected column present. - Four UK country codes represented. - Every LA code matches the reference list. Value plausibility (the #371 lesson) - Band D amount in [£900, £3,500] for every row with a value. - Total dwellings in [200, 800,000] for every row with a value. - Explicit Isles of Scilly regression test: total dwellings in [500, 5,000], not the 2.49M outlier that slipped into #371. - Band A-H counts sum to total dwellings within 20-property slack (VOA 10-property suppression allowance). - Every band-count target value ≤ 500k (largest LA stock). Coverage expectations - Every English, Welsh and Scottish LA has a Band D value. - Northern Ireland has no council tax flagged (has_council_tax=False). Spot-checks of published facts - Wandsworth (E09000032) and Westminster (E09000033) are the two lowest-Band-D English LAs (catches row-swap bugs). - Scottish average Band D is £500+ below English average. Target-API invariants - get_targets() returns a non-empty list without network access. - Band D target count matches the CSV's non-null Band D count. - Band count target count matches Σ non-null band columns. - Every target carries geographic_level=LOCAL_AUTHORITY and a geo_code. - Band D targets use Unit.GBP; band count targets use Unit.COUNT with is_count=True. - Every target has at least one year of values. Sources ------- - MHCLG (England 2026-27): https://www.gov.uk/government/statistics/council-tax-levels-set-by-local-authorities-in-england-2026-to-2027 - Welsh Government (Wales 2026-27): https://www.gov.wales/council-tax-levels-april-2026-march-2027-html - Scottish Government (Scotland 2025-26): https://www.gov.scot/publications/council-tax-datasets/ - VOA (England + Wales 2025): https://www.gov.uk/government/statistics/council-tax-stock-of-properties-2025 Out of scope for this PR (follow-ups) ------------------------------------- - Wiring these targets into datasets/local_areas/local_authorities/loss.py so the LA reweighting actually calibrates on them. Planned follow-up PR. - Scottish Assessors per-LA chargeable-dwellings to fill the Scotland band-count gap. - Council Tax Support caseload per LA (DWP StatXplore). - Single Person Discount rate per LA (CIPFA). Co-Authored-By: Claude Opus 4.7 (1M context) --- .../storage/la_council_tax.csv | 361 ++++++++++++++++++ .../targets/sources/la_council_tax.py | 161 ++++++++ .../tests/test_la_council_tax_targets.py | 259 +++++++++++++ 3 files changed, 781 insertions(+) create mode 100644 policyengine_uk_data/storage/la_council_tax.csv create mode 100644 policyengine_uk_data/targets/sources/la_council_tax.py create mode 100644 policyengine_uk_data/tests/test_la_council_tax_targets.py diff --git a/policyengine_uk_data/storage/la_council_tax.csv b/policyengine_uk_data/storage/la_council_tax.csv new file mode 100644 index 000000000..645906d0d --- /dev/null +++ b/policyengine_uk_data/storage/la_council_tax.csv @@ -0,0 +1,361 @@ +code,name,country,band_d_amount,band_A,band_B,band_C,band_D_count,band_E,band_F,band_G,band_H,total_dwellings,has_council_tax +E06000001,Hartlepool,ENGLAND,2560.20,24090.00,7830.00,6780.00,3630.00,2070.00,930.00,700.00,110.00,46140.00,True +E06000002,Middlesbrough,ENGLAND,2549.16,33080.00,11550.00,11610.00,5620.00,2810.00,1040.00,600.00,50.00,66360.00,True +E06000003,Redcar and Cleveland,ENGLAND,2544.48,26840.00,13800.00,14820.00,6090.00,3610.00,1070.00,420.00,30.00,66680.00,True +E06000004,Stockton-on-Tees,ENGLAND,2589.83,34900.00,17560.00,16890.00,10400.00,6430.00,3000.00,1610.00,130.00,90920.00,True +E06000005,Darlington,ENGLAND,2493.83,23160.00,11180.00,7800.00,5950.00,3590.00,1400.00,680.00,50.00,53810.00,True +E06000006,Halton,ENGLAND,2366.61,27340.00,12760.00,8370.00,5230.00,3890.00,1270.00,360.00,40.00,59260.00,True +E06000007,Warrington,ENGLAND,2447.61,27780.00,21410.00,19980.00,12400.00,7960.00,4900.00,2730.00,230.00,97390.00,True +E06000008,Blackburn with Darwen,ENGLAND,2455.27,35860.00,9950.00,9010.00,4960.00,2780.00,840.00,580.00,70.00,64050.00,True +E06000009,Blackpool,ENGLAND,2513.22,32210.00,21330.00,11480.00,4860.00,1950.00,580.00,250.00,30.00,72690.00,True +E06000010,"Kingston upon Hull, City of",ENGLAND,2295.04,82540.00,24430.00,11440.00,4990.00,1410.00,320.00,60.00,40.00,125230.00,True +E06000011,East Riding of Yorkshire,ENGLAND,2466.08,40330.00,38430.00,33140.00,25660.00,17380.00,7740.00,3440.00,300.00,166420.00,True +E06000012,North East Lincolnshire,ENGLAND,2483.85,38690.00,18400.00,9390.00,5330.00,2520.00,980.00,510.00,60.00,75880.00,True +E06000013,North Lincolnshire,ENGLAND,2348.46,35920.00,16440.00,11580.00,7850.00,4020.00,1720.00,550.00,30.00,78110.00,True +E06000014,York,ENGLAND,2287.15,13150.00,25560.00,27300.00,13880.00,8030.00,3830.00,1930.00,140.00,93820.00,True +E06000015,Derby,ENGLAND,2306.00,58500.00,22270.00,17230.00,8900.00,4850.00,2340.00,710.00,50.00,114850.00,True +E06000016,Leicester,ENGLAND,2528.75,86990.00,28270.00,16960.00,7340.00,3570.00,1590.00,620.00,60.00,145400.00,True +E06000017,Rutland,ENGLAND,2737.58,1750.00,4890.00,3340.00,2570.00,2400.00,1690.00,1360.00,170.00,18170.00,True +E06000018,Nottingham,ENGLAND,2755.39,92180.00,25740.00,17180.00,7790.00,2660.00,1120.00,760.00,120.00,147550.00,True +E06000019,"Herefordshire, County of",ENGLAND,2574.37,14040.00,20630.00,17710.00,13820.00,12660.00,7680.00,3800.00,190.00,90530.00,True +E06000020,Telford and Wrekin,ENGLAND,2256.26,26960.00,22860.00,14900.00,10050.00,5870.00,2570.00,1210.00,60.00,84480.00,True +E06000021,Stoke-on-Trent,ENGLAND,2183.12,70450.00,25560.00,15880.00,5100.00,1980.00,560.00,200.00,40.00,119770.00,True +E06000022,Bath and North East Somerset,ENGLAND,2383.42,9370.00,19630.00,21290.00,14500.00,10460.00,5980.00,5210.00,460.00,86900.00,True +E06000023,"Bristol, City of",ENGLAND,2713.68,56890.00,76330.00,41320.00,19900.00,10120.00,4940.00,2900.00,360.00,212760.00,True +E06000024,North Somerset,ENGLAND,2491.22,13940.00,22140.00,23810.00,18060.00,13390.00,6880.00,3470.00,290.00,101980.00,True +E06000025,South Gloucestershire,ENGLAND,2550.59,14480.00,37160.00,30510.00,24250.00,13700.00,6630.00,2210.00,200.00,129140.00,True +E06000026,Plymouth,ENGLAND,2441.85,48160.00,33380.00,23670.00,10310.00,5250.00,1890.00,620.00,60.00,123340.00,True +E06000027,Torbay,ENGLAND,2470.25,13790.00,17850.00,17180.00,10750.00,5450.00,2420.00,1290.00,140.00,68870.00,True +E06000030,Swindon,ENGLAND,2438.10,15190.00,28070.00,25270.00,18530.00,9640.00,4020.00,1500.00,70.00,102290.00,True +E06000031,Peterborough,ENGLAND,2293.47,35930.00,22730.00,15460.00,9010.00,4930.00,2030.00,1070.00,80.00,91240.00,True +E06000032,Luton,ENGLAND,2439.93,21520.00,28100.00,22860.00,8000.00,3520.00,1130.00,290.00,30.00,85450.00,True +E06000033,Southend-on-Sea,ENGLAND,2265.17,17170.00,16180.00,24770.00,12900.00,6820.00,3710.00,1640.00,130.00,83320.00,True +E06000034,Thurrock,ENGLAND,2254.68,7540.00,14110.00,27720.00,12800.00,4860.00,2320.00,890.00,60.00,70300.00,True +E06000035,Medway,ENGLAND,2328.55,11470.00,38870.00,35530.00,19470.00,10230.00,4420.00,1560.00,60.00,121610.00,True +E06000036,Bracknell Forest,ENGLAND,2264.80,1650.00,5660.00,19880.00,10500.00,8670.00,5450.00,2690.00,310.00,54810.00,True +E06000037,West Berkshire,ENGLAND,2505.37,2750.00,7290.00,20500.00,17840.00,10950.00,7120.00,4880.00,780.00,72110.00,True +E06000038,Reading,ENGLAND,2612.77,7270.00,14990.00,31530.00,12220.00,5920.00,3390.00,1910.00,100.00,77330.00,True +E06000039,Slough,ENGLAND,2414.44,1560.00,10950.00,24390.00,13670.00,4700.00,1730.00,360.00,10.00,57370.00,True +E06000040,Windsor and Maidenhead,ENGLAND,1952.62,2140.00,4110.00,10700.00,16670.00,13590.00,8410.00,9970.00,2020.00,67610.00,True +E06000041,Wokingham,ENGLAND,2497.70,2030.00,4250.00,12130.00,21120.00,17040.00,11160.00,6830.00,570.00,75130.00,True +E06000042,Milton Keynes,ENGLAND,2372.21,18060.00,35810.00,32280.00,16440.00,13300.00,7180.00,3240.00,180.00,126490.00,True +E06000043,Brighton and Hove,ENGLAND,2580.54,30090.00,30490.00,35410.00,20470.00,11720.00,4830.00,2840.00,220.00,136070.00,True +E06000044,Portsmouth,ENGLAND,2291.71,27460.00,31800.00,22440.00,6280.00,3790.00,1660.00,660.00,60.00,94150.00,True +E06000045,Southampton,ENGLAND,2381.48,36920.00,35880.00,23760.00,9790.00,3200.00,1420.00,450.00,30.00,111450.00,True +E06000046,Isle of Wight,ENGLAND,2625.79,10650.00,18690.00,18000.00,13460.00,7340.00,3290.00,1570.00,150.00,73150.00,True +E06000047,County Durham,ENGLAND,2622.15,144190.00,36650.00,32590.00,23630.00,11500.00,4490.00,2310.00,280.00,255640.00,True +E06000049,Cheshire East,ENGLAND,2454.87,31710.00,39250.00,37540.00,28220.00,23520.00,15410.00,13130.00,2010.00,190790.00,True +E06000050,Cheshire West and Chester,ENGLAND,2517.33,35320.00,39140.00,33010.00,22530.00,17600.00,10540.00,8110.00,640.00,166890.00,True +E06000051,Shropshire,ENGLAND,2528.18,27440.00,38890.00,31760.00,22070.00,17630.00,9370.00,4830.00,360.00,152350.00,True +E06000052,Cornwall,ENGLAND,2590.93,66210.00,73220.00,61520.00,45030.00,26830.00,9650.00,4430.00,450.00,287340.00,True +E06000053,Isles of Scilly,ENGLAND,2047.96,10.00,40.00,110.00,270.00,330.00,270.00,130.00,10.00,1170.00,True +E06000054,Wiltshire,ENGLAND,2571.78,27030.00,42950.00,58820.00,41200.00,31680.00,18490.00,11570.00,1370.00,233110.00,True +E06000055,Bedford,ENGLAND,2471.74,10800.00,19080.00,20170.00,12480.00,8960.00,5790.00,3290.00,250.00,80820.00,True +E06000056,Central Bedfordshire,ENGLAND,2516.16,11290.00,25640.00,36860.00,26700.00,17800.00,10200.00,5700.00,410.00,134600.00,True +E06000057,Northumberland,ENGLAND,2596.94,70860.00,26550.00,21800.00,18410.00,12210.00,7600.00,4550.00,590.00,162570.00,True +E06000058,"Bournemouth, Christchurch and Poole",ENGLAND,2435.58,26730.00,34610.00,54390.00,36070.00,21890.00,9450.00,5820.00,1310.00,190270.00,True +E06000059,Dorset,ENGLAND,2765.02,20840.00,31970.00,43430.00,37400.00,28890.00,16160.00,8230.00,740.00,187660.00,True +E06000060,Buckinghamshire,ENGLAND,2526.58,6970.00,26310.00,54560.00,47150.00,36730.00,29170.00,31530.00,6160.00,238580.00,True +E06000061,North Northamptonshire,ENGLAND,2423.96,48480.00,42960.00,29500.00,18750.00,12750.00,5530.00,3060.00,280.00,161310.00,True +E06000062,West Northamptonshire,ENGLAND,2486.66,38700.00,41080.00,46110.00,24480.00,17970.00,10680.00,6520.00,490.00,186030.00,True +E06000063,Cumberland,ENGLAND,2511.32,64010.00,25940.00,20470.00,15630.00,8470.00,2980.00,980.00,80.00,138560.00,True +E06000064,Westmorland and Furness,ENGLAND,2507.99,29300.00,24520.00,23280.00,17770.00,12750.00,6480.00,3440.00,340.00,117880.00,True +E06000065,North Yorkshire,ENGLAND,2544.34,48920.00,65620.00,70150.00,46130.00,37890.00,22340.00,14070.00,1310.00,306430.00,True +E06000066,Somerset,ENGLAND,2560.59,43360.00,72220.00,59900.00,40390.00,31050.00,16940.00,7820.00,520.00,272200.00,True +E07000008,Cambridge,ENGLAND,2467.02,4420.00,11090.00,20890.00,10610.00,6060.00,3990.00,3270.00,510.00,60840.00,True +E07000009,East Cambridgeshire,ENGLAND,2485.18,5000.00,11670.00,8580.00,7610.00,5110.00,2460.00,820.00,90.00,41340.00,True +E07000010,Fenland,ENGLAND,2537.74,17450.00,13190.00,9030.00,4960.00,2520.00,710.00,190.00,30.00,48080.00,True +E07000011,Huntingdonshire,ENGLAND,2556.40,12600.00,21820.00,19420.00,12970.00,10360.00,4490.00,2010.00,180.00,83850.00,True +E07000012,South Cambridgeshire,ENGLAND,2536.25,2780.00,8620.00,22500.00,13830.00,12340.00,8670.00,4900.00,420.00,74060.00,True +E07000032,Amber Valley,ENGLAND,2407.69,22980.00,12960.00,11020.00,7050.00,3630.00,1940.00,1550.00,140.00,61270.00,True +E07000033,Bolsover,ENGLAND,2559.41,22440.00,6910.00,4880.00,3040.00,1150.00,350.00,150.00,20.00,38940.00,True +E07000034,Chesterfield,ENGLAND,2339.49,27100.00,10630.00,6530.00,4070.00,2150.00,620.00,220.00,30.00,51350.00,True +E07000035,Derbyshire Dales,ENGLAND,2444.70,3680.00,7630.00,7720.00,5850.00,5290.00,3300.00,2170.00,140.00,35780.00,True +E07000036,Erewash,ENGLAND,2360.64,22010.00,14290.00,7900.00,5080.00,2430.00,920.00,530.00,40.00,53200.00,True +E07000037,High Peak,ENGLAND,2384.66,8670.00,13380.00,9510.00,5120.00,4100.00,2200.00,860.00,50.00,43890.00,True +E07000038,North East Derbyshire,ENGLAND,2466.57,19260.00,10030.00,8200.00,5700.00,3300.00,1630.00,900.00,70.00,49090.00,True +E07000039,South Derbyshire,ENGLAND,2339.61,11910.00,11780.00,9770.00,8370.00,5700.00,2430.00,1020.00,100.00,51080.00,True +E07000040,East Devon,ENGLAND,2595.46,6860.00,14150.00,17830.00,13670.00,11400.00,6700.00,4270.00,210.00,75090.00,True +E07000041,Exeter,ENGLAND,2495.36,13480.00,15450.00,14560.00,10030.00,4570.00,2220.00,1020.00,50.00,61380.00,True +E07000042,Mid Devon,ENGLAND,2656.41,6550.00,9380.00,7290.00,6700.00,5010.00,2640.00,980.00,60.00,38610.00,True +E07000043,North Devon,ENGLAND,2642.21,10450.00,11830.00,10620.00,8670.00,5100.00,2040.00,640.00,50.00,49400.00,True +E07000044,South Hams,ENGLAND,2615.22,5360.00,9100.00,9570.00,8500.00,7590.00,4140.00,3200.00,380.00,47840.00,True +E07000045,Teignbridge,ENGLAND,2643.12,9080.00,14740.00,14520.00,12280.00,8610.00,4110.00,2060.00,120.00,65520.00,True +E07000046,Torridge,ENGLAND,2601.42,8460.00,7500.00,7340.00,6150.00,3520.00,1210.00,390.00,30.00,34600.00,True +E07000047,West Devon,ENGLAND,2705.33,3640.00,6760.00,5760.00,4560.00,3710.00,1920.00,1050.00,80.00,27480.00,True +E07000061,Eastbourne,ENGLAND,2654.28,8870.00,13370.00,10980.00,8760.00,4600.00,2070.00,1130.00,90.00,49870.00,True +E07000062,Hastings,ENGLAND,2676.58,14990.00,12520.00,7810.00,5800.00,2350.00,860.00,200.00,40.00,44570.00,True +E07000063,Lewes,ENGLAND,2756.17,4510.00,6410.00,13850.00,10360.00,6260.00,3300.00,2420.00,250.00,47360.00,True +E07000064,Rother,ENGLAND,2700.95,5050.00,7420.00,10230.00,9430.00,7690.00,4110.00,2770.00,280.00,46980.00,True +E07000065,Wealden,ENGLAND,2728.43,4360.00,8470.00,17900.00,16070.00,12010.00,8130.00,7340.00,950.00,75230.00,True +E07000066,Basildon,ENGLAND,2327.24,9100.00,16310.00,24750.00,14900.00,7930.00,4900.00,2080.00,200.00,80170.00,True +E07000067,Braintree,ENGLAND,2280.34,6240.00,17650.00,20390.00,10900.00,8240.00,4990.00,2500.00,230.00,71140.00,True +E07000068,Brentwood,ENGLAND,2258.14,690.00,3080.00,6950.00,8900.00,6470.00,4620.00,4060.00,660.00,35430.00,True +E07000069,Castle Point,ENGLAND,2318.63,3370.00,6440.00,13880.00,8710.00,4480.00,1920.00,770.00,70.00,39640.00,True +E07000070,Chelmsford,ENGLAND,2300.18,5180.00,10960.00,23980.00,18540.00,11460.00,6610.00,4590.00,450.00,81770.00,True +E07000071,Colchester,ENGLAND,2282.85,9600.00,23120.00,21170.00,16230.00,9320.00,4310.00,2600.00,170.00,86520.00,True +E07000072,Epping Forest,ENGLAND,2277.21,2120.00,5220.00,12060.00,14210.00,10280.00,7130.00,6320.00,1260.00,58600.00,True +E07000073,Harlow,ENGLAND,2298.69,2620.00,8360.00,19630.00,5240.00,3070.00,1180.00,450.00,20.00,40570.00,True +E07000074,Maldon,ENGLAND,2328.37,2480.00,3980.00,8640.00,5690.00,4710.00,3180.00,1700.00,190.00,30570.00,True +E07000075,Rochford,ENGLAND,2363.48,1580.00,4080.00,12110.00,10890.00,5350.00,2800.00,1450.00,80.00,38340.00,True +E07000076,Tendring,ENGLAND,2269.63,13840.00,18040.00,22070.00,12380.00,6120.00,2160.00,980.00,90.00,75680.00,True +E07000077,Uttlesford,ENGLAND,2333.82,1430.00,4180.00,8770.00,8080.00,7610.00,5310.00,4960.00,460.00,40800.00,True +E07000078,Cheltenham,ENGLAND,2369.52,9990.00,13530.00,14150.00,9450.00,5270.00,2800.00,2210.00,150.00,57550.00,True +E07000079,Cotswold,ENGLAND,2391.65,3710.00,5430.00,11550.00,7770.00,6740.00,5310.00,4950.00,780.00,46240.00,True +E07000080,Forest of Dean,ENGLAND,2443.42,7210.00,10410.00,9230.00,6150.00,4670.00,2190.00,1040.00,80.00,40980.00,True +E07000081,Gloucester,ENGLAND,2355.84,17700.00,16980.00,14340.00,6110.00,3880.00,930.00,180.00,10.00,60130.00,True +E07000082,Stroud,ENGLAND,2491.36,7630.00,13050.00,13150.00,8640.00,7320.00,4230.00,2660.00,260.00,56940.00,True +E07000083,Tewkesbury,ENGLAND,2340.53,7060.00,7130.00,13060.00,6790.00,6070.00,3780.00,2130.00,210.00,46230.00,True +E07000084,Basingstoke and Deane,ENGLAND,2255.21,2620.00,13300.00,28100.00,15490.00,11350.00,6790.00,3570.00,460.00,81680.00,True +E07000085,East Hampshire,ENGLAND,2343.92,3080.00,6360.00,13430.00,11590.00,9270.00,6950.00,5160.00,670.00,56510.00,True +E07000086,Eastleigh,ENGLAND,2342.21,4710.00,12600.00,19810.00,11260.00,8190.00,3510.00,1210.00,30.00,61320.00,True +E07000087,Fareham,ENGLAND,2270.55,3640.00,7390.00,15710.00,10880.00,8130.00,3720.00,1530.00,140.00,51140.00,True +E07000088,Gosport,ENGLAND,2344.29,6170.00,13380.00,9230.00,5170.00,2010.00,1570.00,330.00,20.00,37880.00,True +E07000089,Hart,ENGLAND,2400.02,780.00,2600.00,10120.00,9720.00,8280.00,7220.00,4050.00,260.00,43030.00,True +E07000090,Havant,ENGLAND,2320.28,8610.00,14860.00,13770.00,10550.00,5950.00,2590.00,990.00,50.00,57370.00,True +E07000091,New Forest,ENGLAND,2419.76,7330.00,12250.00,18260.00,19460.00,13700.00,7220.00,4700.00,620.00,83540.00,True +E07000092,Rushmoor,ENGLAND,2320.28,1500.00,9090.00,16950.00,9310.00,4250.00,1320.00,330.00,20.00,42770.00,True +E07000093,Test Valley,ENGLAND,2305.52,3120.00,10040.00,15600.00,11420.00,8800.00,5320.00,3950.00,560.00,58810.00,True +E07000094,Winchester,ENGLAND,2359.76,3050.00,7530.00,13750.00,11310.00,9190.00,7180.00,6020.00,750.00,58780.00,True +E07000095,Broxbourne,ENGLAND,2306.43,590.00,3820.00,9960.00,14530.00,7880.00,3010.00,2350.00,230.00,42370.00,True +E07000096,Dacorum,ENGLAND,2408.51,1240.00,8300.00,20760.00,16240.00,9420.00,5860.00,5260.00,850.00,67930.00,True +E07000098,Hertsmere,ENGLAND,2405.83,820.00,3090.00,7450.00,14980.00,8990.00,4640.00,4750.00,1230.00,45950.00,True +E07000099,North Hertfordshire,ENGLAND,2448.52,3450.00,9440.00,20320.00,10450.00,7490.00,4900.00,3630.00,360.00,60040.00,True +E07000102,Three Rivers,ENGLAND,2422.31,890.00,2430.00,6980.00,10030.00,7560.00,4470.00,5170.00,1630.00,39160.00,True +E07000103,Watford,ENGLAND,2446.70,470.00,4490.00,16000.00,14260.00,3890.00,2220.00,1930.00,80.00,43340.00,True +E07000105,Ashford,ENGLAND,2410.16,4380.00,13910.00,13710.00,10220.00,7120.00,6220.00,3570.00,220.00,59350.00,True +E07000106,Canterbury,ENGLAND,2419.33,7760.00,14100.00,21250.00,14160.00,7950.00,4210.00,2320.00,120.00,71870.00,True +E07000107,Dartford,ENGLAND,2375.15,1750.00,6830.00,15370.00,14590.00,7750.00,3030.00,1120.00,70.00,50510.00,True +E07000108,Dover,ENGLAND,2461.74,7300.00,17350.00,14600.00,7750.00,4650.00,2580.00,1590.00,80.00,55900.00,True +E07000109,Gravesham,ENGLAND,2408.24,3680.00,7050.00,15260.00,10970.00,4780.00,2130.00,1100.00,110.00,45080.00,True +E07000110,Maidstone,ENGLAND,2502.59,4520.00,9570.00,21210.00,20600.00,10980.00,6610.00,4720.00,390.00,78600.00,True +E07000111,Sevenoaks,ENGLAND,2522.36,1910.00,3480.00,11660.00,12160.00,7730.00,6170.00,7990.00,1550.00,52650.00,True +E07000112,Folkestone and Hythe,ENGLAND,2538.75,7190.00,13030.00,14680.00,8720.00,5280.00,2790.00,1980.00,100.00,53770.00,True +E07000113,Swale,ENGLAND,2405.65,10400.00,16590.00,17920.00,12190.00,6130.00,2820.00,1310.00,120.00,67480.00,True +E07000114,Thanet,ENGLAND,2490.90,16400.00,20220.00,18390.00,8250.00,4210.00,1660.00,840.00,40.00,70010.00,True +E07000115,Tonbridge and Malling,ENGLAND,2471.83,1770.00,4080.00,16220.00,14410.00,9650.00,5570.00,5100.00,470.00,57270.00,True +E07000116,Tunbridge Wells,ENGLAND,2446.15,3500.00,5440.00,14220.00,11090.00,7180.00,5240.00,5620.00,620.00,52910.00,True +E07000117,Burnley,ENGLAND,2549.42,25800.00,5850.00,6530.00,3080.00,1350.00,340.00,130.00,20.00,43100.00,True +E07000118,Chorley,ENGLAND,2430.23,15200.00,12200.00,9810.00,7020.00,5490.00,2390.00,1050.00,70.00,53230.00,True +E07000119,Fylde,ENGLAND,2483.94,7180.00,7030.00,9690.00,7560.00,5420.00,2960.00,1690.00,140.00,41670.00,True +E07000120,Hyndburn,ENGLAND,2465.98,21980.00,5870.00,5900.00,2870.00,870.00,280.00,170.00,10.00,37950.00,True +E07000121,Lancaster,ENGLAND,2503.19,23600.00,16510.00,12830.00,6740.00,4270.00,2130.00,870.00,80.00,67030.00,True +E07000122,Pendle,ENGLAND,2640.18,25170.00,4850.00,4640.00,3500.00,1890.00,1030.00,550.00,40.00,41670.00,True +E07000123,Preston,ENGLAND,2575.74,31000.00,13610.00,11260.00,7490.00,3750.00,2130.00,1080.00,70.00,70390.00,True +E07000124,Ribble Valley,ENGLAND,2386.50,3900.00,5620.00,5810.00,5100.00,4310.00,2680.00,2050.00,240.00,29710.00,True +E07000125,Rossendale,ENGLAND,2519.97,16480.00,5250.00,4430.00,3460.00,2040.00,720.00,470.00,40.00,32890.00,True +E07000126,South Ribble,ENGLAND,2442.66,10130.00,13620.00,13130.00,8660.00,4510.00,1770.00,610.00,30.00,52460.00,True +E07000127,West Lancashire,ENGLAND,2456.23,14980.00,9760.00,10530.00,7650.00,5430.00,2690.00,1700.00,110.00,52850.00,True +E07000128,Wyre,ENGLAND,2460.53,12060.00,12580.00,13420.00,7900.00,6050.00,2760.00,1150.00,80.00,56000.00,True +E07000129,Blaby,ENGLAND,2490.22,5040.00,15700.00,10280.00,6940.00,4640.00,1660.00,550.00,40.00,44850.00,True +E07000130,Charnwood,ENGLAND,2405.64,13340.00,22020.00,19430.00,11510.00,7600.00,3430.00,2070.00,230.00,79630.00,True +E07000131,Harborough,ENGLAND,2389.87,4750.00,9770.00,8640.00,7110.00,7400.00,4120.00,2840.00,260.00,44890.00,True +E07000132,Hinckley and Bosworth,ENGLAND,2382.62,8930.00,16590.00,11540.00,7590.00,4630.00,2350.00,1160.00,70.00,52860.00,True +E07000133,Melton,ENGLAND,2429.67,3700.00,7790.00,4100.00,4050.00,2690.00,1640.00,1050.00,90.00,25110.00,True +E07000134,North West Leicestershire,ENGLAND,2418.20,10270.00,14790.00,8280.00,7300.00,5420.00,2050.00,990.00,60.00,49160.00,True +E07000135,Oadby and Wigston,ENGLAND,2406.85,4150.00,6340.00,7340.00,3290.00,2200.00,650.00,490.00,90.00,24550.00,True +E07000136,Boston,ENGLAND,2308.73,15550.00,6610.00,6240.00,2390.00,880.00,240.00,80.00,20.00,32010.00,True +E07000137,East Lindsey,ENGLAND,2275.88,28110.00,15500.00,16290.00,6970.00,3790.00,1490.00,610.00,60.00,72820.00,True +E07000138,Lincoln,ENGLAND,2323.08,28930.00,9140.00,4950.00,2570.00,1440.00,530.00,140.00,40.00,47740.00,True +E07000139,North Kesteven,ENGLAND,2337.81,14220.00,14110.00,13430.00,7480.00,3840.00,1680.00,430.00,60.00,55250.00,True +E07000140,South Holland,ENGLAND,2278.20,16760.00,9810.00,10700.00,4790.00,2150.00,450.00,120.00,20.00,44800.00,True +E07000141,South Kesteven,ENGLAND,2260.00,20100.00,15530.00,11790.00,9650.00,6080.00,3130.00,1130.00,110.00,67520.00,True +E07000142,West Lindsey,ENGLAND,2354.25,17270.00,8670.00,8200.00,6290.00,3970.00,1690.00,550.00,70.00,46710.00,True +E07000143,Breckland,ENGLAND,2443.67,16260.00,18480.00,14810.00,8550.00,5040.00,1910.00,830.00,60.00,65940.00,True +E07000144,Broadland,ENGLAND,2437.78,5060.00,16080.00,21850.00,10660.00,5650.00,2370.00,880.00,100.00,62650.00,True +E07000145,Great Yarmouth,ENGLAND,2414.41,20910.00,12800.00,9080.00,4480.00,2020.00,640.00,260.00,20.00,50210.00,True +E07000146,King's Lynn and West Norfolk,ENGLAND,2430.13,24670.00,17970.00,13850.00,10010.00,5410.00,2790.00,1220.00,120.00,76040.00,True +E07000147,North Norfolk,ENGLAND,2459.93,12190.00,14640.00,11880.00,9220.00,5130.00,2460.00,1100.00,90.00,56710.00,True +E07000148,Norwich,ENGLAND,2503.44,28590.00,23800.00,9090.00,3760.00,2360.00,930.00,610.00,70.00,69210.00,True +E07000149,South Norfolk,ENGLAND,2482.87,7340.00,18430.00,16780.00,11990.00,7950.00,3400.00,1580.00,120.00,67590.00,True +E07000170,Ashfield,ENGLAND,2608.76,30290.00,11920.00,9110.00,4460.00,1560.00,520.00,130.00,30.00,58020.00,True +E07000171,Bassetlaw,ENGLAND,2644.95,28230.00,9040.00,7100.00,7070.00,3530.00,1720.00,740.00,60.00,57490.00,True +E07000172,Broxtowe,ENGLAND,2618.21,16870.00,13610.00,11200.00,6230.00,2840.00,840.00,510.00,30.00,52130.00,True +E07000173,Gedling,ENGLAND,2609.55,14900.00,15650.00,10760.00,7070.00,4390.00,1500.00,950.00,100.00,55320.00,True +E07000174,Mansfield,ENGLAND,2600.38,27850.00,9960.00,7030.00,4250.00,1770.00,470.00,210.00,30.00,51570.00,True +E07000175,Newark and Sherwood,ENGLAND,2682.10,24260.00,8980.00,9640.00,6640.00,4570.00,2810.00,1530.00,140.00,58570.00,True +E07000176,Rushcliffe,ENGLAND,2643.27,6420.00,11430.00,12090.00,10200.00,7720.00,4640.00,2720.00,150.00,55370.00,True +E07000177,Cherwell,ENGLAND,2582.96,6230.00,16680.00,19780.00,12700.00,9260.00,4490.00,2890.00,270.00,72300.00,True +E07000178,Oxford,ENGLAND,2678.40,2970.00,9890.00,19810.00,16320.00,7670.00,3140.00,3370.00,610.00,63780.00,True +E07000179,South Oxfordshire,ENGLAND,2597.57,2130.00,6070.00,18530.00,15260.00,10980.00,6810.00,6420.00,990.00,67190.00,True +E07000180,Vale of White Horse,ENGLAND,2577.44,1910.00,6870.00,19390.00,14150.00,10450.00,6620.00,4870.00,490.00,64750.00,True +E07000181,West Oxfordshire,ENGLAND,2566.95,1690.00,6220.00,17990.00,11950.00,7990.00,4640.00,3100.00,420.00,54000.00,True +E07000192,Cannock Chase,ENGLAND,2375.83,14120.00,14510.00,8860.00,5680.00,2000.00,660.00,280.00,20.00,46130.00,True +E07000193,East Staffordshire,ENGLAND,2351.34,18370.00,12310.00,9590.00,6790.00,5160.00,2660.00,1300.00,100.00,56280.00,True +E07000194,Lichfield,ENGLAND,2351.90,6010.00,11020.00,12460.00,7530.00,5140.00,4030.00,2730.00,430.00,49350.00,True +E07000195,Newcastle-under-Lyme,ENGLAND,2334.25,24990.00,10910.00,11780.00,4990.00,2910.00,1860.00,1020.00,50.00,58510.00,True +E07000196,South Staffordshire,ENGLAND,2313.67,6900.00,10910.00,12080.00,7570.00,5600.00,3610.00,2490.00,220.00,49380.00,True +E07000197,Stafford,ENGLAND,2302.68,12420.00,14480.00,14660.00,10060.00,7020.00,3780.00,1660.00,110.00,64190.00,True +E07000198,Staffordshire Moorlands,ENGLAND,2338.21,9660.00,10860.00,10880.00,6360.00,4560.00,2020.00,810.00,40.00,45190.00,True +E07000199,Tamworth,ENGLAND,2300.76,9530.00,12410.00,6180.00,4020.00,2210.00,600.00,130.00,10.00,35090.00,True +E07000200,Babergh,ENGLAND,2341.55,5220.00,12430.00,9280.00,7820.00,4880.00,2650.00,1800.00,200.00,44280.00,True +E07000202,Ipswich,ENGLAND,2468.25,19420.00,23220.00,11540.00,4510.00,2370.00,960.00,380.00,20.00,62420.00,True +E07000203,Mid Suffolk,ENGLAND,2316.88,5950.00,13510.00,11200.00,8080.00,6420.00,3390.00,1740.00,110.00,50400.00,True +E07000207,Elmbridge,ENGLAND,2557.75,460.00,1890.00,8180.00,14150.00,11310.00,8140.00,11460.00,4550.00,60140.00,True +E07000208,Epsom and Ewell,ENGLAND,2530.84,160.00,1270.00,5610.00,9290.00,7810.00,4830.00,4180.00,150.00,33300.00,True +E07000209,Guildford,ENGLAND,2547.30,2290.00,3550.00,12790.00,16940.00,10640.00,6920.00,7590.00,1860.00,62580.00,True +E07000210,Mole Valley,ENGLAND,2519.86,1690.00,2740.00,4520.00,8420.00,7240.00,6310.00,7830.00,1080.00,39830.00,True +E07000211,Reigate and Banstead,ENGLAND,2566.61,1230.00,4270.00,13130.00,18260.00,11660.00,7700.00,7540.00,1140.00,64930.00,True +E07000212,Runnymede,ENGLAND,2492.99,2500.00,1610.00,8040.00,11690.00,6950.00,4300.00,3230.00,1140.00,39460.00,True +E07000213,Spelthorne,ENGLAND,2526.44,460.00,1790.00,10140.00,15180.00,10110.00,4730.00,2200.00,120.00,44730.00,True +E07000214,Surrey Heath,ENGLAND,2585.16,740.00,2650.00,6380.00,10230.00,6900.00,5940.00,5330.00,540.00,38710.00,True +E07000215,Tandridge,ENGLAND,2594.85,940.00,2230.00,5440.00,9130.00,7870.00,4940.00,6400.00,1290.00,38240.00,True +E07000216,Waverley,ENGLAND,2604.87,1030.00,3480.00,10920.00,13590.00,10110.00,7380.00,8910.00,2180.00,57600.00,True +E07000217,Woking,ENGLAND,2598.04,340.00,3620.00,11320.00,12600.00,6360.00,4240.00,5260.00,830.00,44570.00,True +E07000218,North Warwickshire,ENGLAND,2532.10,6750.00,7510.00,6520.00,4060.00,2610.00,1420.00,790.00,80.00,29740.00,True +E07000219,Nuneaton and Bedworth,ENGLAND,2502.16,20960.00,13710.00,14700.00,7910.00,3180.00,870.00,200.00,20.00,61550.00,True +E07000220,Rugby,ENGLAND,2483.05,9090.00,12130.00,12530.00,7400.00,5280.00,3530.00,1910.00,110.00,51980.00,True +E07000221,Stratford-on-Avon,ENGLAND,2484.17,3850.00,8630.00,18950.00,11350.00,10780.00,6850.00,5980.00,1000.00,67390.00,True +E07000222,Warwick,ENGLAND,2461.55,5040.00,12630.00,18940.00,13730.00,8520.00,5700.00,4720.00,460.00,69740.00,True +E07000223,Adur,ENGLAND,2548.28,2780.00,5110.00,11580.00,6340.00,2050.00,760.00,340.00,10.00,28970.00,True +E07000224,Arun,ENGLAND,2487.24,8520.00,12990.00,21180.00,16680.00,10930.00,6350.00,2800.00,310.00,79760.00,True +E07000225,Chichester,ENGLAND,2469.68,3350.00,6540.00,15290.00,13040.00,9560.00,6440.00,6020.00,1360.00,61600.00,True +E07000226,Crawley,ENGLAND,2418.46,1300.00,7670.00,22570.00,9100.00,3820.00,2350.00,470.00,10.00,47290.00,True +E07000227,Horsham,ENGLAND,2441.01,2440.00,6790.00,14020.00,14410.00,11640.00,8560.00,8080.00,840.00,66780.00,True +E07000228,Mid Sussex,ENGLAND,2474.26,2340.00,7790.00,15320.00,17830.00,12370.00,9200.00,5050.00,450.00,70350.00,True +E07000229,Worthing,ENGLAND,2456.13,8370.00,11640.00,13190.00,9760.00,5610.00,2450.00,930.00,30.00,51980.00,True +E07000234,Bromsgrove,ENGLAND,2478.65,3950.00,7460.00,9350.00,8060.00,7220.00,3850.00,2920.00,380.00,43190.00,True +E07000235,Malvern Hills,ENGLAND,2450.92,4100.00,7690.00,8820.00,5980.00,5370.00,4150.00,2550.00,130.00,38790.00,True +E07000236,Redditch,ENGLAND,2462.95,8040.00,12220.00,7970.00,4490.00,3450.00,1290.00,480.00,20.00,37960.00,True +E07000237,Worcester,ENGLAND,2405.81,9010.00,15430.00,12030.00,5670.00,3590.00,1620.00,450.00,10.00,47810.00,True +E07000238,Wychavon,ENGLAND,2373.19,7180.00,12070.00,14580.00,8550.00,7890.00,6900.00,4850.00,230.00,62250.00,True +E07000239,Wyre Forest,ENGLAND,2512.47,11730.00,11960.00,12080.00,6540.00,3610.00,1800.00,1300.00,140.00,49160.00,True +E07000240,St Albans,ENGLAND,2419.22,880.00,3220.00,10530.00,16530.00,13100.00,9530.00,8270.00,1410.00,63470.00,True +E07000241,Welwyn Hatfield,ENGLAND,2452.26,1250.00,5850.00,16360.00,12550.00,5590.00,4500.00,3960.00,750.00,50810.00,True +E07000242,East Hertfordshire,ENGLAND,2454.78,1000.00,6460.00,16520.00,17010.00,12070.00,8140.00,5950.00,870.00,68020.00,True +E07000243,Stevenage,ENGLAND,2391.97,1700.00,6890.00,21760.00,3380.00,3280.00,980.00,430.00,20.00,38440.00,True +E07000244,East Suffolk,ENGLAND,2334.80,28230.00,31230.00,23810.00,18810.00,11760.00,5650.00,3070.00,250.00,122810.00,True +E07000245,West Suffolk,ENGLAND,2351.47,12730.00,29030.00,17370.00,12390.00,7410.00,3050.00,2100.00,200.00,84280.00,True +E08000001,Bolton,ENGLAND,2399.74,65640.00,22820.00,18990.00,11000.00,5820.00,2370.00,1930.00,250.00,128820.00,True +E08000002,Bury,ENGLAND,2555.15,30710.00,18680.00,17540.00,9380.00,5700.00,1900.00,1320.00,180.00,85410.00,True +E08000003,Manchester,ENGLAND,2312.04,137810.00,43100.00,38170.00,21260.00,7640.00,3400.00,1270.00,150.00,252800.00,True +E08000004,Oldham,ENGLAND,2602.23,51140.00,17700.00,16730.00,7310.00,3540.00,1630.00,940.00,80.00,99070.00,True +E08000005,Rochdale,ENGLAND,2600.83,51910.00,17400.00,13280.00,8260.00,4580.00,1710.00,900.00,50.00,98090.00,True +E08000006,Salford,ENGLAND,2594.45,63640.00,31220.00,22180.00,12350.00,3910.00,1490.00,880.00,110.00,135780.00,True +E08000007,Stockport,ENGLAND,2618.90,31820.00,29160.00,28940.00,19920.00,13320.00,6570.00,3620.00,230.00,133580.00,True +E08000008,Tameside,ENGLAND,2447.21,53040.00,19680.00,20250.00,7290.00,4000.00,950.00,450.00,40.00,105700.00,True +E08000009,Trafford,ENGLAND,2291.70,20050.00,23020.00,27720.00,15590.00,7940.00,4690.00,4230.00,1070.00,104310.00,True +E08000010,Wigan,ENGLAND,2152.68,68940.00,34800.00,25810.00,13480.00,7730.00,2030.00,650.00,60.00,153500.00,True +E08000011,Knowsley,ENGLAND,2488.25,38180.00,15340.00,10660.00,5000.00,2110.00,330.00,130.00,20.00,71770.00,True +E08000012,Liverpool,ENGLAND,2673.59,143680.00,44920.00,29870.00,14000.00,5140.00,2360.00,1760.00,150.00,241880.00,True +E08000013,St. Helens,ENGLAND,2403.38,37850.00,19360.00,15770.00,7030.00,3810.00,1690.00,600.00,40.00,86150.00,True +E08000014,Sefton,ENGLAND,2583.22,39990.00,28250.00,31380.00,15840.00,8930.00,3990.00,2740.00,290.00,131410.00,True +E08000015,Wirral,ENGLAND,2500.59,61080.00,33140.00,27740.00,13690.00,8580.00,4390.00,3220.00,290.00,152130.00,True +E08000016,Barnsley,ENGLAND,2325.96,65310.00,19340.00,14570.00,9790.00,4190.00,1630.00,710.00,60.00,115600.00,True +E08000017,Doncaster,ENGLAND,2167.75,82760.00,27200.00,16270.00,10220.00,4900.00,2280.00,980.00,140.00,144750.00,True +E08000018,Rotherham,ENGLAND,2381.53,64280.00,24200.00,16130.00,9790.00,5070.00,2010.00,810.00,70.00,122360.00,True +E08000019,Sheffield,ENGLAND,2510.16,152470.00,42460.00,33260.00,16910.00,9780.00,4420.00,2890.00,220.00,262410.00,True +E08000021,Newcastle upon Tyne,ENGLAND,2542.19,77750.00,21680.00,20520.00,10160.00,5940.00,2640.00,1930.00,140.00,140760.00,True +E08000022,North Tyneside,ENGLAND,2461.77,50580.00,16240.00,20200.00,8490.00,4540.00,1590.00,380.00,40.00,102060.00,True +E08000023,South Tyneside,ENGLAND,2434.43,45760.00,10470.00,8880.00,4940.00,1850.00,730.00,340.00,50.00,73020.00,True +E08000024,Sunderland,ENGLAND,2197.14,80320.00,20110.00,18370.00,10090.00,3780.00,1230.00,700.00,60.00,134660.00,True +E08000025,Birmingham,ENGLAND,2362.90,164600.00,132630.00,85230.00,44530.00,23130.00,9140.00,5960.00,930.00,466150.00,True +E08000026,Coventry,ENGLAND,2516.72,63820.00,44330.00,25210.00,10750.00,5230.00,2610.00,1490.00,190.00,153630.00,True +E08000027,Dudley,ENGLAND,2144.84,43610.00,40300.00,31110.00,16400.00,7150.00,2530.00,980.00,140.00,142220.00,True +E08000028,Sandwell,ENGLAND,2244.46,59230.00,44650.00,21640.00,7680.00,2990.00,550.00,70.00,40.00,136850.00,True +E08000029,Solihull,ENGLAND,2197.26,14590.00,12510.00,23390.00,17700.00,12200.00,9260.00,5820.00,490.00,95960.00,True +E08000030,Walsall,ENGLAND,2627.48,52370.00,27810.00,18930.00,10490.00,5680.00,2420.00,860.00,60.00,118620.00,True +E08000031,Wolverhampton,ENGLAND,2538.99,57530.00,25570.00,17660.00,7370.00,3150.00,1730.00,1000.00,130.00,114140.00,True +E08000032,Bradford,ENGLAND,2360.73,92730.00,46940.00,41630.00,19000.00,13330.00,6260.00,3820.00,330.00,224040.00,True +E08000033,Calderdale,ENGLAND,2420.15,44900.00,18530.00,16060.00,7730.00,5630.00,3150.00,1380.00,60.00,97440.00,True +E08000034,Kirklees,ENGLAND,2441.07,86120.00,35310.00,33310.00,17860.00,12720.00,5720.00,2330.00,170.00,193540.00,True +E08000035,Leeds,ENGLAND,2283.73,143230.00,80140.00,73400.00,38150.00,22930.00,10740.00,7490.00,760.00,376840.00,True +E08000036,Wakefield,ENGLAND,2296.89,79970.00,31330.00,24780.00,16330.00,8860.00,2600.00,1230.00,100.00,165200.00,True +E08000037,Gateshead,ENGLAND,2715.81,56090.00,13230.00,15950.00,6070.00,2780.00,900.00,390.00,50.00,95460.00,True +E09000001,City of London,ENGLAND,1329.56,,350.00,690.00,950.00,2890.00,1390.00,1500.00,310.00,8080.00,True +E09000002,Barking and Dagenham,ENGLAND,2198.51,6030.00,12420.00,50340.00,10770.00,1800.00,390.00,50.00,10.00,81810.00,True +E09000003,Barnet,ENGLAND,2132.60,3420.00,9570.00,32530.00,39640.00,33920.00,20370.00,16820.00,4350.00,160620.00,True +E09000004,Bexley,ENGLAND,2366.36,4350.00,11380.00,31230.00,28140.00,19550.00,5290.00,1750.00,50.00,101740.00,True +E09000005,Brent,ENGLAND,2235.27,6090.00,14040.00,41900.00,39340.00,23430.00,6590.00,3460.00,250.00,135100.00,True +E09000006,Bromley,ENGLAND,2140.04,2100.00,10590.00,30460.00,36460.00,29550.00,18580.00,14120.00,1750.00,143610.00,True +E09000007,Camden,ENGLAND,2207.55,3380.00,12270.00,20780.00,26560.00,19820.00,12950.00,13140.00,4940.00,113840.00,True +E09000008,Croydon,ENGLAND,2599.91,4450.00,24400.00,52850.00,42340.00,24140.00,11860.00,7520.00,660.00,168220.00,True +E09000009,Ealing,ENGLAND,2138.53,5200.00,14970.00,36980.00,48680.00,25200.00,10520.00,7200.00,1060.00,149810.00,True +E09000010,Enfield,ENGLAND,2267.67,5420.00,12400.00,35190.00,37170.00,21550.00,9590.00,6050.00,1020.00,128390.00,True +E09000011,Greenwich,ENGLAND,2107.86,10790.00,22200.00,45460.00,27100.00,12850.00,4010.00,2280.00,360.00,125050.00,True +E09000012,Hackney,ENGLAND,2060.30,8170.00,31670.00,35990.00,25200.00,13500.00,4950.00,1320.00,50.00,120850.00,True +E09000013,Hammersmith and Fulham,ENGLAND,1519.51,4120.00,6630.00,14510.00,25920.00,17400.00,11330.00,12270.00,2940.00,95120.00,True +E09000014,Haringey,ENGLAND,2313.78,7700.00,19400.00,36160.00,28640.00,11700.00,5540.00,4800.00,750.00,114690.00,True +E09000015,Harrow,ENGLAND,2511.07,840.00,4470.00,22800.00,30020.00,22620.00,8550.00,6220.00,1320.00,96840.00,True +E09000016,Havering,ENGLAND,2424.66,5300.00,11080.00,29790.00,36200.00,16040.00,6770.00,3140.00,380.00,108700.00,True +E09000017,Hillingdon,ENGLAND,2045.46,1270.00,6550.00,28300.00,47450.00,18810.00,10050.00,5340.00,490.00,118260.00,True +E09000018,Hounslow,ENGLAND,2185.56,2560.00,9560.00,30620.00,40720.00,16350.00,6370.00,4120.00,1030.00,111330.00,True +E09000019,Islington,ENGLAND,2108.15,4660.00,6180.00,29760.00,33560.00,19520.00,10380.00,7300.00,960.00,112320.00,True +E09000020,Kensington and Chelsea,ENGLAND,1666.65,1460.00,3310.00,9370.00,14110.00,13410.00,12210.00,19930.00,15480.00,89280.00,True +E09000021,Kingston upon Thames,ENGLAND,2609.20,630.00,3420.00,16020.00,21010.00,15050.00,8770.00,4460.00,1080.00,70440.00,True +E09000022,Lambeth,ENGLAND,2047.11,5020.00,33450.00,42330.00,33160.00,16550.00,10820.00,5960.00,1180.00,148470.00,True +E09000023,Lewisham,ENGLAND,2237.33,9280.00,36440.00,48040.00,27670.00,8060.00,2820.00,1360.00,190.00,133860.00,True +E09000024,Merton,ENGLAND,2146.76,1190.00,8590.00,24140.00,28360.00,13540.00,5940.00,4180.00,1850.00,87790.00,True +E09000025,Newham,ENGLAND,1944.23,5570.00,34340.00,56120.00,26900.00,7220.00,2210.00,240.00,40.00,132640.00,True +E09000026,Redbridge,ENGLAND,2294.58,2790.00,14100.00,27920.00,32140.00,19750.00,7820.00,3320.00,220.00,108060.00,True +E09000027,Richmond upon Thames,ENGLAND,2486.10,600.00,2180.00,13480.00,20700.00,19770.00,12160.00,13290.00,3640.00,85820.00,True +E09000028,Southwark,ENGLAND,1967.26,13220.00,38050.00,35710.00,28440.00,21540.00,7920.00,4590.00,830.00,150300.00,True +E09000029,Sutton,ENGLAND,2378.64,990.00,8050.00,28300.00,24800.00,12950.00,7110.00,3780.00,290.00,86270.00,True +E09000030,Tower Hamlets,ENGLAND,1837.78,4500.00,25040.00,40570.00,32250.00,27010.00,14280.00,5570.00,780.00,150000.00,True +E09000031,Waltham Forest,ENGLAND,2386.96,5230.00,32380.00,39150.00,23440.00,8390.00,1850.00,440.00,30.00,110910.00,True +E09000032,Wandsworth,ENGLAND,1028.21,6560.00,13280.00,37340.00,35080.00,26990.00,20450.00,15230.00,3040.00,157970.00,True +E09000033,Westminster,ENGLAND,1049.55,1660.00,6460.00,15690.00,23130.00,24460.00,19180.00,24500.00,17190.00,132270.00,True +N09000001,Antrim and Newtownabbey,NORTHERN_IRELAND,,,,,,,,,,,False +N09000002,"Armagh City, Banbridge and Craigavon",NORTHERN_IRELAND,,,,,,,,,,,False +N09000003,Belfast,NORTHERN_IRELAND,,,,,,,,,,,False +N09000004,Causeway Coast and Glens,NORTHERN_IRELAND,,,,,,,,,,,False +N09000005,Derry City and Strabane,NORTHERN_IRELAND,,,,,,,,,,,False +N09000006,Fermanagh and Omagh,NORTHERN_IRELAND,,,,,,,,,,,False +N09000007,Lisburn and Castlereagh,NORTHERN_IRELAND,,,,,,,,,,,False +N09000008,Mid and East Antrim,NORTHERN_IRELAND,,,,,,,,,,,False +N09000009,Mid Ulster,NORTHERN_IRELAND,,,,,,,,,,,False +N09000010,"Newry, Mourne and Down",NORTHERN_IRELAND,,,,,,,,,,,False +S12000005,Clackmannanshire,SCOTLAND,1594.38,,,,,,,,,,True +S12000006,Dumfries and Galloway,SCOTLAND,1454.98,,,,,,,,,,True +S12000008,East Ayrshire,SCOTLAND,1606.44,,,,,,,,,,True +S12000010,East Lothian,SCOTLAND,1579.18,,,,,,,,,,True +S12000011,East Renfrewshire,SCOTLAND,1528.44,,,,,,,,,,True +S12000013,Na h-Eileanan Siar,SCOTLAND,1387.56,,,,,,,,,,True +S12000014,Falkirk,SCOTLAND,1576.77,,,,,,,,,,True +S12000017,Highland,SCOTLAND,1527.09,,,,,,,,,,True +S12000018,Inverclyde,SCOTLAND,1551.30,,,,,,,,,,True +S12000019,Midlothian,SCOTLAND,1666.20,,,,,,,,,,True +S12000020,Moray,SCOTLAND,1573.76,,,,,,,,,,True +S12000021,North Ayrshire,SCOTLAND,1553.77,,,,,,,,,,True +S12000023,Orkney Islands,SCOTLAND,1574.60,,,,,,,,,,True +S12000026,Scottish Borders,SCOTLAND,1491.72,,,,,,,,,,True +S12000027,Shetland Islands,SCOTLAND,1386.67,,,,,,,,,,True +S12000028,South Ayrshire,SCOTLAND,1569.41,,,,,,,,,,True +S12000029,South Lanarkshire,SCOTLAND,1378.85,,,,,,,,,,True +S12000030,Stirling,SCOTLAND,1611.78,,,,,,,,,,True +S12000033,Aberdeen City,SCOTLAND,1636.27,,,,,,,,,,True +S12000034,Aberdeenshire,SCOTLAND,1532.76,,,,,,,,,,True +S12000035,Argyll and Bute,SCOTLAND,1625.64,,,,,,,,,,True +S12000036,City of Edinburgh,SCOTLAND,1563.51,,,,,,,,,,True +S12000038,Renfrewshire,SCOTLAND,1572.61,,,,,,,,,,True +S12000039,West Dunbartonshire,SCOTLAND,1559.86,,,,,,,,,,True +S12000040,West Lothian,SCOTLAND,1515.45,,,,,,,,,,True +S12000041,Angus,SCOTLAND,1461.52,,,,,,,,,,True +S12000042,Dundee City,SCOTLAND,1605.34,,,,,,,,,,True +S12000045,East Dunbartonshire,SCOTLAND,1599.70,,,,,,,,,,True +S12000047,Fife,SCOTLAND,1498.76,,,,,,,,,,True +S12000048,Perth and Kinross,SCOTLAND,1537.04,,,,,,,,,,True +S12000049,Glasgow City,SCOTLAND,1611.00,,,,,,,,,,True +S12000050,North Lanarkshire,SCOTLAND,1452.86,,,,,,,,,,True +W06000001,Isle of Anglesey,WALES,2260.73,4960.00,6930.00,7210.00,7400.00,5540.00,2770.00,1080.00,170.00,36060.00,True +W06000002,Gwynedd,WALES,2468.77,9310.00,15800.00,12700.00,10720.00,8300.00,4030.00,1280.00,210.00,62350.00,True +W06000003,Conwy,WALES,2472.82,5460.00,8340.00,15610.00,11970.00,9300.00,5120.00,1940.00,430.00,58170.00,True +W06000004,Denbighshire,WALES,2339.03,4160.00,7420.00,14970.00,8050.00,5660.00,3920.00,2060.00,320.00,46560.00,True +W06000005,Flintshire,WALES,2376.17,4520.00,9640.00,20990.00,13400.00,11140.00,7830.00,3230.00,600.00,71350.00,True +W06000006,Wrexham,WALES,2308.88,4510.00,12770.00,17250.00,10350.00,8270.00,5190.00,2570.00,720.00,61630.00,True +W06000008,Ceredigion,WALES,2419.45,1780.00,5000.00,7730.00,7570.00,9180.00,3890.00,980.00,110.00,36240.00,True +W06000009,Pembrokeshire,WALES,2166.15,6730.00,9460.00,14520.00,11520.00,12550.00,6070.00,2120.00,340.00,63310.00,True +W06000010,Carmarthenshire,WALES,2351.20,9370.00,24550.00,18930.00,14700.00,13440.00,6700.00,2260.00,300.00,90250.00,True +W06000011,Swansea,WALES,2238.29,17730.00,28650.00,25020.00,17330.00,13200.00,8180.00,3880.00,1200.00,115190.00,True +W06000012,Neath Port Talbot,WALES,2541.39,13830.00,27500.00,11720.00,7430.00,4580.00,1530.00,540.00,110.00,67240.00,True +W06000013,Bridgend,WALES,2477.99,10600.00,15370.00,14840.00,11050.00,8020.00,4480.00,1510.00,300.00,66170.00,True +W06000014,Vale of Glamorgan,WALES,2231.54,1510.00,6680.00,14520.00,11910.00,10790.00,7740.00,5920.00,2270.00,61340.00,True +W06000015,Cardiff,WALES,2013.18,5320.00,20420.00,34920.00,37370.00,31540.00,22250.00,10590.00,2850.00,165260.00,True +W06000016,Rhondda Cynon Taf,WALES,2289.43,47080.00,25500.00,17510.00,9660.00,7140.00,3520.00,1190.00,200.00,111800.00,True +W06000018,Caerphilly,WALES,2082.88,15550.00,26890.00,18930.00,9540.00,6840.00,2430.00,840.00,90.00,81110.00,True +W06000019,Blaenau Gwent,WALES,2531.26,19200.00,8160.00,2730.00,1810.00,900.00,350.00,60.00,,33210.00,True +W06000020,Torfaen,WALES,2155.68,6300.00,13120.00,12050.00,4350.00,4330.00,2410.00,690.00,70.00,43320.00,True +W06000021,Monmouthshire,WALES,2416.50,520.00,3450.00,7140.00,9460.00,7660.00,8100.00,5520.00,1790.00,43640.00,True +W06000022,Newport,WALES,2088.48,6910.00,15400.00,18470.00,12990.00,8560.00,6090.00,2710.00,560.00,71690.00,True +W06000023,Powys,WALES,2351.72,6090.00,9440.00,13330.00,10630.00,12660.00,9740.00,4180.00,580.00,66650.00,True +W06000024,Merthyr Tydfil,WALES,2593.60,14150.00,6680.00,2270.00,2210.00,1560.00,580.00,160.00,,27610.00,True diff --git a/policyengine_uk_data/targets/sources/la_council_tax.py b/policyengine_uk_data/targets/sources/la_council_tax.py new file mode 100644 index 000000000..d063116b0 --- /dev/null +++ b/policyengine_uk_data/targets/sources/la_council_tax.py @@ -0,0 +1,161 @@ +"""Local-authority council tax calibration targets. + +Produces two kinds of LA-level calibration target from public data: + +- ``ons/council_tax_band_d/{code}``: the average Band D council tax + (inclusive of all precepts) each household pays in billing authority + ``code``. Sourced from MHCLG, Welsh Government and Scottish + Government annual publications. +- ``ons/council_tax_band_count/{code}/{band}``: the number of dwellings + in band ``A``–``H`` for billing authority ``code``. Sourced from the + VOA *Council Tax: Stock of Properties* summary tables (England + Wales). + +Data for all 360 LAs in ``local_authorities_2021.csv`` is joined from +the committed canonical file ``storage/la_council_tax.csv``. Rows where +a source did not provide a value are emitted as targets with ``NaN`` +filtered out of the ``values`` dict, so calibrators that look up a +given year / area safely skip them. + +Known coverage gaps (documented, not bugs): + +- Northern Ireland is excluded because its domestic rates system is + distinct from council tax. +- Band-count rows for Scottish LAs are absent because the VOA summary + tables do not cover Scotland; Scottish Assessors publishes + per-LA chargeable-dwellings data separately and is a follow-up. +- City of London has Band A suppressed by VOA for disclosure control; + its other bands are populated. + +Sources: +- MHCLG *Council Tax levels set by local authorities in England 2026-27* + https://www.gov.uk/government/statistics/council-tax-levels-set-by-local-authorities-in-england-2026-to-2027 +- Welsh Government *Council Tax levels: April 2026 to March 2027* + https://www.gov.wales/council-tax-levels-april-2026-march-2027-html +- Scottish Government *Council Tax Assumptions 2025* (CT by Band, 2025-26) + https://www.gov.scot/publications/council-tax-datasets/ +- VOA *Council Tax: Stock of Properties, 2025* + https://www.gov.uk/government/statistics/council-tax-stock-of-properties-2025 +""" + +from __future__ import annotations + +import pandas as pd + +from policyengine_uk_data.targets.schema import ( + GeographicLevel, + Target, + Unit, +) +from policyengine_uk_data.targets.sources._common import STORAGE + + +_CSV_NAME = "la_council_tax.csv" + +# Latest fiscal years covered by each source. The LA Band D amounts are +# structurally single-year snapshots; callers that need longer time +# series should uprate via the existing council-tax uprating index. +_YEAR_BAND_D_ENGLAND = 2026 +_YEAR_BAND_D_WALES = 2026 +_YEAR_BAND_D_SCOTLAND = 2025 +_YEAR_BAND_COUNT = 2025 + +_BAND_COUNT_COLUMNS = { + "A": "band_A", + "B": "band_B", + "C": "band_C", + "D": "band_D_count", + "E": "band_E", + "F": "band_F", + "G": "band_G", + "H": "band_H", +} + +_ENGLAND_REF = ( + "https://www.gov.uk/government/statistics/" + "council-tax-levels-set-by-local-authorities-in-england-2026-to-2027" +) +_WALES_REF = "https://www.gov.wales/council-tax-levels-april-2026-march-2027-html" +_SCOTLAND_REF = "https://www.gov.scot/publications/council-tax-datasets/" +_VOA_REF = ( + "https://www.gov.uk/government/statistics/council-tax-stock-of-properties-2025" +) + + +def _load_table() -> pd.DataFrame | None: + """Return the committed LA council-tax table, or ``None`` if missing.""" + csv_path = STORAGE / _CSV_NAME + if not csv_path.exists(): + return None + return pd.read_csv(csv_path) + + +def _year_for_band_d(country: str) -> int: + if country == "WALES": + return _YEAR_BAND_D_WALES + if country == "SCOTLAND": + return _YEAR_BAND_D_SCOTLAND + return _YEAR_BAND_D_ENGLAND + + +def _ref_for_band_d(country: str) -> str: + if country == "WALES": + return _WALES_REF + if country == "SCOTLAND": + return _SCOTLAND_REF + return _ENGLAND_REF + + +def get_targets() -> list[Target]: + """Emit LA-level Band D amount + band-count targets.""" + df = _load_table() + if df is None or df.empty: + return [] + + targets: list[Target] = [] + + # Band D amount targets — one per LA with a reported value. + for _, row in df.iterrows(): + amount = row.get("band_d_amount") + if pd.isna(amount): + continue + code = str(row["code"]) + country = str(row["country"]) + targets.append( + Target( + name=f"ons/council_tax_band_d/{code}", + variable="council_tax_band_d_amount", + source="ons", + unit=Unit.GBP, + geographic_level=GeographicLevel.LOCAL_AUTHORITY, + geo_code=code, + geo_name=str(row["name"]), + values={_year_for_band_d(country): float(amount)}, + reference_url=_ref_for_band_d(country), + ) + ) + + # Band count targets — one per (LA, band) where VOA has a value. + for _, row in df.iterrows(): + code = str(row["code"]) + name = str(row["name"]) + for band, col in _BAND_COUNT_COLUMNS.items(): + count = row.get(col) + if pd.isna(count): + continue + targets.append( + Target( + name=f"ons/council_tax_band_count/{code}/{band}", + variable="council_tax_band_count", + source="voa", + unit=Unit.COUNT, + geographic_level=GeographicLevel.LOCAL_AUTHORITY, + geo_code=code, + geo_name=name, + values={_YEAR_BAND_COUNT: float(count)}, + is_count=True, + breakdown_variable=f"council_tax_band_{band}", + reference_url=_VOA_REF, + ) + ) + + return targets diff --git a/policyengine_uk_data/tests/test_la_council_tax_targets.py b/policyengine_uk_data/tests/test_la_council_tax_targets.py new file mode 100644 index 000000000..c49fbb064 --- /dev/null +++ b/policyengine_uk_data/tests/test_la_council_tax_targets.py @@ -0,0 +1,259 @@ +"""Tests for LA-level council-tax targets. + +Covers both the canonical CSV (``storage/la_council_tax.csv``) and the +``get_targets`` module output. Includes bound checks to guard against +the kind of outlier that slipped into #371 (Isles of Scilly household +count inflated 2000x by a silently leaked national-fallback). +""" + +from __future__ import annotations + +import pandas as pd +import pytest + +from policyengine_uk_data.targets.schema import GeographicLevel, Unit +from policyengine_uk_data.targets.sources._common import STORAGE +from policyengine_uk_data.targets.sources.la_council_tax import ( + _BAND_COUNT_COLUMNS, + get_targets, +) + + +_CSV_NAME = "la_council_tax.csv" +_REFERENCE_LIST = "local_authorities_2021.csv" + + +@pytest.fixture(scope="module") +def la_ct_df() -> pd.DataFrame: + path = STORAGE / _CSV_NAME + if not path.exists(): + pytest.skip(f"{path} not present in this checkout") + return pd.read_csv(path) + + +@pytest.fixture(scope="module") +def la_reference() -> pd.DataFrame: + return pd.read_csv(STORAGE / _REFERENCE_LIST) + + +# -- CSV structure --------------------------------------------------------- + + +def test_csv_row_count_matches_local_authorities(la_ct_df, la_reference): + assert len(la_ct_df) == len(la_reference), ( + f"la_council_tax.csv has {len(la_ct_df)} rows but " + f"local_authorities_2021.csv has {len(la_reference)}." + ) + + +def test_csv_has_every_expected_column(la_ct_df): + expected = { + "code", + "name", + "country", + "band_d_amount", + "has_council_tax", + "band_A", + "band_B", + "band_C", + "band_D_count", + "band_E", + "band_F", + "band_G", + "band_H", + "total_dwellings", + } + assert expected.issubset(la_ct_df.columns), ( + f"Missing columns: {expected - set(la_ct_df.columns)}" + ) + + +def test_country_column_covers_four_uk_countries(la_ct_df): + assert set(la_ct_df["country"].unique()) == { + "ENGLAND", + "WALES", + "SCOTLAND", + "NORTHERN_IRELAND", + } + + +def test_every_code_matches_reference(la_ct_df, la_reference): + assert set(la_ct_df["code"]) == set(la_reference["code"]), ( + "LA codes in la_council_tax.csv differ from the reference list" + ) + + +# -- Value plausibility (the #371 lesson) ---------------------------------- + + +def test_band_d_amount_within_plausible_range(la_ct_df): + """Real UK Band D ranges from ~£1,000 (Westminster / Wandsworth) to + ~£3,000 (some parts of England). A 1000× outlier like the #371 IoS + households bug would blow through these bounds instantly. + """ + ok = la_ct_df.dropna(subset=["band_d_amount"]) + assert ok["band_d_amount"].between(900, 3_500).all(), ( + "Band D amount outliers: " + f"{ok.loc[~ok['band_d_amount'].between(900, 3_500), ['code', 'name', 'band_d_amount']].to_dict('records')}" + ) + + +def test_total_dwellings_within_plausible_range(la_ct_df): + """Smallest UK billing authority (Isles of Scilly) has ~1,000 dwellings; + largest (Birmingham) has ~470,000. Anything outside [200, 800_000] + is a data-pipeline bug. + """ + ok = la_ct_df.dropna(subset=["total_dwellings"]) + assert ok["total_dwellings"].between(200, 800_000).all(), ( + "Total-dwelling outliers: " + f"{ok.loc[~ok['total_dwellings'].between(200, 800_000), ['code', 'name', 'total_dwellings']].to_dict('records')}" + ) + + +def test_isles_of_scilly_dwellings_are_thousands_not_millions(la_ct_df): + """Explicit regression test for the #371 Isles of Scilly bug. + + IoS had 2,492,115 households in #371's la_land_values.csv because a + national-total fallback leaked into one row. Real IoS has ~1,100 + dwellings. + """ + ios = la_ct_df[la_ct_df["code"] == "E06000053"] + assert len(ios) == 1 + total = float(ios["total_dwellings"].iloc[0]) + assert 500 <= total <= 5_000, ( + f"IoS total_dwellings = {total:.0f}; real figure is ~1,100" + ) + + +def test_band_counts_sum_to_total(la_ct_df): + """For rows with band data, Σ(bands A-H) should equal total_dwellings + (within rounding from the 10-property suppression at the lowest counts). + """ + have_bands = la_ct_df.dropna(subset=["total_dwellings"]).copy() + band_cols = list(_BAND_COUNT_COLUMNS.values()) + have_bands["sum_bands"] = have_bands[band_cols].fillna(0).sum(axis=1) + diff = (have_bands["total_dwellings"] - have_bands["sum_bands"]).abs() + # Allow up to 20 dwellings of slack for VOA rounding / suppression. + assert diff.max() <= 20, ( + f"Band totals disagree by up to {int(diff.max())}; worst rows: " + f"{have_bands.loc[diff == diff.max(), ['code', 'name', 'total_dwellings', 'sum_bands']].head(3).to_dict('records')}" + ) + + +# -- Country-level coverage expectations ----------------------------------- + + +def test_all_english_las_have_band_d(la_ct_df): + """Every English LA should have a Band D figure from DLUHC.""" + eng = la_ct_df[la_ct_df["country"] == "ENGLAND"] + missing = eng[eng["band_d_amount"].isna()][["code", "name"]].to_dict("records") + assert not missing, f"English LAs missing Band D: {missing}" + + +def test_all_welsh_las_have_band_d(la_ct_df): + wa = la_ct_df[la_ct_df["country"] == "WALES"] + missing = wa[wa["band_d_amount"].isna()][["code", "name"]].to_dict("records") + assert not missing, f"Welsh LAs missing Band D: {missing}" + + +def test_all_scottish_las_have_band_d(la_ct_df): + sc = la_ct_df[la_ct_df["country"] == "SCOTLAND"] + missing = sc[sc["band_d_amount"].isna()][["code", "name"]].to_dict("records") + assert not missing, f"Scottish LAs missing Band D: {missing}" + + +def test_northern_ireland_has_no_council_tax(la_ct_df): + """NI uses domestic rates, not council tax. The CSV must reflect that.""" + ni = la_ct_df[la_ct_df["country"] == "NORTHERN_IRELAND"] + assert (ni["has_council_tax"] == False).all() + assert ni["band_d_amount"].isna().all() + + +# -- Spot-check published values ------------------------------------------- + + +def test_wandsworth_and_westminster_are_lowest_in_england(la_ct_df): + """Well-known political fact: Wandsworth and Westminster have the + lowest Band D in the UK. Catches data-join mistakes that swap rows. + """ + eng = ( + la_ct_df[la_ct_df["country"] == "ENGLAND"] + .dropna(subset=["band_d_amount"]) + .sort_values("band_d_amount") + ) + lowest_two = set(eng.head(2)["code"].tolist()) + assert "E09000032" in lowest_two, ( + "Wandsworth (E09000032) should be in the bottom two" + ) + assert "E09000033" in lowest_two, ( + "Westminster (E09000033) should be in the bottom two" + ) + + +def test_scottish_band_d_is_lower_than_english_on_average(la_ct_df): + """Scotland's Band D is typically ~£1,500, well below England ~£2,400.""" + en_mean = la_ct_df[la_ct_df["country"] == "ENGLAND"]["band_d_amount"].mean() + sc_mean = la_ct_df[la_ct_df["country"] == "SCOTLAND"]["band_d_amount"].mean() + assert sc_mean < en_mean - 500 + + +# -- get_targets() output -------------------------------------------------- + + +def test_get_targets_runs_without_network(): + targets = get_targets() + assert targets, "Expected get_targets() to return a non-empty list" + + +def test_band_d_target_count_matches_csv(la_ct_df): + targets = get_targets() + band_d_targets = [t for t in targets if "council_tax_band_d/" in t.name] + expected = int(la_ct_df["band_d_amount"].notna().sum()) + assert len(band_d_targets) == expected + + +def test_band_count_target_count_matches_csv(la_ct_df): + targets = get_targets() + bc_targets = [t for t in targets if "council_tax_band_count/" in t.name] + # Expected = sum across all 8 bands of non-NaN counts. + expected = int(la_ct_df[list(_BAND_COUNT_COLUMNS.values())].notna().sum().sum()) + assert len(bc_targets) == expected + + +def test_every_target_carries_local_authority_geo_level(): + for target in get_targets(): + assert target.geographic_level == GeographicLevel.LOCAL_AUTHORITY + assert target.geo_code is not None + + +def test_band_d_targets_use_gbp_unit(): + for target in get_targets(): + if "council_tax_band_d/" in target.name: + assert target.unit == Unit.GBP + + +def test_band_count_targets_use_count_unit_and_is_count_flag(): + for target in get_targets(): + if "council_tax_band_count/" in target.name: + assert target.unit == Unit.COUNT + assert target.is_count is True + + +def test_every_target_has_at_least_one_value_year(): + for target in get_targets(): + assert target.values, f"Target {target.name} has no values" + + +def test_every_band_count_target_value_within_sensible_range(): + """No single band within one LA should exceed the largest LA's total + dwelling stock (Birmingham ≈ 470k). This catches a fallback-leak + where a national total leaked into a row, à la #371. + """ + for target in get_targets(): + if "council_tax_band_count/" not in target.name: + continue + for year, value in target.values.items(): + assert 0 <= value <= 500_000, ( + f"{target.name} has band count {value} in {year} — " + "out of plausible [0, 500k] range" + ) From d2d2acffcc7e3bef0d82b824adcd7984b86783cb Mon Sep 17 00:00:00 2001 From: Vahid Ahmadi Date: Thu, 23 Apr 2026 13:50:38 +0100 Subject: [PATCH 02/10] Address review: add Welsh Band I, source totals from VOA, tidy module MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Review points addressed: - Add count_band_I column to la_council_tax.csv, populated for all 22 Welsh LAs (Wales revalued in 2005 and introduced a 9th band). Cardiff 1480, Monmouthshire 670, Vale of Glamorgan 1060, etc. English rows keep Band I null; VOA marks it [z] (not applicable). - Re-source total_dwellings from VOA "All properties" column instead of deriving it as the sum of A-H. Previously Σ(A..H) was used for both sides of test_band_counts_sum_to_total, making the test self-referential; now it validates against the published total with a 20-property slack for VOA rounding. - Rename count columns symmetrically: band_A..band_H + band_D_count → count_band_A..count_band_I. Removes the lopsided band_D_count name that existed only to avoid clashing with band_d_amount. - Align band-count target names with voa_council_tax.py: voa/council_tax/{code}/{band} (was ons/council_tax_band_count/...); variable="council_tax_band" (was council_tax_band_count, which is not a real PolicyEngine-UK variable); drop breakdown_variable to match the regional VOA module. - Cache the CSV read with @lru_cache(maxsize=1), matching voa_council_tax. - Update module docstring: "A-H in England/Scotland, A-I in Wales". Tests: - New: test_welsh_las_have_band_i (all 22 Welsh LAs populated). - New: test_english_las_have_no_band_i (guard against spurious fills). - New: test_cardiff_band_i_matches_published_figure (~1,480 per VOA 2025). Final target counts: - 350 Band D amount targets (unchanged). - 2,563 band-count targets, up from 2,541: +22 Welsh Band I plus two band-H rows that were null due to the earlier truncation. --- .../storage/la_council_tax.csv | 722 +++++++++--------- .../targets/sources/la_council_tax.py | 35 +- .../tests/test_la_council_tax_targets.py | 63 +- 3 files changed, 425 insertions(+), 395 deletions(-) diff --git a/policyengine_uk_data/storage/la_council_tax.csv b/policyengine_uk_data/storage/la_council_tax.csv index 645906d0d..8c9739fa3 100644 --- a/policyengine_uk_data/storage/la_council_tax.csv +++ b/policyengine_uk_data/storage/la_council_tax.csv @@ -1,361 +1,361 @@ -code,name,country,band_d_amount,band_A,band_B,band_C,band_D_count,band_E,band_F,band_G,band_H,total_dwellings,has_council_tax -E06000001,Hartlepool,ENGLAND,2560.20,24090.00,7830.00,6780.00,3630.00,2070.00,930.00,700.00,110.00,46140.00,True -E06000002,Middlesbrough,ENGLAND,2549.16,33080.00,11550.00,11610.00,5620.00,2810.00,1040.00,600.00,50.00,66360.00,True -E06000003,Redcar and Cleveland,ENGLAND,2544.48,26840.00,13800.00,14820.00,6090.00,3610.00,1070.00,420.00,30.00,66680.00,True -E06000004,Stockton-on-Tees,ENGLAND,2589.83,34900.00,17560.00,16890.00,10400.00,6430.00,3000.00,1610.00,130.00,90920.00,True -E06000005,Darlington,ENGLAND,2493.83,23160.00,11180.00,7800.00,5950.00,3590.00,1400.00,680.00,50.00,53810.00,True -E06000006,Halton,ENGLAND,2366.61,27340.00,12760.00,8370.00,5230.00,3890.00,1270.00,360.00,40.00,59260.00,True -E06000007,Warrington,ENGLAND,2447.61,27780.00,21410.00,19980.00,12400.00,7960.00,4900.00,2730.00,230.00,97390.00,True -E06000008,Blackburn with Darwen,ENGLAND,2455.27,35860.00,9950.00,9010.00,4960.00,2780.00,840.00,580.00,70.00,64050.00,True -E06000009,Blackpool,ENGLAND,2513.22,32210.00,21330.00,11480.00,4860.00,1950.00,580.00,250.00,30.00,72690.00,True -E06000010,"Kingston upon Hull, City of",ENGLAND,2295.04,82540.00,24430.00,11440.00,4990.00,1410.00,320.00,60.00,40.00,125230.00,True -E06000011,East Riding of Yorkshire,ENGLAND,2466.08,40330.00,38430.00,33140.00,25660.00,17380.00,7740.00,3440.00,300.00,166420.00,True -E06000012,North East Lincolnshire,ENGLAND,2483.85,38690.00,18400.00,9390.00,5330.00,2520.00,980.00,510.00,60.00,75880.00,True -E06000013,North Lincolnshire,ENGLAND,2348.46,35920.00,16440.00,11580.00,7850.00,4020.00,1720.00,550.00,30.00,78110.00,True -E06000014,York,ENGLAND,2287.15,13150.00,25560.00,27300.00,13880.00,8030.00,3830.00,1930.00,140.00,93820.00,True -E06000015,Derby,ENGLAND,2306.00,58500.00,22270.00,17230.00,8900.00,4850.00,2340.00,710.00,50.00,114850.00,True -E06000016,Leicester,ENGLAND,2528.75,86990.00,28270.00,16960.00,7340.00,3570.00,1590.00,620.00,60.00,145400.00,True -E06000017,Rutland,ENGLAND,2737.58,1750.00,4890.00,3340.00,2570.00,2400.00,1690.00,1360.00,170.00,18170.00,True -E06000018,Nottingham,ENGLAND,2755.39,92180.00,25740.00,17180.00,7790.00,2660.00,1120.00,760.00,120.00,147550.00,True -E06000019,"Herefordshire, County of",ENGLAND,2574.37,14040.00,20630.00,17710.00,13820.00,12660.00,7680.00,3800.00,190.00,90530.00,True -E06000020,Telford and Wrekin,ENGLAND,2256.26,26960.00,22860.00,14900.00,10050.00,5870.00,2570.00,1210.00,60.00,84480.00,True -E06000021,Stoke-on-Trent,ENGLAND,2183.12,70450.00,25560.00,15880.00,5100.00,1980.00,560.00,200.00,40.00,119770.00,True -E06000022,Bath and North East Somerset,ENGLAND,2383.42,9370.00,19630.00,21290.00,14500.00,10460.00,5980.00,5210.00,460.00,86900.00,True -E06000023,"Bristol, City of",ENGLAND,2713.68,56890.00,76330.00,41320.00,19900.00,10120.00,4940.00,2900.00,360.00,212760.00,True -E06000024,North Somerset,ENGLAND,2491.22,13940.00,22140.00,23810.00,18060.00,13390.00,6880.00,3470.00,290.00,101980.00,True -E06000025,South Gloucestershire,ENGLAND,2550.59,14480.00,37160.00,30510.00,24250.00,13700.00,6630.00,2210.00,200.00,129140.00,True -E06000026,Plymouth,ENGLAND,2441.85,48160.00,33380.00,23670.00,10310.00,5250.00,1890.00,620.00,60.00,123340.00,True -E06000027,Torbay,ENGLAND,2470.25,13790.00,17850.00,17180.00,10750.00,5450.00,2420.00,1290.00,140.00,68870.00,True -E06000030,Swindon,ENGLAND,2438.10,15190.00,28070.00,25270.00,18530.00,9640.00,4020.00,1500.00,70.00,102290.00,True -E06000031,Peterborough,ENGLAND,2293.47,35930.00,22730.00,15460.00,9010.00,4930.00,2030.00,1070.00,80.00,91240.00,True -E06000032,Luton,ENGLAND,2439.93,21520.00,28100.00,22860.00,8000.00,3520.00,1130.00,290.00,30.00,85450.00,True -E06000033,Southend-on-Sea,ENGLAND,2265.17,17170.00,16180.00,24770.00,12900.00,6820.00,3710.00,1640.00,130.00,83320.00,True -E06000034,Thurrock,ENGLAND,2254.68,7540.00,14110.00,27720.00,12800.00,4860.00,2320.00,890.00,60.00,70300.00,True -E06000035,Medway,ENGLAND,2328.55,11470.00,38870.00,35530.00,19470.00,10230.00,4420.00,1560.00,60.00,121610.00,True -E06000036,Bracknell Forest,ENGLAND,2264.80,1650.00,5660.00,19880.00,10500.00,8670.00,5450.00,2690.00,310.00,54810.00,True -E06000037,West Berkshire,ENGLAND,2505.37,2750.00,7290.00,20500.00,17840.00,10950.00,7120.00,4880.00,780.00,72110.00,True -E06000038,Reading,ENGLAND,2612.77,7270.00,14990.00,31530.00,12220.00,5920.00,3390.00,1910.00,100.00,77330.00,True -E06000039,Slough,ENGLAND,2414.44,1560.00,10950.00,24390.00,13670.00,4700.00,1730.00,360.00,10.00,57370.00,True -E06000040,Windsor and Maidenhead,ENGLAND,1952.62,2140.00,4110.00,10700.00,16670.00,13590.00,8410.00,9970.00,2020.00,67610.00,True -E06000041,Wokingham,ENGLAND,2497.70,2030.00,4250.00,12130.00,21120.00,17040.00,11160.00,6830.00,570.00,75130.00,True -E06000042,Milton Keynes,ENGLAND,2372.21,18060.00,35810.00,32280.00,16440.00,13300.00,7180.00,3240.00,180.00,126490.00,True -E06000043,Brighton and Hove,ENGLAND,2580.54,30090.00,30490.00,35410.00,20470.00,11720.00,4830.00,2840.00,220.00,136070.00,True -E06000044,Portsmouth,ENGLAND,2291.71,27460.00,31800.00,22440.00,6280.00,3790.00,1660.00,660.00,60.00,94150.00,True -E06000045,Southampton,ENGLAND,2381.48,36920.00,35880.00,23760.00,9790.00,3200.00,1420.00,450.00,30.00,111450.00,True -E06000046,Isle of Wight,ENGLAND,2625.79,10650.00,18690.00,18000.00,13460.00,7340.00,3290.00,1570.00,150.00,73150.00,True -E06000047,County Durham,ENGLAND,2622.15,144190.00,36650.00,32590.00,23630.00,11500.00,4490.00,2310.00,280.00,255640.00,True -E06000049,Cheshire East,ENGLAND,2454.87,31710.00,39250.00,37540.00,28220.00,23520.00,15410.00,13130.00,2010.00,190790.00,True -E06000050,Cheshire West and Chester,ENGLAND,2517.33,35320.00,39140.00,33010.00,22530.00,17600.00,10540.00,8110.00,640.00,166890.00,True -E06000051,Shropshire,ENGLAND,2528.18,27440.00,38890.00,31760.00,22070.00,17630.00,9370.00,4830.00,360.00,152350.00,True -E06000052,Cornwall,ENGLAND,2590.93,66210.00,73220.00,61520.00,45030.00,26830.00,9650.00,4430.00,450.00,287340.00,True -E06000053,Isles of Scilly,ENGLAND,2047.96,10.00,40.00,110.00,270.00,330.00,270.00,130.00,10.00,1170.00,True -E06000054,Wiltshire,ENGLAND,2571.78,27030.00,42950.00,58820.00,41200.00,31680.00,18490.00,11570.00,1370.00,233110.00,True -E06000055,Bedford,ENGLAND,2471.74,10800.00,19080.00,20170.00,12480.00,8960.00,5790.00,3290.00,250.00,80820.00,True -E06000056,Central Bedfordshire,ENGLAND,2516.16,11290.00,25640.00,36860.00,26700.00,17800.00,10200.00,5700.00,410.00,134600.00,True -E06000057,Northumberland,ENGLAND,2596.94,70860.00,26550.00,21800.00,18410.00,12210.00,7600.00,4550.00,590.00,162570.00,True -E06000058,"Bournemouth, Christchurch and Poole",ENGLAND,2435.58,26730.00,34610.00,54390.00,36070.00,21890.00,9450.00,5820.00,1310.00,190270.00,True -E06000059,Dorset,ENGLAND,2765.02,20840.00,31970.00,43430.00,37400.00,28890.00,16160.00,8230.00,740.00,187660.00,True -E06000060,Buckinghamshire,ENGLAND,2526.58,6970.00,26310.00,54560.00,47150.00,36730.00,29170.00,31530.00,6160.00,238580.00,True -E06000061,North Northamptonshire,ENGLAND,2423.96,48480.00,42960.00,29500.00,18750.00,12750.00,5530.00,3060.00,280.00,161310.00,True -E06000062,West Northamptonshire,ENGLAND,2486.66,38700.00,41080.00,46110.00,24480.00,17970.00,10680.00,6520.00,490.00,186030.00,True -E06000063,Cumberland,ENGLAND,2511.32,64010.00,25940.00,20470.00,15630.00,8470.00,2980.00,980.00,80.00,138560.00,True -E06000064,Westmorland and Furness,ENGLAND,2507.99,29300.00,24520.00,23280.00,17770.00,12750.00,6480.00,3440.00,340.00,117880.00,True -E06000065,North Yorkshire,ENGLAND,2544.34,48920.00,65620.00,70150.00,46130.00,37890.00,22340.00,14070.00,1310.00,306430.00,True -E06000066,Somerset,ENGLAND,2560.59,43360.00,72220.00,59900.00,40390.00,31050.00,16940.00,7820.00,520.00,272200.00,True -E07000008,Cambridge,ENGLAND,2467.02,4420.00,11090.00,20890.00,10610.00,6060.00,3990.00,3270.00,510.00,60840.00,True -E07000009,East Cambridgeshire,ENGLAND,2485.18,5000.00,11670.00,8580.00,7610.00,5110.00,2460.00,820.00,90.00,41340.00,True -E07000010,Fenland,ENGLAND,2537.74,17450.00,13190.00,9030.00,4960.00,2520.00,710.00,190.00,30.00,48080.00,True -E07000011,Huntingdonshire,ENGLAND,2556.40,12600.00,21820.00,19420.00,12970.00,10360.00,4490.00,2010.00,180.00,83850.00,True -E07000012,South Cambridgeshire,ENGLAND,2536.25,2780.00,8620.00,22500.00,13830.00,12340.00,8670.00,4900.00,420.00,74060.00,True -E07000032,Amber Valley,ENGLAND,2407.69,22980.00,12960.00,11020.00,7050.00,3630.00,1940.00,1550.00,140.00,61270.00,True -E07000033,Bolsover,ENGLAND,2559.41,22440.00,6910.00,4880.00,3040.00,1150.00,350.00,150.00,20.00,38940.00,True -E07000034,Chesterfield,ENGLAND,2339.49,27100.00,10630.00,6530.00,4070.00,2150.00,620.00,220.00,30.00,51350.00,True -E07000035,Derbyshire Dales,ENGLAND,2444.70,3680.00,7630.00,7720.00,5850.00,5290.00,3300.00,2170.00,140.00,35780.00,True -E07000036,Erewash,ENGLAND,2360.64,22010.00,14290.00,7900.00,5080.00,2430.00,920.00,530.00,40.00,53200.00,True -E07000037,High Peak,ENGLAND,2384.66,8670.00,13380.00,9510.00,5120.00,4100.00,2200.00,860.00,50.00,43890.00,True -E07000038,North East Derbyshire,ENGLAND,2466.57,19260.00,10030.00,8200.00,5700.00,3300.00,1630.00,900.00,70.00,49090.00,True -E07000039,South Derbyshire,ENGLAND,2339.61,11910.00,11780.00,9770.00,8370.00,5700.00,2430.00,1020.00,100.00,51080.00,True -E07000040,East Devon,ENGLAND,2595.46,6860.00,14150.00,17830.00,13670.00,11400.00,6700.00,4270.00,210.00,75090.00,True -E07000041,Exeter,ENGLAND,2495.36,13480.00,15450.00,14560.00,10030.00,4570.00,2220.00,1020.00,50.00,61380.00,True -E07000042,Mid Devon,ENGLAND,2656.41,6550.00,9380.00,7290.00,6700.00,5010.00,2640.00,980.00,60.00,38610.00,True -E07000043,North Devon,ENGLAND,2642.21,10450.00,11830.00,10620.00,8670.00,5100.00,2040.00,640.00,50.00,49400.00,True -E07000044,South Hams,ENGLAND,2615.22,5360.00,9100.00,9570.00,8500.00,7590.00,4140.00,3200.00,380.00,47840.00,True -E07000045,Teignbridge,ENGLAND,2643.12,9080.00,14740.00,14520.00,12280.00,8610.00,4110.00,2060.00,120.00,65520.00,True -E07000046,Torridge,ENGLAND,2601.42,8460.00,7500.00,7340.00,6150.00,3520.00,1210.00,390.00,30.00,34600.00,True -E07000047,West Devon,ENGLAND,2705.33,3640.00,6760.00,5760.00,4560.00,3710.00,1920.00,1050.00,80.00,27480.00,True -E07000061,Eastbourne,ENGLAND,2654.28,8870.00,13370.00,10980.00,8760.00,4600.00,2070.00,1130.00,90.00,49870.00,True -E07000062,Hastings,ENGLAND,2676.58,14990.00,12520.00,7810.00,5800.00,2350.00,860.00,200.00,40.00,44570.00,True -E07000063,Lewes,ENGLAND,2756.17,4510.00,6410.00,13850.00,10360.00,6260.00,3300.00,2420.00,250.00,47360.00,True -E07000064,Rother,ENGLAND,2700.95,5050.00,7420.00,10230.00,9430.00,7690.00,4110.00,2770.00,280.00,46980.00,True -E07000065,Wealden,ENGLAND,2728.43,4360.00,8470.00,17900.00,16070.00,12010.00,8130.00,7340.00,950.00,75230.00,True -E07000066,Basildon,ENGLAND,2327.24,9100.00,16310.00,24750.00,14900.00,7930.00,4900.00,2080.00,200.00,80170.00,True -E07000067,Braintree,ENGLAND,2280.34,6240.00,17650.00,20390.00,10900.00,8240.00,4990.00,2500.00,230.00,71140.00,True -E07000068,Brentwood,ENGLAND,2258.14,690.00,3080.00,6950.00,8900.00,6470.00,4620.00,4060.00,660.00,35430.00,True -E07000069,Castle Point,ENGLAND,2318.63,3370.00,6440.00,13880.00,8710.00,4480.00,1920.00,770.00,70.00,39640.00,True -E07000070,Chelmsford,ENGLAND,2300.18,5180.00,10960.00,23980.00,18540.00,11460.00,6610.00,4590.00,450.00,81770.00,True -E07000071,Colchester,ENGLAND,2282.85,9600.00,23120.00,21170.00,16230.00,9320.00,4310.00,2600.00,170.00,86520.00,True -E07000072,Epping Forest,ENGLAND,2277.21,2120.00,5220.00,12060.00,14210.00,10280.00,7130.00,6320.00,1260.00,58600.00,True -E07000073,Harlow,ENGLAND,2298.69,2620.00,8360.00,19630.00,5240.00,3070.00,1180.00,450.00,20.00,40570.00,True -E07000074,Maldon,ENGLAND,2328.37,2480.00,3980.00,8640.00,5690.00,4710.00,3180.00,1700.00,190.00,30570.00,True -E07000075,Rochford,ENGLAND,2363.48,1580.00,4080.00,12110.00,10890.00,5350.00,2800.00,1450.00,80.00,38340.00,True -E07000076,Tendring,ENGLAND,2269.63,13840.00,18040.00,22070.00,12380.00,6120.00,2160.00,980.00,90.00,75680.00,True -E07000077,Uttlesford,ENGLAND,2333.82,1430.00,4180.00,8770.00,8080.00,7610.00,5310.00,4960.00,460.00,40800.00,True -E07000078,Cheltenham,ENGLAND,2369.52,9990.00,13530.00,14150.00,9450.00,5270.00,2800.00,2210.00,150.00,57550.00,True -E07000079,Cotswold,ENGLAND,2391.65,3710.00,5430.00,11550.00,7770.00,6740.00,5310.00,4950.00,780.00,46240.00,True -E07000080,Forest of Dean,ENGLAND,2443.42,7210.00,10410.00,9230.00,6150.00,4670.00,2190.00,1040.00,80.00,40980.00,True -E07000081,Gloucester,ENGLAND,2355.84,17700.00,16980.00,14340.00,6110.00,3880.00,930.00,180.00,10.00,60130.00,True -E07000082,Stroud,ENGLAND,2491.36,7630.00,13050.00,13150.00,8640.00,7320.00,4230.00,2660.00,260.00,56940.00,True -E07000083,Tewkesbury,ENGLAND,2340.53,7060.00,7130.00,13060.00,6790.00,6070.00,3780.00,2130.00,210.00,46230.00,True -E07000084,Basingstoke and Deane,ENGLAND,2255.21,2620.00,13300.00,28100.00,15490.00,11350.00,6790.00,3570.00,460.00,81680.00,True -E07000085,East Hampshire,ENGLAND,2343.92,3080.00,6360.00,13430.00,11590.00,9270.00,6950.00,5160.00,670.00,56510.00,True -E07000086,Eastleigh,ENGLAND,2342.21,4710.00,12600.00,19810.00,11260.00,8190.00,3510.00,1210.00,30.00,61320.00,True -E07000087,Fareham,ENGLAND,2270.55,3640.00,7390.00,15710.00,10880.00,8130.00,3720.00,1530.00,140.00,51140.00,True -E07000088,Gosport,ENGLAND,2344.29,6170.00,13380.00,9230.00,5170.00,2010.00,1570.00,330.00,20.00,37880.00,True -E07000089,Hart,ENGLAND,2400.02,780.00,2600.00,10120.00,9720.00,8280.00,7220.00,4050.00,260.00,43030.00,True -E07000090,Havant,ENGLAND,2320.28,8610.00,14860.00,13770.00,10550.00,5950.00,2590.00,990.00,50.00,57370.00,True -E07000091,New Forest,ENGLAND,2419.76,7330.00,12250.00,18260.00,19460.00,13700.00,7220.00,4700.00,620.00,83540.00,True -E07000092,Rushmoor,ENGLAND,2320.28,1500.00,9090.00,16950.00,9310.00,4250.00,1320.00,330.00,20.00,42770.00,True -E07000093,Test Valley,ENGLAND,2305.52,3120.00,10040.00,15600.00,11420.00,8800.00,5320.00,3950.00,560.00,58810.00,True -E07000094,Winchester,ENGLAND,2359.76,3050.00,7530.00,13750.00,11310.00,9190.00,7180.00,6020.00,750.00,58780.00,True -E07000095,Broxbourne,ENGLAND,2306.43,590.00,3820.00,9960.00,14530.00,7880.00,3010.00,2350.00,230.00,42370.00,True -E07000096,Dacorum,ENGLAND,2408.51,1240.00,8300.00,20760.00,16240.00,9420.00,5860.00,5260.00,850.00,67930.00,True -E07000098,Hertsmere,ENGLAND,2405.83,820.00,3090.00,7450.00,14980.00,8990.00,4640.00,4750.00,1230.00,45950.00,True -E07000099,North Hertfordshire,ENGLAND,2448.52,3450.00,9440.00,20320.00,10450.00,7490.00,4900.00,3630.00,360.00,60040.00,True -E07000102,Three Rivers,ENGLAND,2422.31,890.00,2430.00,6980.00,10030.00,7560.00,4470.00,5170.00,1630.00,39160.00,True -E07000103,Watford,ENGLAND,2446.70,470.00,4490.00,16000.00,14260.00,3890.00,2220.00,1930.00,80.00,43340.00,True -E07000105,Ashford,ENGLAND,2410.16,4380.00,13910.00,13710.00,10220.00,7120.00,6220.00,3570.00,220.00,59350.00,True -E07000106,Canterbury,ENGLAND,2419.33,7760.00,14100.00,21250.00,14160.00,7950.00,4210.00,2320.00,120.00,71870.00,True -E07000107,Dartford,ENGLAND,2375.15,1750.00,6830.00,15370.00,14590.00,7750.00,3030.00,1120.00,70.00,50510.00,True -E07000108,Dover,ENGLAND,2461.74,7300.00,17350.00,14600.00,7750.00,4650.00,2580.00,1590.00,80.00,55900.00,True -E07000109,Gravesham,ENGLAND,2408.24,3680.00,7050.00,15260.00,10970.00,4780.00,2130.00,1100.00,110.00,45080.00,True -E07000110,Maidstone,ENGLAND,2502.59,4520.00,9570.00,21210.00,20600.00,10980.00,6610.00,4720.00,390.00,78600.00,True -E07000111,Sevenoaks,ENGLAND,2522.36,1910.00,3480.00,11660.00,12160.00,7730.00,6170.00,7990.00,1550.00,52650.00,True -E07000112,Folkestone and Hythe,ENGLAND,2538.75,7190.00,13030.00,14680.00,8720.00,5280.00,2790.00,1980.00,100.00,53770.00,True -E07000113,Swale,ENGLAND,2405.65,10400.00,16590.00,17920.00,12190.00,6130.00,2820.00,1310.00,120.00,67480.00,True -E07000114,Thanet,ENGLAND,2490.90,16400.00,20220.00,18390.00,8250.00,4210.00,1660.00,840.00,40.00,70010.00,True -E07000115,Tonbridge and Malling,ENGLAND,2471.83,1770.00,4080.00,16220.00,14410.00,9650.00,5570.00,5100.00,470.00,57270.00,True -E07000116,Tunbridge Wells,ENGLAND,2446.15,3500.00,5440.00,14220.00,11090.00,7180.00,5240.00,5620.00,620.00,52910.00,True -E07000117,Burnley,ENGLAND,2549.42,25800.00,5850.00,6530.00,3080.00,1350.00,340.00,130.00,20.00,43100.00,True -E07000118,Chorley,ENGLAND,2430.23,15200.00,12200.00,9810.00,7020.00,5490.00,2390.00,1050.00,70.00,53230.00,True -E07000119,Fylde,ENGLAND,2483.94,7180.00,7030.00,9690.00,7560.00,5420.00,2960.00,1690.00,140.00,41670.00,True -E07000120,Hyndburn,ENGLAND,2465.98,21980.00,5870.00,5900.00,2870.00,870.00,280.00,170.00,10.00,37950.00,True -E07000121,Lancaster,ENGLAND,2503.19,23600.00,16510.00,12830.00,6740.00,4270.00,2130.00,870.00,80.00,67030.00,True -E07000122,Pendle,ENGLAND,2640.18,25170.00,4850.00,4640.00,3500.00,1890.00,1030.00,550.00,40.00,41670.00,True -E07000123,Preston,ENGLAND,2575.74,31000.00,13610.00,11260.00,7490.00,3750.00,2130.00,1080.00,70.00,70390.00,True -E07000124,Ribble Valley,ENGLAND,2386.50,3900.00,5620.00,5810.00,5100.00,4310.00,2680.00,2050.00,240.00,29710.00,True -E07000125,Rossendale,ENGLAND,2519.97,16480.00,5250.00,4430.00,3460.00,2040.00,720.00,470.00,40.00,32890.00,True -E07000126,South Ribble,ENGLAND,2442.66,10130.00,13620.00,13130.00,8660.00,4510.00,1770.00,610.00,30.00,52460.00,True -E07000127,West Lancashire,ENGLAND,2456.23,14980.00,9760.00,10530.00,7650.00,5430.00,2690.00,1700.00,110.00,52850.00,True -E07000128,Wyre,ENGLAND,2460.53,12060.00,12580.00,13420.00,7900.00,6050.00,2760.00,1150.00,80.00,56000.00,True -E07000129,Blaby,ENGLAND,2490.22,5040.00,15700.00,10280.00,6940.00,4640.00,1660.00,550.00,40.00,44850.00,True -E07000130,Charnwood,ENGLAND,2405.64,13340.00,22020.00,19430.00,11510.00,7600.00,3430.00,2070.00,230.00,79630.00,True -E07000131,Harborough,ENGLAND,2389.87,4750.00,9770.00,8640.00,7110.00,7400.00,4120.00,2840.00,260.00,44890.00,True -E07000132,Hinckley and Bosworth,ENGLAND,2382.62,8930.00,16590.00,11540.00,7590.00,4630.00,2350.00,1160.00,70.00,52860.00,True -E07000133,Melton,ENGLAND,2429.67,3700.00,7790.00,4100.00,4050.00,2690.00,1640.00,1050.00,90.00,25110.00,True -E07000134,North West Leicestershire,ENGLAND,2418.20,10270.00,14790.00,8280.00,7300.00,5420.00,2050.00,990.00,60.00,49160.00,True -E07000135,Oadby and Wigston,ENGLAND,2406.85,4150.00,6340.00,7340.00,3290.00,2200.00,650.00,490.00,90.00,24550.00,True -E07000136,Boston,ENGLAND,2308.73,15550.00,6610.00,6240.00,2390.00,880.00,240.00,80.00,20.00,32010.00,True -E07000137,East Lindsey,ENGLAND,2275.88,28110.00,15500.00,16290.00,6970.00,3790.00,1490.00,610.00,60.00,72820.00,True -E07000138,Lincoln,ENGLAND,2323.08,28930.00,9140.00,4950.00,2570.00,1440.00,530.00,140.00,40.00,47740.00,True -E07000139,North Kesteven,ENGLAND,2337.81,14220.00,14110.00,13430.00,7480.00,3840.00,1680.00,430.00,60.00,55250.00,True -E07000140,South Holland,ENGLAND,2278.20,16760.00,9810.00,10700.00,4790.00,2150.00,450.00,120.00,20.00,44800.00,True -E07000141,South Kesteven,ENGLAND,2260.00,20100.00,15530.00,11790.00,9650.00,6080.00,3130.00,1130.00,110.00,67520.00,True -E07000142,West Lindsey,ENGLAND,2354.25,17270.00,8670.00,8200.00,6290.00,3970.00,1690.00,550.00,70.00,46710.00,True -E07000143,Breckland,ENGLAND,2443.67,16260.00,18480.00,14810.00,8550.00,5040.00,1910.00,830.00,60.00,65940.00,True -E07000144,Broadland,ENGLAND,2437.78,5060.00,16080.00,21850.00,10660.00,5650.00,2370.00,880.00,100.00,62650.00,True -E07000145,Great Yarmouth,ENGLAND,2414.41,20910.00,12800.00,9080.00,4480.00,2020.00,640.00,260.00,20.00,50210.00,True -E07000146,King's Lynn and West Norfolk,ENGLAND,2430.13,24670.00,17970.00,13850.00,10010.00,5410.00,2790.00,1220.00,120.00,76040.00,True -E07000147,North Norfolk,ENGLAND,2459.93,12190.00,14640.00,11880.00,9220.00,5130.00,2460.00,1100.00,90.00,56710.00,True -E07000148,Norwich,ENGLAND,2503.44,28590.00,23800.00,9090.00,3760.00,2360.00,930.00,610.00,70.00,69210.00,True -E07000149,South Norfolk,ENGLAND,2482.87,7340.00,18430.00,16780.00,11990.00,7950.00,3400.00,1580.00,120.00,67590.00,True -E07000170,Ashfield,ENGLAND,2608.76,30290.00,11920.00,9110.00,4460.00,1560.00,520.00,130.00,30.00,58020.00,True -E07000171,Bassetlaw,ENGLAND,2644.95,28230.00,9040.00,7100.00,7070.00,3530.00,1720.00,740.00,60.00,57490.00,True -E07000172,Broxtowe,ENGLAND,2618.21,16870.00,13610.00,11200.00,6230.00,2840.00,840.00,510.00,30.00,52130.00,True -E07000173,Gedling,ENGLAND,2609.55,14900.00,15650.00,10760.00,7070.00,4390.00,1500.00,950.00,100.00,55320.00,True -E07000174,Mansfield,ENGLAND,2600.38,27850.00,9960.00,7030.00,4250.00,1770.00,470.00,210.00,30.00,51570.00,True -E07000175,Newark and Sherwood,ENGLAND,2682.10,24260.00,8980.00,9640.00,6640.00,4570.00,2810.00,1530.00,140.00,58570.00,True -E07000176,Rushcliffe,ENGLAND,2643.27,6420.00,11430.00,12090.00,10200.00,7720.00,4640.00,2720.00,150.00,55370.00,True -E07000177,Cherwell,ENGLAND,2582.96,6230.00,16680.00,19780.00,12700.00,9260.00,4490.00,2890.00,270.00,72300.00,True -E07000178,Oxford,ENGLAND,2678.40,2970.00,9890.00,19810.00,16320.00,7670.00,3140.00,3370.00,610.00,63780.00,True -E07000179,South Oxfordshire,ENGLAND,2597.57,2130.00,6070.00,18530.00,15260.00,10980.00,6810.00,6420.00,990.00,67190.00,True -E07000180,Vale of White Horse,ENGLAND,2577.44,1910.00,6870.00,19390.00,14150.00,10450.00,6620.00,4870.00,490.00,64750.00,True -E07000181,West Oxfordshire,ENGLAND,2566.95,1690.00,6220.00,17990.00,11950.00,7990.00,4640.00,3100.00,420.00,54000.00,True -E07000192,Cannock Chase,ENGLAND,2375.83,14120.00,14510.00,8860.00,5680.00,2000.00,660.00,280.00,20.00,46130.00,True -E07000193,East Staffordshire,ENGLAND,2351.34,18370.00,12310.00,9590.00,6790.00,5160.00,2660.00,1300.00,100.00,56280.00,True -E07000194,Lichfield,ENGLAND,2351.90,6010.00,11020.00,12460.00,7530.00,5140.00,4030.00,2730.00,430.00,49350.00,True -E07000195,Newcastle-under-Lyme,ENGLAND,2334.25,24990.00,10910.00,11780.00,4990.00,2910.00,1860.00,1020.00,50.00,58510.00,True -E07000196,South Staffordshire,ENGLAND,2313.67,6900.00,10910.00,12080.00,7570.00,5600.00,3610.00,2490.00,220.00,49380.00,True -E07000197,Stafford,ENGLAND,2302.68,12420.00,14480.00,14660.00,10060.00,7020.00,3780.00,1660.00,110.00,64190.00,True -E07000198,Staffordshire Moorlands,ENGLAND,2338.21,9660.00,10860.00,10880.00,6360.00,4560.00,2020.00,810.00,40.00,45190.00,True -E07000199,Tamworth,ENGLAND,2300.76,9530.00,12410.00,6180.00,4020.00,2210.00,600.00,130.00,10.00,35090.00,True -E07000200,Babergh,ENGLAND,2341.55,5220.00,12430.00,9280.00,7820.00,4880.00,2650.00,1800.00,200.00,44280.00,True -E07000202,Ipswich,ENGLAND,2468.25,19420.00,23220.00,11540.00,4510.00,2370.00,960.00,380.00,20.00,62420.00,True -E07000203,Mid Suffolk,ENGLAND,2316.88,5950.00,13510.00,11200.00,8080.00,6420.00,3390.00,1740.00,110.00,50400.00,True -E07000207,Elmbridge,ENGLAND,2557.75,460.00,1890.00,8180.00,14150.00,11310.00,8140.00,11460.00,4550.00,60140.00,True -E07000208,Epsom and Ewell,ENGLAND,2530.84,160.00,1270.00,5610.00,9290.00,7810.00,4830.00,4180.00,150.00,33300.00,True -E07000209,Guildford,ENGLAND,2547.30,2290.00,3550.00,12790.00,16940.00,10640.00,6920.00,7590.00,1860.00,62580.00,True -E07000210,Mole Valley,ENGLAND,2519.86,1690.00,2740.00,4520.00,8420.00,7240.00,6310.00,7830.00,1080.00,39830.00,True -E07000211,Reigate and Banstead,ENGLAND,2566.61,1230.00,4270.00,13130.00,18260.00,11660.00,7700.00,7540.00,1140.00,64930.00,True -E07000212,Runnymede,ENGLAND,2492.99,2500.00,1610.00,8040.00,11690.00,6950.00,4300.00,3230.00,1140.00,39460.00,True -E07000213,Spelthorne,ENGLAND,2526.44,460.00,1790.00,10140.00,15180.00,10110.00,4730.00,2200.00,120.00,44730.00,True -E07000214,Surrey Heath,ENGLAND,2585.16,740.00,2650.00,6380.00,10230.00,6900.00,5940.00,5330.00,540.00,38710.00,True -E07000215,Tandridge,ENGLAND,2594.85,940.00,2230.00,5440.00,9130.00,7870.00,4940.00,6400.00,1290.00,38240.00,True -E07000216,Waverley,ENGLAND,2604.87,1030.00,3480.00,10920.00,13590.00,10110.00,7380.00,8910.00,2180.00,57600.00,True -E07000217,Woking,ENGLAND,2598.04,340.00,3620.00,11320.00,12600.00,6360.00,4240.00,5260.00,830.00,44570.00,True -E07000218,North Warwickshire,ENGLAND,2532.10,6750.00,7510.00,6520.00,4060.00,2610.00,1420.00,790.00,80.00,29740.00,True -E07000219,Nuneaton and Bedworth,ENGLAND,2502.16,20960.00,13710.00,14700.00,7910.00,3180.00,870.00,200.00,20.00,61550.00,True -E07000220,Rugby,ENGLAND,2483.05,9090.00,12130.00,12530.00,7400.00,5280.00,3530.00,1910.00,110.00,51980.00,True -E07000221,Stratford-on-Avon,ENGLAND,2484.17,3850.00,8630.00,18950.00,11350.00,10780.00,6850.00,5980.00,1000.00,67390.00,True -E07000222,Warwick,ENGLAND,2461.55,5040.00,12630.00,18940.00,13730.00,8520.00,5700.00,4720.00,460.00,69740.00,True -E07000223,Adur,ENGLAND,2548.28,2780.00,5110.00,11580.00,6340.00,2050.00,760.00,340.00,10.00,28970.00,True -E07000224,Arun,ENGLAND,2487.24,8520.00,12990.00,21180.00,16680.00,10930.00,6350.00,2800.00,310.00,79760.00,True -E07000225,Chichester,ENGLAND,2469.68,3350.00,6540.00,15290.00,13040.00,9560.00,6440.00,6020.00,1360.00,61600.00,True -E07000226,Crawley,ENGLAND,2418.46,1300.00,7670.00,22570.00,9100.00,3820.00,2350.00,470.00,10.00,47290.00,True -E07000227,Horsham,ENGLAND,2441.01,2440.00,6790.00,14020.00,14410.00,11640.00,8560.00,8080.00,840.00,66780.00,True -E07000228,Mid Sussex,ENGLAND,2474.26,2340.00,7790.00,15320.00,17830.00,12370.00,9200.00,5050.00,450.00,70350.00,True -E07000229,Worthing,ENGLAND,2456.13,8370.00,11640.00,13190.00,9760.00,5610.00,2450.00,930.00,30.00,51980.00,True -E07000234,Bromsgrove,ENGLAND,2478.65,3950.00,7460.00,9350.00,8060.00,7220.00,3850.00,2920.00,380.00,43190.00,True -E07000235,Malvern Hills,ENGLAND,2450.92,4100.00,7690.00,8820.00,5980.00,5370.00,4150.00,2550.00,130.00,38790.00,True -E07000236,Redditch,ENGLAND,2462.95,8040.00,12220.00,7970.00,4490.00,3450.00,1290.00,480.00,20.00,37960.00,True -E07000237,Worcester,ENGLAND,2405.81,9010.00,15430.00,12030.00,5670.00,3590.00,1620.00,450.00,10.00,47810.00,True -E07000238,Wychavon,ENGLAND,2373.19,7180.00,12070.00,14580.00,8550.00,7890.00,6900.00,4850.00,230.00,62250.00,True -E07000239,Wyre Forest,ENGLAND,2512.47,11730.00,11960.00,12080.00,6540.00,3610.00,1800.00,1300.00,140.00,49160.00,True -E07000240,St Albans,ENGLAND,2419.22,880.00,3220.00,10530.00,16530.00,13100.00,9530.00,8270.00,1410.00,63470.00,True -E07000241,Welwyn Hatfield,ENGLAND,2452.26,1250.00,5850.00,16360.00,12550.00,5590.00,4500.00,3960.00,750.00,50810.00,True -E07000242,East Hertfordshire,ENGLAND,2454.78,1000.00,6460.00,16520.00,17010.00,12070.00,8140.00,5950.00,870.00,68020.00,True -E07000243,Stevenage,ENGLAND,2391.97,1700.00,6890.00,21760.00,3380.00,3280.00,980.00,430.00,20.00,38440.00,True -E07000244,East Suffolk,ENGLAND,2334.80,28230.00,31230.00,23810.00,18810.00,11760.00,5650.00,3070.00,250.00,122810.00,True -E07000245,West Suffolk,ENGLAND,2351.47,12730.00,29030.00,17370.00,12390.00,7410.00,3050.00,2100.00,200.00,84280.00,True -E08000001,Bolton,ENGLAND,2399.74,65640.00,22820.00,18990.00,11000.00,5820.00,2370.00,1930.00,250.00,128820.00,True -E08000002,Bury,ENGLAND,2555.15,30710.00,18680.00,17540.00,9380.00,5700.00,1900.00,1320.00,180.00,85410.00,True -E08000003,Manchester,ENGLAND,2312.04,137810.00,43100.00,38170.00,21260.00,7640.00,3400.00,1270.00,150.00,252800.00,True -E08000004,Oldham,ENGLAND,2602.23,51140.00,17700.00,16730.00,7310.00,3540.00,1630.00,940.00,80.00,99070.00,True -E08000005,Rochdale,ENGLAND,2600.83,51910.00,17400.00,13280.00,8260.00,4580.00,1710.00,900.00,50.00,98090.00,True -E08000006,Salford,ENGLAND,2594.45,63640.00,31220.00,22180.00,12350.00,3910.00,1490.00,880.00,110.00,135780.00,True -E08000007,Stockport,ENGLAND,2618.90,31820.00,29160.00,28940.00,19920.00,13320.00,6570.00,3620.00,230.00,133580.00,True -E08000008,Tameside,ENGLAND,2447.21,53040.00,19680.00,20250.00,7290.00,4000.00,950.00,450.00,40.00,105700.00,True -E08000009,Trafford,ENGLAND,2291.70,20050.00,23020.00,27720.00,15590.00,7940.00,4690.00,4230.00,1070.00,104310.00,True -E08000010,Wigan,ENGLAND,2152.68,68940.00,34800.00,25810.00,13480.00,7730.00,2030.00,650.00,60.00,153500.00,True -E08000011,Knowsley,ENGLAND,2488.25,38180.00,15340.00,10660.00,5000.00,2110.00,330.00,130.00,20.00,71770.00,True -E08000012,Liverpool,ENGLAND,2673.59,143680.00,44920.00,29870.00,14000.00,5140.00,2360.00,1760.00,150.00,241880.00,True -E08000013,St. Helens,ENGLAND,2403.38,37850.00,19360.00,15770.00,7030.00,3810.00,1690.00,600.00,40.00,86150.00,True -E08000014,Sefton,ENGLAND,2583.22,39990.00,28250.00,31380.00,15840.00,8930.00,3990.00,2740.00,290.00,131410.00,True -E08000015,Wirral,ENGLAND,2500.59,61080.00,33140.00,27740.00,13690.00,8580.00,4390.00,3220.00,290.00,152130.00,True -E08000016,Barnsley,ENGLAND,2325.96,65310.00,19340.00,14570.00,9790.00,4190.00,1630.00,710.00,60.00,115600.00,True -E08000017,Doncaster,ENGLAND,2167.75,82760.00,27200.00,16270.00,10220.00,4900.00,2280.00,980.00,140.00,144750.00,True -E08000018,Rotherham,ENGLAND,2381.53,64280.00,24200.00,16130.00,9790.00,5070.00,2010.00,810.00,70.00,122360.00,True -E08000019,Sheffield,ENGLAND,2510.16,152470.00,42460.00,33260.00,16910.00,9780.00,4420.00,2890.00,220.00,262410.00,True -E08000021,Newcastle upon Tyne,ENGLAND,2542.19,77750.00,21680.00,20520.00,10160.00,5940.00,2640.00,1930.00,140.00,140760.00,True -E08000022,North Tyneside,ENGLAND,2461.77,50580.00,16240.00,20200.00,8490.00,4540.00,1590.00,380.00,40.00,102060.00,True -E08000023,South Tyneside,ENGLAND,2434.43,45760.00,10470.00,8880.00,4940.00,1850.00,730.00,340.00,50.00,73020.00,True -E08000024,Sunderland,ENGLAND,2197.14,80320.00,20110.00,18370.00,10090.00,3780.00,1230.00,700.00,60.00,134660.00,True -E08000025,Birmingham,ENGLAND,2362.90,164600.00,132630.00,85230.00,44530.00,23130.00,9140.00,5960.00,930.00,466150.00,True -E08000026,Coventry,ENGLAND,2516.72,63820.00,44330.00,25210.00,10750.00,5230.00,2610.00,1490.00,190.00,153630.00,True -E08000027,Dudley,ENGLAND,2144.84,43610.00,40300.00,31110.00,16400.00,7150.00,2530.00,980.00,140.00,142220.00,True -E08000028,Sandwell,ENGLAND,2244.46,59230.00,44650.00,21640.00,7680.00,2990.00,550.00,70.00,40.00,136850.00,True -E08000029,Solihull,ENGLAND,2197.26,14590.00,12510.00,23390.00,17700.00,12200.00,9260.00,5820.00,490.00,95960.00,True -E08000030,Walsall,ENGLAND,2627.48,52370.00,27810.00,18930.00,10490.00,5680.00,2420.00,860.00,60.00,118620.00,True -E08000031,Wolverhampton,ENGLAND,2538.99,57530.00,25570.00,17660.00,7370.00,3150.00,1730.00,1000.00,130.00,114140.00,True -E08000032,Bradford,ENGLAND,2360.73,92730.00,46940.00,41630.00,19000.00,13330.00,6260.00,3820.00,330.00,224040.00,True -E08000033,Calderdale,ENGLAND,2420.15,44900.00,18530.00,16060.00,7730.00,5630.00,3150.00,1380.00,60.00,97440.00,True -E08000034,Kirklees,ENGLAND,2441.07,86120.00,35310.00,33310.00,17860.00,12720.00,5720.00,2330.00,170.00,193540.00,True -E08000035,Leeds,ENGLAND,2283.73,143230.00,80140.00,73400.00,38150.00,22930.00,10740.00,7490.00,760.00,376840.00,True -E08000036,Wakefield,ENGLAND,2296.89,79970.00,31330.00,24780.00,16330.00,8860.00,2600.00,1230.00,100.00,165200.00,True -E08000037,Gateshead,ENGLAND,2715.81,56090.00,13230.00,15950.00,6070.00,2780.00,900.00,390.00,50.00,95460.00,True -E09000001,City of London,ENGLAND,1329.56,,350.00,690.00,950.00,2890.00,1390.00,1500.00,310.00,8080.00,True -E09000002,Barking and Dagenham,ENGLAND,2198.51,6030.00,12420.00,50340.00,10770.00,1800.00,390.00,50.00,10.00,81810.00,True -E09000003,Barnet,ENGLAND,2132.60,3420.00,9570.00,32530.00,39640.00,33920.00,20370.00,16820.00,4350.00,160620.00,True -E09000004,Bexley,ENGLAND,2366.36,4350.00,11380.00,31230.00,28140.00,19550.00,5290.00,1750.00,50.00,101740.00,True -E09000005,Brent,ENGLAND,2235.27,6090.00,14040.00,41900.00,39340.00,23430.00,6590.00,3460.00,250.00,135100.00,True -E09000006,Bromley,ENGLAND,2140.04,2100.00,10590.00,30460.00,36460.00,29550.00,18580.00,14120.00,1750.00,143610.00,True -E09000007,Camden,ENGLAND,2207.55,3380.00,12270.00,20780.00,26560.00,19820.00,12950.00,13140.00,4940.00,113840.00,True -E09000008,Croydon,ENGLAND,2599.91,4450.00,24400.00,52850.00,42340.00,24140.00,11860.00,7520.00,660.00,168220.00,True -E09000009,Ealing,ENGLAND,2138.53,5200.00,14970.00,36980.00,48680.00,25200.00,10520.00,7200.00,1060.00,149810.00,True -E09000010,Enfield,ENGLAND,2267.67,5420.00,12400.00,35190.00,37170.00,21550.00,9590.00,6050.00,1020.00,128390.00,True -E09000011,Greenwich,ENGLAND,2107.86,10790.00,22200.00,45460.00,27100.00,12850.00,4010.00,2280.00,360.00,125050.00,True -E09000012,Hackney,ENGLAND,2060.30,8170.00,31670.00,35990.00,25200.00,13500.00,4950.00,1320.00,50.00,120850.00,True -E09000013,Hammersmith and Fulham,ENGLAND,1519.51,4120.00,6630.00,14510.00,25920.00,17400.00,11330.00,12270.00,2940.00,95120.00,True -E09000014,Haringey,ENGLAND,2313.78,7700.00,19400.00,36160.00,28640.00,11700.00,5540.00,4800.00,750.00,114690.00,True -E09000015,Harrow,ENGLAND,2511.07,840.00,4470.00,22800.00,30020.00,22620.00,8550.00,6220.00,1320.00,96840.00,True -E09000016,Havering,ENGLAND,2424.66,5300.00,11080.00,29790.00,36200.00,16040.00,6770.00,3140.00,380.00,108700.00,True -E09000017,Hillingdon,ENGLAND,2045.46,1270.00,6550.00,28300.00,47450.00,18810.00,10050.00,5340.00,490.00,118260.00,True -E09000018,Hounslow,ENGLAND,2185.56,2560.00,9560.00,30620.00,40720.00,16350.00,6370.00,4120.00,1030.00,111330.00,True -E09000019,Islington,ENGLAND,2108.15,4660.00,6180.00,29760.00,33560.00,19520.00,10380.00,7300.00,960.00,112320.00,True -E09000020,Kensington and Chelsea,ENGLAND,1666.65,1460.00,3310.00,9370.00,14110.00,13410.00,12210.00,19930.00,15480.00,89280.00,True -E09000021,Kingston upon Thames,ENGLAND,2609.20,630.00,3420.00,16020.00,21010.00,15050.00,8770.00,4460.00,1080.00,70440.00,True -E09000022,Lambeth,ENGLAND,2047.11,5020.00,33450.00,42330.00,33160.00,16550.00,10820.00,5960.00,1180.00,148470.00,True -E09000023,Lewisham,ENGLAND,2237.33,9280.00,36440.00,48040.00,27670.00,8060.00,2820.00,1360.00,190.00,133860.00,True -E09000024,Merton,ENGLAND,2146.76,1190.00,8590.00,24140.00,28360.00,13540.00,5940.00,4180.00,1850.00,87790.00,True -E09000025,Newham,ENGLAND,1944.23,5570.00,34340.00,56120.00,26900.00,7220.00,2210.00,240.00,40.00,132640.00,True -E09000026,Redbridge,ENGLAND,2294.58,2790.00,14100.00,27920.00,32140.00,19750.00,7820.00,3320.00,220.00,108060.00,True -E09000027,Richmond upon Thames,ENGLAND,2486.10,600.00,2180.00,13480.00,20700.00,19770.00,12160.00,13290.00,3640.00,85820.00,True -E09000028,Southwark,ENGLAND,1967.26,13220.00,38050.00,35710.00,28440.00,21540.00,7920.00,4590.00,830.00,150300.00,True -E09000029,Sutton,ENGLAND,2378.64,990.00,8050.00,28300.00,24800.00,12950.00,7110.00,3780.00,290.00,86270.00,True -E09000030,Tower Hamlets,ENGLAND,1837.78,4500.00,25040.00,40570.00,32250.00,27010.00,14280.00,5570.00,780.00,150000.00,True -E09000031,Waltham Forest,ENGLAND,2386.96,5230.00,32380.00,39150.00,23440.00,8390.00,1850.00,440.00,30.00,110910.00,True -E09000032,Wandsworth,ENGLAND,1028.21,6560.00,13280.00,37340.00,35080.00,26990.00,20450.00,15230.00,3040.00,157970.00,True -E09000033,Westminster,ENGLAND,1049.55,1660.00,6460.00,15690.00,23130.00,24460.00,19180.00,24500.00,17190.00,132270.00,True -N09000001,Antrim and Newtownabbey,NORTHERN_IRELAND,,,,,,,,,,,False -N09000002,"Armagh City, Banbridge and Craigavon",NORTHERN_IRELAND,,,,,,,,,,,False -N09000003,Belfast,NORTHERN_IRELAND,,,,,,,,,,,False -N09000004,Causeway Coast and Glens,NORTHERN_IRELAND,,,,,,,,,,,False -N09000005,Derry City and Strabane,NORTHERN_IRELAND,,,,,,,,,,,False -N09000006,Fermanagh and Omagh,NORTHERN_IRELAND,,,,,,,,,,,False -N09000007,Lisburn and Castlereagh,NORTHERN_IRELAND,,,,,,,,,,,False -N09000008,Mid and East Antrim,NORTHERN_IRELAND,,,,,,,,,,,False -N09000009,Mid Ulster,NORTHERN_IRELAND,,,,,,,,,,,False -N09000010,"Newry, Mourne and Down",NORTHERN_IRELAND,,,,,,,,,,,False -S12000005,Clackmannanshire,SCOTLAND,1594.38,,,,,,,,,,True -S12000006,Dumfries and Galloway,SCOTLAND,1454.98,,,,,,,,,,True -S12000008,East Ayrshire,SCOTLAND,1606.44,,,,,,,,,,True -S12000010,East Lothian,SCOTLAND,1579.18,,,,,,,,,,True -S12000011,East Renfrewshire,SCOTLAND,1528.44,,,,,,,,,,True -S12000013,Na h-Eileanan Siar,SCOTLAND,1387.56,,,,,,,,,,True -S12000014,Falkirk,SCOTLAND,1576.77,,,,,,,,,,True -S12000017,Highland,SCOTLAND,1527.09,,,,,,,,,,True -S12000018,Inverclyde,SCOTLAND,1551.30,,,,,,,,,,True -S12000019,Midlothian,SCOTLAND,1666.20,,,,,,,,,,True -S12000020,Moray,SCOTLAND,1573.76,,,,,,,,,,True -S12000021,North Ayrshire,SCOTLAND,1553.77,,,,,,,,,,True -S12000023,Orkney Islands,SCOTLAND,1574.60,,,,,,,,,,True -S12000026,Scottish Borders,SCOTLAND,1491.72,,,,,,,,,,True -S12000027,Shetland Islands,SCOTLAND,1386.67,,,,,,,,,,True -S12000028,South Ayrshire,SCOTLAND,1569.41,,,,,,,,,,True -S12000029,South Lanarkshire,SCOTLAND,1378.85,,,,,,,,,,True -S12000030,Stirling,SCOTLAND,1611.78,,,,,,,,,,True -S12000033,Aberdeen City,SCOTLAND,1636.27,,,,,,,,,,True -S12000034,Aberdeenshire,SCOTLAND,1532.76,,,,,,,,,,True -S12000035,Argyll and Bute,SCOTLAND,1625.64,,,,,,,,,,True -S12000036,City of Edinburgh,SCOTLAND,1563.51,,,,,,,,,,True -S12000038,Renfrewshire,SCOTLAND,1572.61,,,,,,,,,,True -S12000039,West Dunbartonshire,SCOTLAND,1559.86,,,,,,,,,,True -S12000040,West Lothian,SCOTLAND,1515.45,,,,,,,,,,True -S12000041,Angus,SCOTLAND,1461.52,,,,,,,,,,True -S12000042,Dundee City,SCOTLAND,1605.34,,,,,,,,,,True -S12000045,East Dunbartonshire,SCOTLAND,1599.70,,,,,,,,,,True -S12000047,Fife,SCOTLAND,1498.76,,,,,,,,,,True -S12000048,Perth and Kinross,SCOTLAND,1537.04,,,,,,,,,,True -S12000049,Glasgow City,SCOTLAND,1611.00,,,,,,,,,,True -S12000050,North Lanarkshire,SCOTLAND,1452.86,,,,,,,,,,True -W06000001,Isle of Anglesey,WALES,2260.73,4960.00,6930.00,7210.00,7400.00,5540.00,2770.00,1080.00,170.00,36060.00,True -W06000002,Gwynedd,WALES,2468.77,9310.00,15800.00,12700.00,10720.00,8300.00,4030.00,1280.00,210.00,62350.00,True -W06000003,Conwy,WALES,2472.82,5460.00,8340.00,15610.00,11970.00,9300.00,5120.00,1940.00,430.00,58170.00,True -W06000004,Denbighshire,WALES,2339.03,4160.00,7420.00,14970.00,8050.00,5660.00,3920.00,2060.00,320.00,46560.00,True -W06000005,Flintshire,WALES,2376.17,4520.00,9640.00,20990.00,13400.00,11140.00,7830.00,3230.00,600.00,71350.00,True -W06000006,Wrexham,WALES,2308.88,4510.00,12770.00,17250.00,10350.00,8270.00,5190.00,2570.00,720.00,61630.00,True -W06000008,Ceredigion,WALES,2419.45,1780.00,5000.00,7730.00,7570.00,9180.00,3890.00,980.00,110.00,36240.00,True -W06000009,Pembrokeshire,WALES,2166.15,6730.00,9460.00,14520.00,11520.00,12550.00,6070.00,2120.00,340.00,63310.00,True -W06000010,Carmarthenshire,WALES,2351.20,9370.00,24550.00,18930.00,14700.00,13440.00,6700.00,2260.00,300.00,90250.00,True -W06000011,Swansea,WALES,2238.29,17730.00,28650.00,25020.00,17330.00,13200.00,8180.00,3880.00,1200.00,115190.00,True -W06000012,Neath Port Talbot,WALES,2541.39,13830.00,27500.00,11720.00,7430.00,4580.00,1530.00,540.00,110.00,67240.00,True -W06000013,Bridgend,WALES,2477.99,10600.00,15370.00,14840.00,11050.00,8020.00,4480.00,1510.00,300.00,66170.00,True -W06000014,Vale of Glamorgan,WALES,2231.54,1510.00,6680.00,14520.00,11910.00,10790.00,7740.00,5920.00,2270.00,61340.00,True -W06000015,Cardiff,WALES,2013.18,5320.00,20420.00,34920.00,37370.00,31540.00,22250.00,10590.00,2850.00,165260.00,True -W06000016,Rhondda Cynon Taf,WALES,2289.43,47080.00,25500.00,17510.00,9660.00,7140.00,3520.00,1190.00,200.00,111800.00,True -W06000018,Caerphilly,WALES,2082.88,15550.00,26890.00,18930.00,9540.00,6840.00,2430.00,840.00,90.00,81110.00,True -W06000019,Blaenau Gwent,WALES,2531.26,19200.00,8160.00,2730.00,1810.00,900.00,350.00,60.00,,33210.00,True -W06000020,Torfaen,WALES,2155.68,6300.00,13120.00,12050.00,4350.00,4330.00,2410.00,690.00,70.00,43320.00,True -W06000021,Monmouthshire,WALES,2416.50,520.00,3450.00,7140.00,9460.00,7660.00,8100.00,5520.00,1790.00,43640.00,True -W06000022,Newport,WALES,2088.48,6910.00,15400.00,18470.00,12990.00,8560.00,6090.00,2710.00,560.00,71690.00,True -W06000023,Powys,WALES,2351.72,6090.00,9440.00,13330.00,10630.00,12660.00,9740.00,4180.00,580.00,66650.00,True -W06000024,Merthyr Tydfil,WALES,2593.60,14150.00,6680.00,2270.00,2210.00,1560.00,580.00,160.00,,27610.00,True +code,name,country,band_d_amount,count_band_A,count_band_B,count_band_C,count_band_D,count_band_E,count_band_F,count_band_G,count_band_H,count_band_I,total_dwellings,has_council_tax +E06000001,Hartlepool,ENGLAND,2560.20,24090.00,7830.00,6780.00,3630.00,2070.00,930.00,700.00,110.00,,46140.00,True +E06000002,Middlesbrough,ENGLAND,2549.16,33080.00,11550.00,11610.00,5620.00,2810.00,1040.00,600.00,50.00,,66360.00,True +E06000003,Redcar and Cleveland,ENGLAND,2544.48,26840.00,13800.00,14820.00,6090.00,3610.00,1070.00,420.00,30.00,,66660.00,True +E06000004,Stockton-on-Tees,ENGLAND,2589.83,34900.00,17560.00,16890.00,10400.00,6430.00,3000.00,1610.00,130.00,,90910.00,True +E06000005,Darlington,ENGLAND,2493.83,23160.00,11180.00,7800.00,5950.00,3590.00,1400.00,680.00,50.00,,53820.00,True +E06000006,Halton,ENGLAND,2366.61,27340.00,12760.00,8370.00,5230.00,3890.00,1270.00,360.00,40.00,,59260.00,True +E06000007,Warrington,ENGLAND,2447.61,27780.00,21410.00,19980.00,12400.00,7960.00,4900.00,2730.00,230.00,,97390.00,True +E06000008,Blackburn with Darwen,ENGLAND,2455.27,35860.00,9950.00,9010.00,4960.00,2780.00,840.00,580.00,70.00,,64050.00,True +E06000009,Blackpool,ENGLAND,2513.22,32210.00,21330.00,11480.00,4860.00,1950.00,580.00,250.00,30.00,,72700.00,True +E06000010,"Kingston upon Hull, City of",ENGLAND,2295.04,82540.00,24430.00,11440.00,4990.00,1410.00,320.00,60.00,40.00,,125230.00,True +E06000011,East Riding of Yorkshire,ENGLAND,2466.08,40330.00,38430.00,33140.00,25660.00,17380.00,7740.00,3440.00,300.00,,166420.00,True +E06000012,North East Lincolnshire,ENGLAND,2483.85,38690.00,18400.00,9390.00,5330.00,2520.00,980.00,510.00,60.00,,75880.00,True +E06000013,North Lincolnshire,ENGLAND,2348.46,35920.00,16440.00,11580.00,7850.00,4020.00,1720.00,550.00,30.00,,78110.00,True +E06000014,York,ENGLAND,2287.15,13150.00,25560.00,27300.00,13880.00,8030.00,3830.00,1930.00,140.00,,93800.00,True +E06000015,Derby,ENGLAND,2306.00,58500.00,22270.00,17230.00,8900.00,4850.00,2340.00,710.00,50.00,,114860.00,True +E06000016,Leicester,ENGLAND,2528.75,86990.00,28270.00,16960.00,7340.00,3570.00,1590.00,620.00,60.00,,145410.00,True +E06000017,Rutland,ENGLAND,2737.58,1750.00,4890.00,3340.00,2570.00,2400.00,1690.00,1360.00,170.00,,18160.00,True +E06000018,Nottingham,ENGLAND,2755.39,92180.00,25740.00,17180.00,7790.00,2660.00,1120.00,760.00,120.00,,147540.00,True +E06000019,"Herefordshire, County of",ENGLAND,2574.37,14040.00,20630.00,17710.00,13820.00,12660.00,7680.00,3800.00,190.00,,90520.00,True +E06000020,Telford and Wrekin,ENGLAND,2256.26,26960.00,22860.00,14900.00,10050.00,5870.00,2570.00,1210.00,60.00,,84480.00,True +E06000021,Stoke-on-Trent,ENGLAND,2183.12,70450.00,25560.00,15880.00,5100.00,1980.00,560.00,200.00,40.00,,119780.00,True +E06000022,Bath and North East Somerset,ENGLAND,2383.42,9370.00,19630.00,21290.00,14500.00,10460.00,5980.00,5210.00,460.00,,86890.00,True +E06000023,"Bristol, City of",ENGLAND,2713.68,56890.00,76330.00,41320.00,19900.00,10120.00,4940.00,2900.00,360.00,,212750.00,True +E06000024,North Somerset,ENGLAND,2491.22,13940.00,22140.00,23810.00,18060.00,13390.00,6880.00,3470.00,290.00,,101970.00,True +E06000025,South Gloucestershire,ENGLAND,2550.59,14480.00,37160.00,30510.00,24250.00,13700.00,6630.00,2210.00,200.00,,129130.00,True +E06000026,Plymouth,ENGLAND,2441.85,48160.00,33380.00,23670.00,10310.00,5250.00,1890.00,620.00,60.00,,123360.00,True +E06000027,Torbay,ENGLAND,2470.25,13790.00,17850.00,17180.00,10750.00,5450.00,2420.00,1290.00,140.00,,68860.00,True +E06000030,Swindon,ENGLAND,2438.10,15190.00,28070.00,25270.00,18530.00,9640.00,4020.00,1500.00,70.00,,102290.00,True +E06000031,Peterborough,ENGLAND,2293.47,35930.00,22730.00,15460.00,9010.00,4930.00,2030.00,1070.00,80.00,,91240.00,True +E06000032,Luton,ENGLAND,2439.93,21520.00,28100.00,22860.00,8000.00,3520.00,1130.00,290.00,30.00,,85450.00,True +E06000033,Southend-on-Sea,ENGLAND,2265.17,17170.00,16180.00,24770.00,12900.00,6820.00,3710.00,1640.00,130.00,,83310.00,True +E06000034,Thurrock,ENGLAND,2254.68,7540.00,14110.00,27720.00,12800.00,4860.00,2320.00,890.00,60.00,,70300.00,True +E06000035,Medway,ENGLAND,2328.55,11470.00,38870.00,35530.00,19470.00,10230.00,4420.00,1560.00,60.00,,121600.00,True +E06000036,Bracknell Forest,ENGLAND,2264.80,1650.00,5660.00,19880.00,10500.00,8670.00,5450.00,2690.00,310.00,,54820.00,True +E06000037,West Berkshire,ENGLAND,2505.37,2750.00,7290.00,20500.00,17840.00,10950.00,7120.00,4880.00,780.00,,72100.00,True +E06000038,Reading,ENGLAND,2612.77,7270.00,14990.00,31530.00,12220.00,5920.00,3390.00,1910.00,100.00,,77330.00,True +E06000039,Slough,ENGLAND,2414.44,1560.00,10950.00,24390.00,13670.00,4700.00,1730.00,360.00,10.00,,57370.00,True +E06000040,Windsor and Maidenhead,ENGLAND,1952.62,2140.00,4110.00,10700.00,16670.00,13590.00,8410.00,9970.00,2020.00,,67610.00,True +E06000041,Wokingham,ENGLAND,2497.70,2030.00,4250.00,12130.00,21120.00,17040.00,11160.00,6830.00,570.00,,75140.00,True +E06000042,Milton Keynes,ENGLAND,2372.21,18060.00,35810.00,32280.00,16440.00,13300.00,7180.00,3240.00,180.00,,126480.00,True +E06000043,Brighton and Hove,ENGLAND,2580.54,30090.00,30490.00,35410.00,20470.00,11720.00,4830.00,2840.00,220.00,,136070.00,True +E06000044,Portsmouth,ENGLAND,2291.71,27460.00,31800.00,22440.00,6280.00,3790.00,1660.00,660.00,60.00,,94150.00,True +E06000045,Southampton,ENGLAND,2381.48,36920.00,35880.00,23760.00,9790.00,3200.00,1420.00,450.00,30.00,,111450.00,True +E06000046,Isle of Wight,ENGLAND,2625.79,10650.00,18690.00,18000.00,13460.00,7340.00,3290.00,1570.00,150.00,,73150.00,True +E06000047,County Durham,ENGLAND,2622.15,144190.00,36650.00,32590.00,23630.00,11500.00,4490.00,2310.00,280.00,,255650.00,True +E06000049,Cheshire East,ENGLAND,2454.87,31710.00,39250.00,37540.00,28220.00,23520.00,15410.00,13130.00,2010.00,,190790.00,True +E06000050,Cheshire West and Chester,ENGLAND,2517.33,35320.00,39140.00,33010.00,22530.00,17600.00,10540.00,8110.00,640.00,,166880.00,True +E06000051,Shropshire,ENGLAND,2528.18,27440.00,38890.00,31760.00,22070.00,17630.00,9370.00,4830.00,360.00,,152340.00,True +E06000052,Cornwall,ENGLAND,2590.93,66210.00,73220.00,61520.00,45030.00,26830.00,9650.00,4430.00,450.00,,287330.00,True +E06000053,Isles of Scilly,ENGLAND,2047.96,10.00,40.00,110.00,270.00,330.00,270.00,130.00,10.00,,1170.00,True +E06000054,Wiltshire,ENGLAND,2571.78,27030.00,42950.00,58820.00,41200.00,31680.00,18490.00,11570.00,1370.00,,233110.00,True +E06000055,Bedford,ENGLAND,2471.74,10800.00,19080.00,20170.00,12480.00,8960.00,5790.00,3290.00,250.00,,80820.00,True +E06000056,Central Bedfordshire,ENGLAND,2516.16,11290.00,25640.00,36860.00,26700.00,17800.00,10200.00,5700.00,410.00,,134600.00,True +E06000057,Northumberland,ENGLAND,2596.94,70860.00,26550.00,21800.00,18410.00,12210.00,7600.00,4550.00,590.00,,162560.00,True +E06000058,"Bournemouth, Christchurch and Poole",ENGLAND,2435.58,26730.00,34610.00,54390.00,36070.00,21890.00,9450.00,5820.00,1310.00,,190260.00,True +E06000059,Dorset,ENGLAND,2765.02,20840.00,31970.00,43430.00,37400.00,28890.00,16160.00,8230.00,740.00,,187640.00,True +E06000060,Buckinghamshire,ENGLAND,2526.58,6970.00,26310.00,54560.00,47150.00,36730.00,29170.00,31530.00,6160.00,,238580.00,True +E06000061,North Northamptonshire,ENGLAND,2423.96,48480.00,42960.00,29500.00,18750.00,12750.00,5530.00,3060.00,280.00,,161300.00,True +E06000062,West Northamptonshire,ENGLAND,2486.66,38700.00,41080.00,46110.00,24480.00,17970.00,10680.00,6520.00,490.00,,186010.00,True +E06000063,Cumberland,ENGLAND,2511.32,64010.00,25940.00,20470.00,15630.00,8470.00,2980.00,980.00,80.00,,138560.00,True +E06000064,Westmorland and Furness,ENGLAND,2507.99,29300.00,24520.00,23280.00,17770.00,12750.00,6480.00,3440.00,340.00,,117860.00,True +E06000065,North Yorkshire,ENGLAND,2544.34,48920.00,65620.00,70150.00,46130.00,37890.00,22340.00,14070.00,1310.00,,306440.00,True +E06000066,Somerset,ENGLAND,2560.59,43360.00,72220.00,59900.00,40390.00,31050.00,16940.00,7820.00,520.00,,272210.00,True +E07000008,Cambridge,ENGLAND,2467.02,4420.00,11090.00,20890.00,10610.00,6060.00,3990.00,3270.00,510.00,,60840.00,True +E07000009,East Cambridgeshire,ENGLAND,2485.18,5000.00,11670.00,8580.00,7610.00,5110.00,2460.00,820.00,90.00,,41350.00,True +E07000010,Fenland,ENGLAND,2537.74,17450.00,13190.00,9030.00,4960.00,2520.00,710.00,190.00,30.00,,48060.00,True +E07000011,Huntingdonshire,ENGLAND,2556.40,12600.00,21820.00,19420.00,12970.00,10360.00,4490.00,2010.00,180.00,,83840.00,True +E07000012,South Cambridgeshire,ENGLAND,2536.25,2780.00,8620.00,22500.00,13830.00,12340.00,8670.00,4900.00,420.00,,74060.00,True +E07000032,Amber Valley,ENGLAND,2407.69,22980.00,12960.00,11020.00,7050.00,3630.00,1940.00,1550.00,140.00,,61270.00,True +E07000033,Bolsover,ENGLAND,2559.41,22440.00,6910.00,4880.00,3040.00,1150.00,350.00,150.00,20.00,,38940.00,True +E07000034,Chesterfield,ENGLAND,2339.49,27100.00,10630.00,6530.00,4070.00,2150.00,620.00,220.00,30.00,,51350.00,True +E07000035,Derbyshire Dales,ENGLAND,2444.70,3680.00,7630.00,7720.00,5850.00,5290.00,3300.00,2170.00,140.00,,35770.00,True +E07000036,Erewash,ENGLAND,2360.64,22010.00,14290.00,7900.00,5080.00,2430.00,920.00,530.00,40.00,,53190.00,True +E07000037,High Peak,ENGLAND,2384.66,8670.00,13380.00,9510.00,5120.00,4100.00,2200.00,860.00,50.00,,43890.00,True +E07000038,North East Derbyshire,ENGLAND,2466.57,19260.00,10030.00,8200.00,5700.00,3300.00,1630.00,900.00,70.00,,49080.00,True +E07000039,South Derbyshire,ENGLAND,2339.61,11910.00,11780.00,9770.00,8370.00,5700.00,2430.00,1020.00,100.00,,51070.00,True +E07000040,East Devon,ENGLAND,2595.46,6860.00,14150.00,17830.00,13670.00,11400.00,6700.00,4270.00,210.00,,75100.00,True +E07000041,Exeter,ENGLAND,2495.36,13480.00,15450.00,14560.00,10030.00,4570.00,2220.00,1020.00,50.00,,61380.00,True +E07000042,Mid Devon,ENGLAND,2656.41,6550.00,9380.00,7290.00,6700.00,5010.00,2640.00,980.00,60.00,,38610.00,True +E07000043,North Devon,ENGLAND,2642.21,10450.00,11830.00,10620.00,8670.00,5100.00,2040.00,640.00,50.00,,49400.00,True +E07000044,South Hams,ENGLAND,2615.22,5360.00,9100.00,9570.00,8500.00,7590.00,4140.00,3200.00,380.00,,47840.00,True +E07000045,Teignbridge,ENGLAND,2643.12,9080.00,14740.00,14520.00,12280.00,8610.00,4110.00,2060.00,120.00,,65510.00,True +E07000046,Torridge,ENGLAND,2601.42,8460.00,7500.00,7340.00,6150.00,3520.00,1210.00,390.00,30.00,,34600.00,True +E07000047,West Devon,ENGLAND,2705.33,3640.00,6760.00,5760.00,4560.00,3710.00,1920.00,1050.00,80.00,,27470.00,True +E07000061,Eastbourne,ENGLAND,2654.28,8870.00,13370.00,10980.00,8760.00,4600.00,2070.00,1130.00,90.00,,49870.00,True +E07000062,Hastings,ENGLAND,2676.58,14990.00,12520.00,7810.00,5800.00,2350.00,860.00,200.00,40.00,,44570.00,True +E07000063,Lewes,ENGLAND,2756.17,4510.00,6410.00,13850.00,10360.00,6260.00,3300.00,2420.00,250.00,,47360.00,True +E07000064,Rother,ENGLAND,2700.95,5050.00,7420.00,10230.00,9430.00,7690.00,4110.00,2770.00,280.00,,46970.00,True +E07000065,Wealden,ENGLAND,2728.43,4360.00,8470.00,17900.00,16070.00,12010.00,8130.00,7340.00,950.00,,75240.00,True +E07000066,Basildon,ENGLAND,2327.24,9100.00,16310.00,24750.00,14900.00,7930.00,4900.00,2080.00,200.00,,80160.00,True +E07000067,Braintree,ENGLAND,2280.34,6240.00,17650.00,20390.00,10900.00,8240.00,4990.00,2500.00,230.00,,71150.00,True +E07000068,Brentwood,ENGLAND,2258.14,690.00,3080.00,6950.00,8900.00,6470.00,4620.00,4060.00,660.00,,35420.00,True +E07000069,Castle Point,ENGLAND,2318.63,3370.00,6440.00,13880.00,8710.00,4480.00,1920.00,770.00,70.00,,39630.00,True +E07000070,Chelmsford,ENGLAND,2300.18,5180.00,10960.00,23980.00,18540.00,11460.00,6610.00,4590.00,450.00,,81760.00,True +E07000071,Colchester,ENGLAND,2282.85,9600.00,23120.00,21170.00,16230.00,9320.00,4310.00,2600.00,170.00,,86520.00,True +E07000072,Epping Forest,ENGLAND,2277.21,2120.00,5220.00,12060.00,14210.00,10280.00,7130.00,6320.00,1260.00,,58610.00,True +E07000073,Harlow,ENGLAND,2298.69,2620.00,8360.00,19630.00,5240.00,3070.00,1180.00,450.00,20.00,,40560.00,True +E07000074,Maldon,ENGLAND,2328.37,2480.00,3980.00,8640.00,5690.00,4710.00,3180.00,1700.00,190.00,,30560.00,True +E07000075,Rochford,ENGLAND,2363.48,1580.00,4080.00,12110.00,10890.00,5350.00,2800.00,1450.00,80.00,,38340.00,True +E07000076,Tendring,ENGLAND,2269.63,13840.00,18040.00,22070.00,12380.00,6120.00,2160.00,980.00,90.00,,75690.00,True +E07000077,Uttlesford,ENGLAND,2333.82,1430.00,4180.00,8770.00,8080.00,7610.00,5310.00,4960.00,460.00,,40790.00,True +E07000078,Cheltenham,ENGLAND,2369.52,9990.00,13530.00,14150.00,9450.00,5270.00,2800.00,2210.00,150.00,,57560.00,True +E07000079,Cotswold,ENGLAND,2391.65,3710.00,5430.00,11550.00,7770.00,6740.00,5310.00,4950.00,780.00,,46250.00,True +E07000080,Forest of Dean,ENGLAND,2443.42,7210.00,10410.00,9230.00,6150.00,4670.00,2190.00,1040.00,80.00,,40980.00,True +E07000081,Gloucester,ENGLAND,2355.84,17700.00,16980.00,14340.00,6110.00,3880.00,930.00,180.00,10.00,,60130.00,True +E07000082,Stroud,ENGLAND,2491.36,7630.00,13050.00,13150.00,8640.00,7320.00,4230.00,2660.00,260.00,,56940.00,True +E07000083,Tewkesbury,ENGLAND,2340.53,7060.00,7130.00,13060.00,6790.00,6070.00,3780.00,2130.00,210.00,,46230.00,True +E07000084,Basingstoke and Deane,ENGLAND,2255.21,2620.00,13300.00,28100.00,15490.00,11350.00,6790.00,3570.00,460.00,,81690.00,True +E07000085,East Hampshire,ENGLAND,2343.92,3080.00,6360.00,13430.00,11590.00,9270.00,6950.00,5160.00,670.00,,56500.00,True +E07000086,Eastleigh,ENGLAND,2342.21,4710.00,12600.00,19810.00,11260.00,8190.00,3510.00,1210.00,30.00,,61320.00,True +E07000087,Fareham,ENGLAND,2270.55,3640.00,7390.00,15710.00,10880.00,8130.00,3720.00,1530.00,140.00,,51150.00,True +E07000088,Gosport,ENGLAND,2344.29,6170.00,13380.00,9230.00,5170.00,2010.00,1570.00,330.00,20.00,,37880.00,True +E07000089,Hart,ENGLAND,2400.02,780.00,2600.00,10120.00,9720.00,8280.00,7220.00,4050.00,260.00,,43030.00,True +E07000090,Havant,ENGLAND,2320.28,8610.00,14860.00,13770.00,10550.00,5950.00,2590.00,990.00,50.00,,57380.00,True +E07000091,New Forest,ENGLAND,2419.76,7330.00,12250.00,18260.00,19460.00,13700.00,7220.00,4700.00,620.00,,83540.00,True +E07000092,Rushmoor,ENGLAND,2320.28,1500.00,9090.00,16950.00,9310.00,4250.00,1320.00,330.00,20.00,,42770.00,True +E07000093,Test Valley,ENGLAND,2305.52,3120.00,10040.00,15600.00,11420.00,8800.00,5320.00,3950.00,560.00,,58810.00,True +E07000094,Winchester,ENGLAND,2359.76,3050.00,7530.00,13750.00,11310.00,9190.00,7180.00,6020.00,750.00,,58770.00,True +E07000095,Broxbourne,ENGLAND,2306.43,590.00,3820.00,9960.00,14530.00,7880.00,3010.00,2350.00,230.00,,42360.00,True +E07000096,Dacorum,ENGLAND,2408.51,1240.00,8300.00,20760.00,16240.00,9420.00,5860.00,5260.00,850.00,,67930.00,True +E07000098,Hertsmere,ENGLAND,2405.83,820.00,3090.00,7450.00,14980.00,8990.00,4640.00,4750.00,1230.00,,45940.00,True +E07000099,North Hertfordshire,ENGLAND,2448.52,3450.00,9440.00,20320.00,10450.00,7490.00,4900.00,3630.00,360.00,,60020.00,True +E07000102,Three Rivers,ENGLAND,2422.31,890.00,2430.00,6980.00,10030.00,7560.00,4470.00,5170.00,1630.00,,39150.00,True +E07000103,Watford,ENGLAND,2446.70,470.00,4490.00,16000.00,14260.00,3890.00,2220.00,1930.00,80.00,,43350.00,True +E07000105,Ashford,ENGLAND,2410.16,4380.00,13910.00,13710.00,10220.00,7120.00,6220.00,3570.00,220.00,,59350.00,True +E07000106,Canterbury,ENGLAND,2419.33,7760.00,14100.00,21250.00,14160.00,7950.00,4210.00,2320.00,120.00,,71860.00,True +E07000107,Dartford,ENGLAND,2375.15,1750.00,6830.00,15370.00,14590.00,7750.00,3030.00,1120.00,70.00,,50510.00,True +E07000108,Dover,ENGLAND,2461.74,7300.00,17350.00,14600.00,7750.00,4650.00,2580.00,1590.00,80.00,,55890.00,True +E07000109,Gravesham,ENGLAND,2408.24,3680.00,7050.00,15260.00,10970.00,4780.00,2130.00,1100.00,110.00,,45070.00,True +E07000110,Maidstone,ENGLAND,2502.59,4520.00,9570.00,21210.00,20600.00,10980.00,6610.00,4720.00,390.00,,78600.00,True +E07000111,Sevenoaks,ENGLAND,2522.36,1910.00,3480.00,11660.00,12160.00,7730.00,6170.00,7990.00,1550.00,,52660.00,True +E07000112,Folkestone and Hythe,ENGLAND,2538.75,7190.00,13030.00,14680.00,8720.00,5280.00,2790.00,1980.00,100.00,,53780.00,True +E07000113,Swale,ENGLAND,2405.65,10400.00,16590.00,17920.00,12190.00,6130.00,2820.00,1310.00,120.00,,67470.00,True +E07000114,Thanet,ENGLAND,2490.90,16400.00,20220.00,18390.00,8250.00,4210.00,1660.00,840.00,40.00,,70010.00,True +E07000115,Tonbridge and Malling,ENGLAND,2471.83,1770.00,4080.00,16220.00,14410.00,9650.00,5570.00,5100.00,470.00,,57270.00,True +E07000116,Tunbridge Wells,ENGLAND,2446.15,3500.00,5440.00,14220.00,11090.00,7180.00,5240.00,5620.00,620.00,,52900.00,True +E07000117,Burnley,ENGLAND,2549.42,25800.00,5850.00,6530.00,3080.00,1350.00,340.00,130.00,20.00,,43090.00,True +E07000118,Chorley,ENGLAND,2430.23,15200.00,12200.00,9810.00,7020.00,5490.00,2390.00,1050.00,70.00,,53230.00,True +E07000119,Fylde,ENGLAND,2483.94,7180.00,7030.00,9690.00,7560.00,5420.00,2960.00,1690.00,140.00,,41680.00,True +E07000120,Hyndburn,ENGLAND,2465.98,21980.00,5870.00,5900.00,2870.00,870.00,280.00,170.00,10.00,,37960.00,True +E07000121,Lancaster,ENGLAND,2503.19,23600.00,16510.00,12830.00,6740.00,4270.00,2130.00,870.00,80.00,,67020.00,True +E07000122,Pendle,ENGLAND,2640.18,25170.00,4850.00,4640.00,3500.00,1890.00,1030.00,550.00,40.00,,41660.00,True +E07000123,Preston,ENGLAND,2575.74,31000.00,13610.00,11260.00,7490.00,3750.00,2130.00,1080.00,70.00,,70390.00,True +E07000124,Ribble Valley,ENGLAND,2386.50,3900.00,5620.00,5810.00,5100.00,4310.00,2680.00,2050.00,240.00,,29700.00,True +E07000125,Rossendale,ENGLAND,2519.97,16480.00,5250.00,4430.00,3460.00,2040.00,720.00,470.00,40.00,,32890.00,True +E07000126,South Ribble,ENGLAND,2442.66,10130.00,13620.00,13130.00,8660.00,4510.00,1770.00,610.00,30.00,,52470.00,True +E07000127,West Lancashire,ENGLAND,2456.23,14980.00,9760.00,10530.00,7650.00,5430.00,2690.00,1700.00,110.00,,52850.00,True +E07000128,Wyre,ENGLAND,2460.53,12060.00,12580.00,13420.00,7900.00,6050.00,2760.00,1150.00,80.00,,55980.00,True +E07000129,Blaby,ENGLAND,2490.22,5040.00,15700.00,10280.00,6940.00,4640.00,1660.00,550.00,40.00,,44840.00,True +E07000130,Charnwood,ENGLAND,2405.64,13340.00,22020.00,19430.00,11510.00,7600.00,3430.00,2070.00,230.00,,79620.00,True +E07000131,Harborough,ENGLAND,2389.87,4750.00,9770.00,8640.00,7110.00,7400.00,4120.00,2840.00,260.00,,44900.00,True +E07000132,Hinckley and Bosworth,ENGLAND,2382.62,8930.00,16590.00,11540.00,7590.00,4630.00,2350.00,1160.00,70.00,,52840.00,True +E07000133,Melton,ENGLAND,2429.67,3700.00,7790.00,4100.00,4050.00,2690.00,1640.00,1050.00,90.00,,25110.00,True +E07000134,North West Leicestershire,ENGLAND,2418.20,10270.00,14790.00,8280.00,7300.00,5420.00,2050.00,990.00,60.00,,49150.00,True +E07000135,Oadby and Wigston,ENGLAND,2406.85,4150.00,6340.00,7340.00,3290.00,2200.00,650.00,490.00,90.00,,24560.00,True +E07000136,Boston,ENGLAND,2308.73,15550.00,6610.00,6240.00,2390.00,880.00,240.00,80.00,20.00,,31990.00,True +E07000137,East Lindsey,ENGLAND,2275.88,28110.00,15500.00,16290.00,6970.00,3790.00,1490.00,610.00,60.00,,72820.00,True +E07000138,Lincoln,ENGLAND,2323.08,28930.00,9140.00,4950.00,2570.00,1440.00,530.00,140.00,40.00,,47750.00,True +E07000139,North Kesteven,ENGLAND,2337.81,14220.00,14110.00,13430.00,7480.00,3840.00,1680.00,430.00,60.00,,55250.00,True +E07000140,South Holland,ENGLAND,2278.20,16760.00,9810.00,10700.00,4790.00,2150.00,450.00,120.00,20.00,,44790.00,True +E07000141,South Kesteven,ENGLAND,2260.00,20100.00,15530.00,11790.00,9650.00,6080.00,3130.00,1130.00,110.00,,67510.00,True +E07000142,West Lindsey,ENGLAND,2354.25,17270.00,8670.00,8200.00,6290.00,3970.00,1690.00,550.00,70.00,,46710.00,True +E07000143,Breckland,ENGLAND,2443.67,16260.00,18480.00,14810.00,8550.00,5040.00,1910.00,830.00,60.00,,65950.00,True +E07000144,Broadland,ENGLAND,2437.78,5060.00,16080.00,21850.00,10660.00,5650.00,2370.00,880.00,100.00,,62650.00,True +E07000145,Great Yarmouth,ENGLAND,2414.41,20910.00,12800.00,9080.00,4480.00,2020.00,640.00,260.00,20.00,,50210.00,True +E07000146,King's Lynn and West Norfolk,ENGLAND,2430.13,24670.00,17970.00,13850.00,10010.00,5410.00,2790.00,1220.00,120.00,,76030.00,True +E07000147,North Norfolk,ENGLAND,2459.93,12190.00,14640.00,11880.00,9220.00,5130.00,2460.00,1100.00,90.00,,56700.00,True +E07000148,Norwich,ENGLAND,2503.44,28590.00,23800.00,9090.00,3760.00,2360.00,930.00,610.00,70.00,,69220.00,True +E07000149,South Norfolk,ENGLAND,2482.87,7340.00,18430.00,16780.00,11990.00,7950.00,3400.00,1580.00,120.00,,67590.00,True +E07000170,Ashfield,ENGLAND,2608.76,30290.00,11920.00,9110.00,4460.00,1560.00,520.00,130.00,30.00,,58020.00,True +E07000171,Bassetlaw,ENGLAND,2644.95,28230.00,9040.00,7100.00,7070.00,3530.00,1720.00,740.00,60.00,,57490.00,True +E07000172,Broxtowe,ENGLAND,2618.21,16870.00,13610.00,11200.00,6230.00,2840.00,840.00,510.00,30.00,,52130.00,True +E07000173,Gedling,ENGLAND,2609.55,14900.00,15650.00,10760.00,7070.00,4390.00,1500.00,950.00,100.00,,55320.00,True +E07000174,Mansfield,ENGLAND,2600.38,27850.00,9960.00,7030.00,4250.00,1770.00,470.00,210.00,30.00,,51550.00,True +E07000175,Newark and Sherwood,ENGLAND,2682.10,24260.00,8980.00,9640.00,6640.00,4570.00,2810.00,1530.00,140.00,,58560.00,True +E07000176,Rushcliffe,ENGLAND,2643.27,6420.00,11430.00,12090.00,10200.00,7720.00,4640.00,2720.00,150.00,,55380.00,True +E07000177,Cherwell,ENGLAND,2582.96,6230.00,16680.00,19780.00,12700.00,9260.00,4490.00,2890.00,270.00,,72300.00,True +E07000178,Oxford,ENGLAND,2678.40,2970.00,9890.00,19810.00,16320.00,7670.00,3140.00,3370.00,610.00,,63780.00,True +E07000179,South Oxfordshire,ENGLAND,2597.57,2130.00,6070.00,18530.00,15260.00,10980.00,6810.00,6420.00,990.00,,67190.00,True +E07000180,Vale of White Horse,ENGLAND,2577.44,1910.00,6870.00,19390.00,14150.00,10450.00,6620.00,4870.00,490.00,,64750.00,True +E07000181,West Oxfordshire,ENGLAND,2566.95,1690.00,6220.00,17990.00,11950.00,7990.00,4640.00,3100.00,420.00,,53990.00,True +E07000192,Cannock Chase,ENGLAND,2375.83,14120.00,14510.00,8860.00,5680.00,2000.00,660.00,280.00,20.00,,46120.00,True +E07000193,East Staffordshire,ENGLAND,2351.34,18370.00,12310.00,9590.00,6790.00,5160.00,2660.00,1300.00,100.00,,56270.00,True +E07000194,Lichfield,ENGLAND,2351.90,6010.00,11020.00,12460.00,7530.00,5140.00,4030.00,2730.00,430.00,,49330.00,True +E07000195,Newcastle-under-Lyme,ENGLAND,2334.25,24990.00,10910.00,11780.00,4990.00,2910.00,1860.00,1020.00,50.00,,58520.00,True +E07000196,South Staffordshire,ENGLAND,2313.67,6900.00,10910.00,12080.00,7570.00,5600.00,3610.00,2490.00,220.00,,49370.00,True +E07000197,Stafford,ENGLAND,2302.68,12420.00,14480.00,14660.00,10060.00,7020.00,3780.00,1660.00,110.00,,64170.00,True +E07000198,Staffordshire Moorlands,ENGLAND,2338.21,9660.00,10860.00,10880.00,6360.00,4560.00,2020.00,810.00,40.00,,45180.00,True +E07000199,Tamworth,ENGLAND,2300.76,9530.00,12410.00,6180.00,4020.00,2210.00,600.00,130.00,10.00,,35070.00,True +E07000200,Babergh,ENGLAND,2341.55,5220.00,12430.00,9280.00,7820.00,4880.00,2650.00,1800.00,200.00,,44280.00,True +E07000202,Ipswich,ENGLAND,2468.25,19420.00,23220.00,11540.00,4510.00,2370.00,960.00,380.00,20.00,,62410.00,True +E07000203,Mid Suffolk,ENGLAND,2316.88,5950.00,13510.00,11200.00,8080.00,6420.00,3390.00,1740.00,110.00,,50400.00,True +E07000207,Elmbridge,ENGLAND,2557.75,460.00,1890.00,8180.00,14150.00,11310.00,8140.00,11460.00,4550.00,,60130.00,True +E07000208,Epsom and Ewell,ENGLAND,2530.84,160.00,1270.00,5610.00,9290.00,7810.00,4830.00,4180.00,150.00,,33310.00,True +E07000209,Guildford,ENGLAND,2547.30,2290.00,3550.00,12790.00,16940.00,10640.00,6920.00,7590.00,1860.00,,62580.00,True +E07000210,Mole Valley,ENGLAND,2519.86,1690.00,2740.00,4520.00,8420.00,7240.00,6310.00,7830.00,1080.00,,39830.00,True +E07000211,Reigate and Banstead,ENGLAND,2566.61,1230.00,4270.00,13130.00,18260.00,11660.00,7700.00,7540.00,1140.00,,64930.00,True +E07000212,Runnymede,ENGLAND,2492.99,2500.00,1610.00,8040.00,11690.00,6950.00,4300.00,3230.00,1140.00,,39460.00,True +E07000213,Spelthorne,ENGLAND,2526.44,460.00,1790.00,10140.00,15180.00,10110.00,4730.00,2200.00,120.00,,44730.00,True +E07000214,Surrey Heath,ENGLAND,2585.16,740.00,2650.00,6380.00,10230.00,6900.00,5940.00,5330.00,540.00,,38700.00,True +E07000215,Tandridge,ENGLAND,2594.85,940.00,2230.00,5440.00,9130.00,7870.00,4940.00,6400.00,1290.00,,38240.00,True +E07000216,Waverley,ENGLAND,2604.87,1030.00,3480.00,10920.00,13590.00,10110.00,7380.00,8910.00,2180.00,,57590.00,True +E07000217,Woking,ENGLAND,2598.04,340.00,3620.00,11320.00,12600.00,6360.00,4240.00,5260.00,830.00,,44560.00,True +E07000218,North Warwickshire,ENGLAND,2532.10,6750.00,7510.00,6520.00,4060.00,2610.00,1420.00,790.00,80.00,,29740.00,True +E07000219,Nuneaton and Bedworth,ENGLAND,2502.16,20960.00,13710.00,14700.00,7910.00,3180.00,870.00,200.00,20.00,,61530.00,True +E07000220,Rugby,ENGLAND,2483.05,9090.00,12130.00,12530.00,7400.00,5280.00,3530.00,1910.00,110.00,,51990.00,True +E07000221,Stratford-on-Avon,ENGLAND,2484.17,3850.00,8630.00,18950.00,11350.00,10780.00,6850.00,5980.00,1000.00,,67380.00,True +E07000222,Warwick,ENGLAND,2461.55,5040.00,12630.00,18940.00,13730.00,8520.00,5700.00,4720.00,460.00,,69750.00,True +E07000223,Adur,ENGLAND,2548.28,2780.00,5110.00,11580.00,6340.00,2050.00,760.00,340.00,10.00,,28980.00,True +E07000224,Arun,ENGLAND,2487.24,8520.00,12990.00,21180.00,16680.00,10930.00,6350.00,2800.00,310.00,,79760.00,True +E07000225,Chichester,ENGLAND,2469.68,3350.00,6540.00,15290.00,13040.00,9560.00,6440.00,6020.00,1360.00,,61610.00,True +E07000226,Crawley,ENGLAND,2418.46,1300.00,7670.00,22570.00,9100.00,3820.00,2350.00,470.00,10.00,,47290.00,True +E07000227,Horsham,ENGLAND,2441.01,2440.00,6790.00,14020.00,14410.00,11640.00,8560.00,8080.00,840.00,,66760.00,True +E07000228,Mid Sussex,ENGLAND,2474.26,2340.00,7790.00,15320.00,17830.00,12370.00,9200.00,5050.00,450.00,,70340.00,True +E07000229,Worthing,ENGLAND,2456.13,8370.00,11640.00,13190.00,9760.00,5610.00,2450.00,930.00,30.00,,51980.00,True +E07000234,Bromsgrove,ENGLAND,2478.65,3950.00,7460.00,9350.00,8060.00,7220.00,3850.00,2920.00,380.00,,43190.00,True +E07000235,Malvern Hills,ENGLAND,2450.92,4100.00,7690.00,8820.00,5980.00,5370.00,4150.00,2550.00,130.00,,38780.00,True +E07000236,Redditch,ENGLAND,2462.95,8040.00,12220.00,7970.00,4490.00,3450.00,1290.00,480.00,20.00,,37960.00,True +E07000237,Worcester,ENGLAND,2405.81,9010.00,15430.00,12030.00,5670.00,3590.00,1620.00,450.00,10.00,,47800.00,True +E07000238,Wychavon,ENGLAND,2373.19,7180.00,12070.00,14580.00,8550.00,7890.00,6900.00,4850.00,230.00,,62250.00,True +E07000239,Wyre Forest,ENGLAND,2512.47,11730.00,11960.00,12080.00,6540.00,3610.00,1800.00,1300.00,140.00,,49150.00,True +E07000240,St Albans,ENGLAND,2419.22,880.00,3220.00,10530.00,16530.00,13100.00,9530.00,8270.00,1410.00,,63480.00,True +E07000241,Welwyn Hatfield,ENGLAND,2452.26,1250.00,5850.00,16360.00,12550.00,5590.00,4500.00,3960.00,750.00,,50790.00,True +E07000242,East Hertfordshire,ENGLAND,2454.78,1000.00,6460.00,16520.00,17010.00,12070.00,8140.00,5950.00,870.00,,68010.00,True +E07000243,Stevenage,ENGLAND,2391.97,1700.00,6890.00,21760.00,3380.00,3280.00,980.00,430.00,20.00,,38440.00,True +E07000244,East Suffolk,ENGLAND,2334.80,28230.00,31230.00,23810.00,18810.00,11760.00,5650.00,3070.00,250.00,,122810.00,True +E07000245,West Suffolk,ENGLAND,2351.47,12730.00,29030.00,17370.00,12390.00,7410.00,3050.00,2100.00,200.00,,84280.00,True +E08000001,Bolton,ENGLAND,2399.74,65640.00,22820.00,18990.00,11000.00,5820.00,2370.00,1930.00,250.00,,128800.00,True +E08000002,Bury,ENGLAND,2555.15,30710.00,18680.00,17540.00,9380.00,5700.00,1900.00,1320.00,180.00,,85410.00,True +E08000003,Manchester,ENGLAND,2312.04,137810.00,43100.00,38170.00,21260.00,7640.00,3400.00,1270.00,150.00,,252810.00,True +E08000004,Oldham,ENGLAND,2602.23,51140.00,17700.00,16730.00,7310.00,3540.00,1630.00,940.00,80.00,,99070.00,True +E08000005,Rochdale,ENGLAND,2600.83,51910.00,17400.00,13280.00,8260.00,4580.00,1710.00,900.00,50.00,,98100.00,True +E08000006,Salford,ENGLAND,2594.45,63640.00,31220.00,22180.00,12350.00,3910.00,1490.00,880.00,110.00,,135780.00,True +E08000007,Stockport,ENGLAND,2618.90,31820.00,29160.00,28940.00,19920.00,13320.00,6570.00,3620.00,230.00,,133580.00,True +E08000008,Tameside,ENGLAND,2447.21,53040.00,19680.00,20250.00,7290.00,4000.00,950.00,450.00,40.00,,105700.00,True +E08000009,Trafford,ENGLAND,2291.70,20050.00,23020.00,27720.00,15590.00,7940.00,4690.00,4230.00,1070.00,,104300.00,True +E08000010,Wigan,ENGLAND,2152.68,68940.00,34800.00,25810.00,13480.00,7730.00,2030.00,650.00,60.00,,153490.00,True +E08000011,Knowsley,ENGLAND,2488.25,38180.00,15340.00,10660.00,5000.00,2110.00,330.00,130.00,20.00,,71770.00,True +E08000012,Liverpool,ENGLAND,2673.59,143680.00,44920.00,29870.00,14000.00,5140.00,2360.00,1760.00,150.00,,241880.00,True +E08000013,St. Helens,ENGLAND,2403.38,37850.00,19360.00,15770.00,7030.00,3810.00,1690.00,600.00,40.00,,86150.00,True +E08000014,Sefton,ENGLAND,2583.22,39990.00,28250.00,31380.00,15840.00,8930.00,3990.00,2740.00,290.00,,131400.00,True +E08000015,Wirral,ENGLAND,2500.59,61080.00,33140.00,27740.00,13690.00,8580.00,4390.00,3220.00,290.00,,152120.00,True +E08000016,Barnsley,ENGLAND,2325.96,65310.00,19340.00,14570.00,9790.00,4190.00,1630.00,710.00,60.00,,115610.00,True +E08000017,Doncaster,ENGLAND,2167.75,82760.00,27200.00,16270.00,10220.00,4900.00,2280.00,980.00,140.00,,144760.00,True +E08000018,Rotherham,ENGLAND,2381.53,64280.00,24200.00,16130.00,9790.00,5070.00,2010.00,810.00,70.00,,122350.00,True +E08000019,Sheffield,ENGLAND,2510.16,152470.00,42460.00,33260.00,16910.00,9780.00,4420.00,2890.00,220.00,,262400.00,True +E08000021,Newcastle upon Tyne,ENGLAND,2542.19,77750.00,21680.00,20520.00,10160.00,5940.00,2640.00,1930.00,140.00,,140760.00,True +E08000022,North Tyneside,ENGLAND,2461.77,50580.00,16240.00,20200.00,8490.00,4540.00,1590.00,380.00,40.00,,102050.00,True +E08000023,South Tyneside,ENGLAND,2434.43,45760.00,10470.00,8880.00,4940.00,1850.00,730.00,340.00,50.00,,73020.00,True +E08000024,Sunderland,ENGLAND,2197.14,80320.00,20110.00,18370.00,10090.00,3780.00,1230.00,700.00,60.00,,134650.00,True +E08000025,Birmingham,ENGLAND,2362.90,164600.00,132630.00,85230.00,44530.00,23130.00,9140.00,5960.00,930.00,,466150.00,True +E08000026,Coventry,ENGLAND,2516.72,63820.00,44330.00,25210.00,10750.00,5230.00,2610.00,1490.00,190.00,,153630.00,True +E08000027,Dudley,ENGLAND,2144.84,43610.00,40300.00,31110.00,16400.00,7150.00,2530.00,980.00,140.00,,142230.00,True +E08000028,Sandwell,ENGLAND,2244.46,59230.00,44650.00,21640.00,7680.00,2990.00,550.00,70.00,40.00,,136860.00,True +E08000029,Solihull,ENGLAND,2197.26,14590.00,12510.00,23390.00,17700.00,12200.00,9260.00,5820.00,490.00,,95950.00,True +E08000030,Walsall,ENGLAND,2627.48,52370.00,27810.00,18930.00,10490.00,5680.00,2420.00,860.00,60.00,,118620.00,True +E08000031,Wolverhampton,ENGLAND,2538.99,57530.00,25570.00,17660.00,7370.00,3150.00,1730.00,1000.00,130.00,,114130.00,True +E08000032,Bradford,ENGLAND,2360.73,92730.00,46940.00,41630.00,19000.00,13330.00,6260.00,3820.00,330.00,,224030.00,True +E08000033,Calderdale,ENGLAND,2420.15,44900.00,18530.00,16060.00,7730.00,5630.00,3150.00,1380.00,60.00,,97430.00,True +E08000034,Kirklees,ENGLAND,2441.07,86120.00,35310.00,33310.00,17860.00,12720.00,5720.00,2330.00,170.00,,193530.00,True +E08000035,Leeds,ENGLAND,2283.73,143230.00,80140.00,73400.00,38150.00,22930.00,10740.00,7490.00,760.00,,376840.00,True +E08000036,Wakefield,ENGLAND,2296.89,79970.00,31330.00,24780.00,16330.00,8860.00,2600.00,1230.00,100.00,,165190.00,True +E08000037,Gateshead,ENGLAND,2715.81,56090.00,13230.00,15950.00,6070.00,2780.00,900.00,390.00,50.00,,95480.00,True +E09000001,City of London,ENGLAND,1329.56,,350.00,690.00,950.00,2890.00,1390.00,1500.00,310.00,,8080.00,True +E09000002,Barking and Dagenham,ENGLAND,2198.51,6030.00,12420.00,50340.00,10770.00,1800.00,390.00,50.00,10.00,,81800.00,True +E09000003,Barnet,ENGLAND,2132.60,3420.00,9570.00,32530.00,39640.00,33920.00,20370.00,16820.00,4350.00,,160620.00,True +E09000004,Bexley,ENGLAND,2366.36,4350.00,11380.00,31230.00,28140.00,19550.00,5290.00,1750.00,50.00,,101750.00,True +E09000005,Brent,ENGLAND,2235.27,6090.00,14040.00,41900.00,39340.00,23430.00,6590.00,3460.00,250.00,,135110.00,True +E09000006,Bromley,ENGLAND,2140.04,2100.00,10590.00,30460.00,36460.00,29550.00,18580.00,14120.00,1750.00,,143600.00,True +E09000007,Camden,ENGLAND,2207.55,3380.00,12270.00,20780.00,26560.00,19820.00,12950.00,13140.00,4940.00,,113830.00,True +E09000008,Croydon,ENGLAND,2599.91,4450.00,24400.00,52850.00,42340.00,24140.00,11860.00,7520.00,660.00,,168220.00,True +E09000009,Ealing,ENGLAND,2138.53,5200.00,14970.00,36980.00,48680.00,25200.00,10520.00,7200.00,1060.00,,149800.00,True +E09000010,Enfield,ENGLAND,2267.67,5420.00,12400.00,35190.00,37170.00,21550.00,9590.00,6050.00,1020.00,,128400.00,True +E09000011,Greenwich,ENGLAND,2107.86,10790.00,22200.00,45460.00,27100.00,12850.00,4010.00,2280.00,360.00,,125040.00,True +E09000012,Hackney,ENGLAND,2060.30,8170.00,31670.00,35990.00,25200.00,13500.00,4950.00,1320.00,50.00,,120850.00,True +E09000013,Hammersmith and Fulham,ENGLAND,1519.51,4120.00,6630.00,14510.00,25920.00,17400.00,11330.00,12270.00,2940.00,,95120.00,True +E09000014,Haringey,ENGLAND,2313.78,7700.00,19400.00,36160.00,28640.00,11700.00,5540.00,4800.00,750.00,,114700.00,True +E09000015,Harrow,ENGLAND,2511.07,840.00,4470.00,22800.00,30020.00,22620.00,8550.00,6220.00,1320.00,,96860.00,True +E09000016,Havering,ENGLAND,2424.66,5300.00,11080.00,29790.00,36200.00,16040.00,6770.00,3140.00,380.00,,108680.00,True +E09000017,Hillingdon,ENGLAND,2045.46,1270.00,6550.00,28300.00,47450.00,18810.00,10050.00,5340.00,490.00,,118260.00,True +E09000018,Hounslow,ENGLAND,2185.56,2560.00,9560.00,30620.00,40720.00,16350.00,6370.00,4120.00,1030.00,,111320.00,True +E09000019,Islington,ENGLAND,2108.15,4660.00,6180.00,29760.00,33560.00,19520.00,10380.00,7300.00,960.00,,112320.00,True +E09000020,Kensington and Chelsea,ENGLAND,1666.65,1460.00,3310.00,9370.00,14110.00,13410.00,12210.00,19930.00,15480.00,,89280.00,True +E09000021,Kingston upon Thames,ENGLAND,2609.20,630.00,3420.00,16020.00,21010.00,15050.00,8770.00,4460.00,1080.00,,70440.00,True +E09000022,Lambeth,ENGLAND,2047.11,5020.00,33450.00,42330.00,33160.00,16550.00,10820.00,5960.00,1180.00,,148470.00,True +E09000023,Lewisham,ENGLAND,2237.33,9280.00,36440.00,48040.00,27670.00,8060.00,2820.00,1360.00,190.00,,133860.00,True +E09000024,Merton,ENGLAND,2146.76,1190.00,8590.00,24140.00,28360.00,13540.00,5940.00,4180.00,1850.00,,87780.00,True +E09000025,Newham,ENGLAND,1944.23,5570.00,34340.00,56120.00,26900.00,7220.00,2210.00,240.00,40.00,,132640.00,True +E09000026,Redbridge,ENGLAND,2294.58,2790.00,14100.00,27920.00,32140.00,19750.00,7820.00,3320.00,220.00,,108060.00,True +E09000027,Richmond upon Thames,ENGLAND,2486.10,600.00,2180.00,13480.00,20700.00,19770.00,12160.00,13290.00,3640.00,,85810.00,True +E09000028,Southwark,ENGLAND,1967.26,13220.00,38050.00,35710.00,28440.00,21540.00,7920.00,4590.00,830.00,,150300.00,True +E09000029,Sutton,ENGLAND,2378.64,990.00,8050.00,28300.00,24800.00,12950.00,7110.00,3780.00,290.00,,86270.00,True +E09000030,Tower Hamlets,ENGLAND,1837.78,4500.00,25040.00,40570.00,32250.00,27010.00,14280.00,5570.00,780.00,,150000.00,True +E09000031,Waltham Forest,ENGLAND,2386.96,5230.00,32380.00,39150.00,23440.00,8390.00,1850.00,440.00,30.00,,110900.00,True +E09000032,Wandsworth,ENGLAND,1028.21,6560.00,13280.00,37340.00,35080.00,26990.00,20450.00,15230.00,3040.00,,157970.00,True +E09000033,Westminster,ENGLAND,1049.55,1660.00,6460.00,15690.00,23130.00,24460.00,19180.00,24500.00,17190.00,,132280.00,True +N09000001,Antrim and Newtownabbey,NORTHERN_IRELAND,,,,,,,,,,,,False +N09000002,"Armagh City, Banbridge and Craigavon",NORTHERN_IRELAND,,,,,,,,,,,,False +N09000003,Belfast,NORTHERN_IRELAND,,,,,,,,,,,,False +N09000004,Causeway Coast and Glens,NORTHERN_IRELAND,,,,,,,,,,,,False +N09000005,Derry City and Strabane,NORTHERN_IRELAND,,,,,,,,,,,,False +N09000006,Fermanagh and Omagh,NORTHERN_IRELAND,,,,,,,,,,,,False +N09000007,Lisburn and Castlereagh,NORTHERN_IRELAND,,,,,,,,,,,,False +N09000008,Mid and East Antrim,NORTHERN_IRELAND,,,,,,,,,,,,False +N09000009,Mid Ulster,NORTHERN_IRELAND,,,,,,,,,,,,False +N09000010,"Newry, Mourne and Down",NORTHERN_IRELAND,,,,,,,,,,,,False +S12000005,Clackmannanshire,SCOTLAND,1594.38,,,,,,,,,,,True +S12000006,Dumfries and Galloway,SCOTLAND,1454.98,,,,,,,,,,,True +S12000008,East Ayrshire,SCOTLAND,1606.44,,,,,,,,,,,True +S12000010,East Lothian,SCOTLAND,1579.18,,,,,,,,,,,True +S12000011,East Renfrewshire,SCOTLAND,1528.44,,,,,,,,,,,True +S12000013,Na h-Eileanan Siar,SCOTLAND,1387.56,,,,,,,,,,,True +S12000014,Falkirk,SCOTLAND,1576.77,,,,,,,,,,,True +S12000017,Highland,SCOTLAND,1527.09,,,,,,,,,,,True +S12000018,Inverclyde,SCOTLAND,1551.30,,,,,,,,,,,True +S12000019,Midlothian,SCOTLAND,1666.20,,,,,,,,,,,True +S12000020,Moray,SCOTLAND,1573.76,,,,,,,,,,,True +S12000021,North Ayrshire,SCOTLAND,1553.77,,,,,,,,,,,True +S12000023,Orkney Islands,SCOTLAND,1574.60,,,,,,,,,,,True +S12000026,Scottish Borders,SCOTLAND,1491.72,,,,,,,,,,,True +S12000027,Shetland Islands,SCOTLAND,1386.67,,,,,,,,,,,True +S12000028,South Ayrshire,SCOTLAND,1569.41,,,,,,,,,,,True +S12000029,South Lanarkshire,SCOTLAND,1378.85,,,,,,,,,,,True +S12000030,Stirling,SCOTLAND,1611.78,,,,,,,,,,,True +S12000033,Aberdeen City,SCOTLAND,1636.27,,,,,,,,,,,True +S12000034,Aberdeenshire,SCOTLAND,1532.76,,,,,,,,,,,True +S12000035,Argyll and Bute,SCOTLAND,1625.64,,,,,,,,,,,True +S12000036,City of Edinburgh,SCOTLAND,1563.51,,,,,,,,,,,True +S12000038,Renfrewshire,SCOTLAND,1572.61,,,,,,,,,,,True +S12000039,West Dunbartonshire,SCOTLAND,1559.86,,,,,,,,,,,True +S12000040,West Lothian,SCOTLAND,1515.45,,,,,,,,,,,True +S12000041,Angus,SCOTLAND,1461.52,,,,,,,,,,,True +S12000042,Dundee City,SCOTLAND,1605.34,,,,,,,,,,,True +S12000045,East Dunbartonshire,SCOTLAND,1599.70,,,,,,,,,,,True +S12000047,Fife,SCOTLAND,1498.76,,,,,,,,,,,True +S12000048,Perth and Kinross,SCOTLAND,1537.04,,,,,,,,,,,True +S12000049,Glasgow City,SCOTLAND,1611.00,,,,,,,,,,,True +S12000050,North Lanarkshire,SCOTLAND,1452.86,,,,,,,,,,,True +W06000001,Isle of Anglesey,WALES,2260.73,4960.00,6930.00,7210.00,7400.00,5540.00,2770.00,1080.00,170.00,60.0,36120.00,True +W06000002,Gwynedd,WALES,2468.77,9310.00,15800.00,12700.00,10720.00,8300.00,4030.00,1280.00,210.00,90.0,62440.00,True +W06000003,Conwy,WALES,2472.82,5460.00,8340.00,15610.00,11970.00,9300.00,5120.00,1940.00,430.00,160.0,58340.00,True +W06000004,Denbighshire,WALES,2339.03,4160.00,7420.00,14970.00,8050.00,5660.00,3920.00,2060.00,320.00,170.0,46720.00,True +W06000005,Flintshire,WALES,2376.17,4520.00,9640.00,20990.00,13400.00,11140.00,7830.00,3230.00,600.00,220.0,71570.00,True +W06000006,Wrexham,WALES,2308.88,4510.00,12770.00,17250.00,10350.00,8270.00,5190.00,2570.00,720.00,290.0,61910.00,True +W06000008,Ceredigion,WALES,2419.45,1780.00,5000.00,7730.00,7570.00,9180.00,3890.00,980.00,110.00,20.0,36260.00,True +W06000009,Pembrokeshire,WALES,2166.15,6730.00,9460.00,14520.00,11520.00,12550.00,6070.00,2120.00,340.00,100.0,63400.00,True +W06000010,Carmarthenshire,WALES,2351.20,9370.00,24550.00,18930.00,14700.00,13440.00,6700.00,2260.00,300.00,70.0,90310.00,True +W06000011,Swansea,WALES,2238.29,17730.00,28650.00,25020.00,17330.00,13200.00,8180.00,3880.00,1200.00,540.0,115730.00,True +W06000012,Neath Port Talbot,WALES,2541.39,13830.00,27500.00,11720.00,7430.00,4580.00,1530.00,540.00,110.00,20.0,67260.00,True +W06000013,Bridgend,WALES,2477.99,10600.00,15370.00,14840.00,11050.00,8020.00,4480.00,1510.00,300.00,110.0,66280.00,True +W06000014,Vale of Glamorgan,WALES,2231.54,1510.00,6680.00,14520.00,11910.00,10790.00,7740.00,5920.00,2270.00,1060.0,62400.00,True +W06000015,Cardiff,WALES,2013.18,5320.00,20420.00,34920.00,37370.00,31540.00,22250.00,10590.00,2850.00,1480.0,166750.00,True +W06000016,Rhondda Cynon Taf,WALES,2289.43,47080.00,25500.00,17510.00,9660.00,7140.00,3520.00,1190.00,200.00,70.0,111860.00,True +W06000018,Caerphilly,WALES,2082.88,15550.00,26890.00,18930.00,9540.00,6840.00,2430.00,840.00,90.00,80.0,81190.00,True +W06000019,Blaenau Gwent,WALES,2531.26,19200.00,8160.00,2730.00,1810.00,900.00,350.00,60.00,,20.0,33230.00,True +W06000020,Torfaen,WALES,2155.68,6300.00,13120.00,12050.00,4350.00,4330.00,2410.00,690.00,70.00,30.0,43340.00,True +W06000021,Monmouthshire,WALES,2416.50,520.00,3450.00,7140.00,9460.00,7660.00,8100.00,5520.00,1790.00,670.0,44300.00,True +W06000022,Newport,WALES,2088.48,6910.00,15400.00,18470.00,12990.00,8560.00,6090.00,2710.00,560.00,190.0,71880.00,True +W06000023,Powys,WALES,2351.72,6090.00,9440.00,13330.00,10630.00,12660.00,9740.00,4180.00,580.00,210.0,66870.00,True +W06000024,Merthyr Tydfil,WALES,2593.60,14150.00,6680.00,2270.00,2210.00,1560.00,580.00,160.00,,10.0,27620.00,True diff --git a/policyengine_uk_data/targets/sources/la_council_tax.py b/policyengine_uk_data/targets/sources/la_council_tax.py index d063116b0..167aed7c8 100644 --- a/policyengine_uk_data/targets/sources/la_council_tax.py +++ b/policyengine_uk_data/targets/sources/la_council_tax.py @@ -6,23 +6,25 @@ (inclusive of all precepts) each household pays in billing authority ``code``. Sourced from MHCLG, Welsh Government and Scottish Government annual publications. -- ``ons/council_tax_band_count/{code}/{band}``: the number of dwellings - in band ``A``–``H`` for billing authority ``code``. Sourced from the - VOA *Council Tax: Stock of Properties* summary tables (England + Wales). +- ``voa/council_tax/{code}/{band}``: the number of dwellings in band + ``A``–``H`` (England) or ``A``–``I`` (Wales) for billing authority + ``code``. Sourced from the VOA *Council Tax: Stock of Properties* + summary tables. Data for all 360 LAs in ``local_authorities_2021.csv`` is joined from the committed canonical file ``storage/la_council_tax.csv``. Rows where -a source did not provide a value are emitted as targets with ``NaN`` -filtered out of the ``values`` dict, so calibrators that look up a -given year / area safely skip them. +a source did not provide a value are omitted so calibrators cleanly +skip them. Known coverage gaps (documented, not bugs): - Northern Ireland is excluded because its domestic rates system is distinct from council tax. - Band-count rows for Scottish LAs are absent because the VOA summary - tables do not cover Scotland; Scottish Assessors publishes - per-LA chargeable-dwellings data separately and is a follow-up. + tables do not cover Scotland; Scottish Assessors publishes per-LA + chargeable-dwellings data separately and is a follow-up. +- Band I only exists in Wales (introduced in the 2005 Welsh revaluation); + English rows leave it null. - City of London has Band A suppressed by VOA for disclosure control; its other bands are populated. @@ -39,6 +41,8 @@ from __future__ import annotations +from functools import lru_cache + import pandas as pd from policyengine_uk_data.targets.schema import ( @@ -60,14 +64,7 @@ _YEAR_BAND_COUNT = 2025 _BAND_COUNT_COLUMNS = { - "A": "band_A", - "B": "band_B", - "C": "band_C", - "D": "band_D_count", - "E": "band_E", - "F": "band_F", - "G": "band_G", - "H": "band_H", + band: f"count_band_{band}" for band in "ABCDEFGHI" } _ENGLAND_REF = ( @@ -81,6 +78,7 @@ ) +@lru_cache(maxsize=1) def _load_table() -> pd.DataFrame | None: """Return the committed LA council-tax table, or ``None`` if missing.""" csv_path = STORAGE / _CSV_NAME @@ -144,8 +142,8 @@ def get_targets() -> list[Target]: continue targets.append( Target( - name=f"ons/council_tax_band_count/{code}/{band}", - variable="council_tax_band_count", + name=f"voa/council_tax/{code}/{band}", + variable="council_tax_band", source="voa", unit=Unit.COUNT, geographic_level=GeographicLevel.LOCAL_AUTHORITY, @@ -153,7 +151,6 @@ def get_targets() -> list[Target]: geo_name=name, values={_YEAR_BAND_COUNT: float(count)}, is_count=True, - breakdown_variable=f"council_tax_band_{band}", reference_url=_VOA_REF, ) ) diff --git a/policyengine_uk_data/tests/test_la_council_tax_targets.py b/policyengine_uk_data/tests/test_la_council_tax_targets.py index c49fbb064..7cdc59e7b 100644 --- a/policyengine_uk_data/tests/test_la_council_tax_targets.py +++ b/policyengine_uk_data/tests/test_la_council_tax_targets.py @@ -53,14 +53,15 @@ def test_csv_has_every_expected_column(la_ct_df): "country", "band_d_amount", "has_council_tax", - "band_A", - "band_B", - "band_C", - "band_D_count", - "band_E", - "band_F", - "band_G", - "band_H", + "count_band_A", + "count_band_B", + "count_band_C", + "count_band_D", + "count_band_E", + "count_band_F", + "count_band_G", + "count_band_H", + "count_band_I", "total_dwellings", } assert expected.issubset(la_ct_df.columns), ( @@ -126,14 +127,15 @@ def test_isles_of_scilly_dwellings_are_thousands_not_millions(la_ct_df): def test_band_counts_sum_to_total(la_ct_df): - """For rows with band data, Σ(bands A-H) should equal total_dwellings - (within rounding from the 10-property suppression at the lowest counts). + """Σ(count_band_A..I) should equal the VOA-sourced total_dwellings + for every row with band data. VOA rounds per-band counts to the + nearest 10 while the total is independently rounded, so up to + 20 dwellings of slack is expected. """ have_bands = la_ct_df.dropna(subset=["total_dwellings"]).copy() band_cols = list(_BAND_COUNT_COLUMNS.values()) have_bands["sum_bands"] = have_bands[band_cols].fillna(0).sum(axis=1) diff = (have_bands["total_dwellings"] - have_bands["sum_bands"]).abs() - # Allow up to 20 dwellings of slack for VOA rounding / suppression. assert diff.max() <= 20, ( f"Band totals disagree by up to {int(diff.max())}; worst rows: " f"{have_bands.loc[diff == diff.max(), ['code', 'name', 'total_dwellings', 'sum_bands']].head(3).to_dict('records')}" @@ -190,6 +192,38 @@ def test_wandsworth_and_westminster_are_lowest_in_england(la_ct_df): ) +def test_welsh_las_have_band_i(la_ct_df): + """Wales has council tax bands A–I (2005 revaluation); every Welsh + LA must carry a non-null count_band_I. Regression for the Band I + drop that slipped into an earlier revision of this PR. + """ + welsh = la_ct_df[la_ct_df["country"] == "WALES"] + missing = welsh[welsh["count_band_I"].isna()][["code", "name"]].to_dict("records") + assert not missing, f"Welsh LAs missing Band I: {missing}" + + +def test_english_las_have_no_band_i(la_ct_df): + """England has 8 council tax bands (A–H). count_band_I must be null + for every English row so we don't accidentally inject made-up counts. + """ + eng = la_ct_df[la_ct_df["country"] == "ENGLAND"] + populated = eng[eng["count_band_I"].notna()][["code", "name"]].to_dict("records") + assert not populated, f"English LAs must not have Band I: {populated}" + + +def test_cardiff_band_i_matches_published_figure(la_ct_df): + """Cardiff is the largest Welsh LA and has the highest Band I count + (~1,480 per VOA 2025). Specific spot-check against the published value + so a truncated or swapped-row source is caught immediately. + """ + cardiff = la_ct_df[la_ct_df["code"] == "W06000015"] + assert len(cardiff) == 1 + band_i = float(cardiff["count_band_I"].iloc[0]) + assert 1_400 <= band_i <= 1_600, ( + f"Cardiff count_band_I = {band_i:.0f}; VOA 2025 publishes 1,480" + ) + + def test_scottish_band_d_is_lower_than_english_on_average(la_ct_df): """Scotland's Band D is typically ~£1,500, well below England ~£2,400.""" en_mean = la_ct_df[la_ct_df["country"] == "ENGLAND"]["band_d_amount"].mean() @@ -214,8 +248,7 @@ def test_band_d_target_count_matches_csv(la_ct_df): def test_band_count_target_count_matches_csv(la_ct_df): targets = get_targets() - bc_targets = [t for t in targets if "council_tax_band_count/" in t.name] - # Expected = sum across all 8 bands of non-NaN counts. + bc_targets = [t for t in targets if t.name.startswith("voa/council_tax/")] expected = int(la_ct_df[list(_BAND_COUNT_COLUMNS.values())].notna().sum().sum()) assert len(bc_targets) == expected @@ -234,7 +267,7 @@ def test_band_d_targets_use_gbp_unit(): def test_band_count_targets_use_count_unit_and_is_count_flag(): for target in get_targets(): - if "council_tax_band_count/" in target.name: + if target.name.startswith("voa/council_tax/"): assert target.unit == Unit.COUNT assert target.is_count is True @@ -250,7 +283,7 @@ def test_every_band_count_target_value_within_sensible_range(): where a national total leaked into a row, à la #371. """ for target in get_targets(): - if "council_tax_band_count/" not in target.name: + if not target.name.startswith("voa/council_tax/"): continue for year, value in target.values.items(): assert 0 <= value <= 500_000, ( From e70433e7aa605cc66ad8daf6c3bf449e61259a88 Mon Sep 17 00:00:00 2001 From: Vahid Ahmadi Date: Thu, 23 Apr 2026 13:59:24 +0100 Subject: [PATCH 03/10] Satisfy ruff format on la_council_tax.py --- policyengine_uk_data/targets/sources/la_council_tax.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/policyengine_uk_data/targets/sources/la_council_tax.py b/policyengine_uk_data/targets/sources/la_council_tax.py index 167aed7c8..982cc83ab 100644 --- a/policyengine_uk_data/targets/sources/la_council_tax.py +++ b/policyengine_uk_data/targets/sources/la_council_tax.py @@ -63,9 +63,7 @@ _YEAR_BAND_D_SCOTLAND = 2025 _YEAR_BAND_COUNT = 2025 -_BAND_COUNT_COLUMNS = { - band: f"count_band_{band}" for band in "ABCDEFGHI" -} +_BAND_COUNT_COLUMNS = {band: f"count_band_{band}" for band in "ABCDEFGHI"} _ENGLAND_REF = ( "https://www.gov.uk/government/statistics/" From b6bab430c4dc4f45b770816fcd7ac4b71a3a7212 Mon Sep 17 00:00:00 2001 From: Vahid Ahmadi Date: Mon, 27 Apr 2026 10:15:18 +0100 Subject: [PATCH 04/10] Wire LA council-tax band-count targets into the calibration loss matrix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The targets registered in la_council_tax.py were inert — the LA target matrix had no columns for them, so the reweighter could not see them. This wires the eight VOA Council Tax Stock-of-Properties band-count targets (A-H) into the LA loss matrix: - matrix entry: per-household indicator 1[council_tax_band == B] from policyengine-uk. - y entry: 360-vector of per-LA dwelling counts from storage/la_council_tax.csv. For LAs without VOA data — Scottish LAs (the VOA summary tables don't cover Scotland) and Northern Irish LAs (no council tax) — the value falls back to national_count × la_household_share, matching the existing tenure block's fallback pattern. Two targets are deliberately not wired in this pass: - Band I — Wales-only and mostly null in the CSV. - The Band D £ amount (ons/council_tax_band_d/{code}) — a per-rate quantity that does not fit the linear matrix-times-weights aggregation. Wiring it as total council-tax revenue would need Scotland-specific band ratios (different from England/Wales after 2017) and is worth a separate PR. New tests in test_la_loss_council_tax.py cover both layers: - Light: CSV joins to every LA code, the eight count_band_{X} columns exist, E/W rows are populated, Scotland is null as documented, and NI has has_council_tax=False. - Full build (gated on enhanced FRS fixture): all eight columns present in matrix and y; y vectors length 360, finite and positive; matrix entries are 0/1 indicators with rows summing to ≤1; y matches the CSV verbatim for an English LA (Hartlepool); Scotland and NI LAs receive a positive fallback rather than NaN or zero. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../local_areas/local_authorities/loss.py | 28 +++ .../tests/test_la_loss_council_tax.py | 217 ++++++++++++++++++ 2 files changed, 245 insertions(+) create mode 100644 policyengine_uk_data/tests/test_la_loss_council_tax.py diff --git a/policyengine_uk_data/datasets/local_areas/local_authorities/loss.py b/policyengine_uk_data/datasets/local_areas/local_authorities/loss.py index fd5ed9440..91df6a475 100644 --- a/policyengine_uk_data/datasets/local_areas/local_authorities/loss.py +++ b/policyengine_uk_data/datasets/local_areas/local_authorities/loss.py @@ -11,6 +11,7 @@ - ONS income: ONS small area income estimates - Tenure: English Housing Survey - Private rent: VOA/ONS private rental market statistics +- Council tax bands A-H: VOA Council Tax Stock of Properties (per LA) """ from policyengine_uk import Microsimulation @@ -252,6 +253,33 @@ def create_local_authority_target_matrix( national_rent * la_household_share, ) + # ── Council tax band counts (LA targets) ─────────────────────── + # Per-LA dwellings in each band A-H from VOA Council Tax Stock of + # Properties. Scotland LAs have no VOA band data and Northern Ireland + # has no council tax — both fall back to national-share estimation, + # matching the tenure block's pattern. Band I is Wales-only and + # rarely populated, so it is intentionally excluded. + ct_path = STORAGE_FOLDER / "la_council_tax.csv" + if ct_path.exists(): + ct_data = pd.read_csv(ct_path) + ct_merged = la_codes.merge( + ct_data[["code"] + [f"count_band_{b}" for b in "ABCDEFGH"]], + on="code", + how="left", + ) + ct_band = sim.calculate("council_tax_band").values + for band in "ABCDEFGH": + col = f"voa/council_tax/{band}" + matrix[col] = (ct_band == band).astype(float) + csv_col = f"count_band_{band}" + has_count = ct_merged[csv_col].notna().values + national = (original_weights * matrix[col].values).sum() + y[col] = np.where( + has_count, + ct_merged[csv_col].values, + national * la_household_share, + ) + # ── Country mask ─────────────────────────────────────────────── country_mask = create_country_mask( household_countries=sim.calculate("country").values, diff --git a/policyengine_uk_data/tests/test_la_loss_council_tax.py b/policyengine_uk_data/tests/test_la_loss_council_tax.py new file mode 100644 index 000000000..fee38c3af --- /dev/null +++ b/policyengine_uk_data/tests/test_la_loss_council_tax.py @@ -0,0 +1,217 @@ +"""Tests for the LA-level council-tax band-count columns wired into the +local-authority calibration loss matrix. + +Layered like test_la_loss_land_value.py: + +1. Light checks against la_council_tax.csv — exercise the data shape + the loss-matrix code relies on without needing a Microsimulation. +2. Full ``create_local_authority_target_matrix`` build, gated on the + enhanced FRS fixture so CI environments without the dataset skip + gracefully. + +Note: only bands A-H are wired. Band I is Wales-only and mostly null, +and the Band D ``£`` amount is a per-rate quantity that does not fit +the linear matrix-times-weights aggregation — both are deliberately +out of scope for this PR. +""" + +import numpy as np +import pandas as pd +import pytest + +from policyengine_uk_data.storage import STORAGE_FOLDER + + +CT_DATA = pd.read_csv(STORAGE_FOLDER / "la_council_tax.csv") +LA_CODES = pd.read_csv(STORAGE_FOLDER / "local_authorities_2021.csv") +WIRED_BANDS = list("ABCDEFGH") + + +# ── Layer 1: CSV shape and joinability ─────────────────────────────── + + +def test_csv_has_a_row_for_every_la_code(): + """The CSV must cover every LA in local_authorities_2021.csv so the + left-merge inside loss.py never produces NaN-only rows in the + has_count branch.""" + missing = set(LA_CODES["code"]) - set(CT_DATA["code"]) + assert not missing, ( + f"LA codes missing from la_council_tax.csv: {sorted(missing)[:5]}" + ) + + +def test_band_count_columns_exist_for_every_wired_band(): + """Every wired band needs a count_band_{X} column, otherwise the loss + matrix loop will KeyError on missing CSV columns.""" + for band in WIRED_BANDS: + assert f"count_band_{band}" in CT_DATA.columns + + +def test_england_and_wales_have_band_a_to_h_populated(): + """E/W rows should have non-null counts for A-H. If the CSV regresses + to NaN there, the loss matrix will silently fall back to the + national-share estimate and the calibrator loses its real signal.""" + ew = CT_DATA[CT_DATA["country"].isin(["ENGLAND", "WALES"])] + for band in WIRED_BANDS: + non_null = ew[f"count_band_{band}"].notna().sum() + # City of London suppresses Band A; allow up to 5 missing per band. + assert non_null >= len(ew) - 5, ( + f"Band {band}: only {non_null}/{len(ew)} E/W LAs have a count" + ) + + +def test_scotland_band_counts_are_null_as_documented(): + """Scotland VOA band counts are absent — they should consistently be + NaN so the loss matrix routes them through the fallback.""" + scotland = CT_DATA[CT_DATA["country"] == "SCOTLAND"] + for band in WIRED_BANDS: + assert scotland[f"count_band_{band}"].isna().all(), ( + f"Band {band}: Scotland rows unexpectedly populated" + ) + + +def test_ni_council_tax_disabled(): + """NI uses domestic rates, not council tax. has_council_tax must be + False for every NI row, otherwise downstream code may try to read + targets that do not exist.""" + ni = CT_DATA[CT_DATA["country"] == "NORTHERN_IRELAND"] + assert not ni.empty + assert (ni["has_council_tax"] == False).all() # noqa: E712 + + +# ── Layer 2: full LA loss matrix build ─────────────────────────────── + + +def test_la_loss_matrix_includes_all_wired_band_columns(enhanced_frs): + """matrix and y must expose voa/council_tax/{A..H} for the calibrator + to train on the new targets.""" + from policyengine_uk_data.datasets.local_areas.local_authorities.loss import ( + create_local_authority_target_matrix, + ) + + matrix, y, _ = create_local_authority_target_matrix( + enhanced_frs, time_period=enhanced_frs.time_period + ) + for band in WIRED_BANDS: + col = f"voa/council_tax/{band}" + assert col in matrix.columns, f"missing matrix column {col}" + assert col in y.columns, f"missing y column {col}" + + +def test_la_loss_band_y_vectors_length_360(enhanced_frs): + from policyengine_uk_data.datasets.local_areas.local_authorities.loss import ( + create_local_authority_target_matrix, + ) + + _, y, _ = create_local_authority_target_matrix( + enhanced_frs, time_period=enhanced_frs.time_period + ) + for band in WIRED_BANDS: + assert len(y[f"voa/council_tax/{band}"]) == 360 + + +def test_la_loss_band_y_finite_and_positive(enhanced_frs): + """No NaNs / negatives in y. Scotland and NI cells must be filled by + the fallback (national_band_count × la_household_share).""" + from policyengine_uk_data.datasets.local_areas.local_authorities.loss import ( + create_local_authority_target_matrix, + ) + + _, y, _ = create_local_authority_target_matrix( + enhanced_frs, time_period=enhanced_frs.time_period + ) + for band in WIRED_BANDS: + col = f"voa/council_tax/{band}" + assert np.isfinite(y[col]).all(), f"{col}: NaN/inf in y" + assert (y[col] > 0).all(), f"{col}: non-positive y values" + + +def test_la_loss_band_matrix_columns_are_indicators(enhanced_frs): + """matrix entries are 0 or 1 (the household either is or isn't in band X).""" + from policyengine_uk_data.datasets.local_areas.local_authorities.loss import ( + create_local_authority_target_matrix, + ) + + matrix, _, _ = create_local_authority_target_matrix( + enhanced_frs, time_period=enhanced_frs.time_period + ) + for band in WIRED_BANDS: + col = f"voa/council_tax/{band}" + unique = set(np.unique(matrix[col].values)) + assert unique <= {0.0, 1.0}, f"{col}: non-indicator values {unique}" + + +def test_la_loss_band_matrix_rows_sum_to_at_most_one(enhanced_frs): + """Each household sits in at most one band. Summing the wired band + columns across each household should be 0 or 1.""" + from policyengine_uk_data.datasets.local_areas.local_authorities.loss import ( + create_local_authority_target_matrix, + ) + + matrix, _, _ = create_local_authority_target_matrix( + enhanced_frs, time_period=enhanced_frs.time_period + ) + band_sum = sum(matrix[f"voa/council_tax/{b}"] for b in WIRED_BANDS) + assert ((band_sum == 0) | (band_sum == 1)).all() + + +def test_la_loss_band_y_matches_csv_for_english_la(enhanced_frs): + """For an English LA with VOA data, y[band] must be the CSV value + verbatim — not the national-share fallback.""" + from policyengine_uk_data.datasets.local_areas.local_authorities.loss import ( + create_local_authority_target_matrix, + ) + + _, y, _ = create_local_authority_target_matrix( + enhanced_frs, time_period=enhanced_frs.time_period + ) + + # Hartlepool — first LA in local_authorities_2021.csv, VOA-covered. + target_code = "E06000001" + la_index = LA_CODES.index[LA_CODES["code"] == target_code][0] + ct_row = CT_DATA[CT_DATA["code"] == target_code].iloc[0] + for band in WIRED_BANDS: + expected = float(ct_row[f"count_band_{band}"]) + actual = float(y[f"voa/council_tax/{band}"].iloc[la_index]) + assert actual == pytest.approx(expected, rel=0, abs=0.5), ( + f"{target_code} band {band}: y={actual}, CSV={expected}" + ) + + +def test_la_loss_band_y_uses_fallback_for_scotland(enhanced_frs): + """Scottish LAs have no VOA band counts; y must use the + national_band_count × la_household_share fallback rather than NaN + or 0.""" + from policyengine_uk_data.datasets.local_areas.local_authorities.loss import ( + create_local_authority_target_matrix, + ) + + _, y, _ = create_local_authority_target_matrix( + enhanced_frs, time_period=enhanced_frs.time_period + ) + + scotland_la = CT_DATA[CT_DATA["country"] == "SCOTLAND"]["code"].iloc[0] + la_index = LA_CODES.index[LA_CODES["code"] == scotland_la][0] + for band in WIRED_BANDS: + val = float(y[f"voa/council_tax/{band}"].iloc[la_index]) + assert val > 0, ( + f"Scotland LA {scotland_la} band {band}: fallback produced {val}" + ) + + +def test_la_loss_band_y_uses_fallback_for_ni(enhanced_frs): + """NI LAs have no council tax data at all; y must still be positive + via the fallback (the country mask zeroes the prediction anyway).""" + from policyengine_uk_data.datasets.local_areas.local_authorities.loss import ( + create_local_authority_target_matrix, + ) + + _, y, _ = create_local_authority_target_matrix( + enhanced_frs, time_period=enhanced_frs.time_period + ) + + ni_la = CT_DATA[CT_DATA["country"] == "NORTHERN_IRELAND"]["code"].iloc[0] + la_index = LA_CODES.index[LA_CODES["code"] == ni_la][0] + for band in WIRED_BANDS: + val = float(y[f"voa/council_tax/{band}"].iloc[la_index]) + assert val > 0, f"NI LA {ni_la} band {band}: fallback produced {val}" From 7f39a73d2a0c298b75232aeddb8391511d83935d Mon Sep 17 00:00:00 2001 From: Vahid Ahmadi Date: Wed, 29 Apr 2026 13:31:47 +0100 Subject: [PATCH 05/10] =?UTF-8?q?Add=20LA-level=20net=20council=20tax=20?= =?UTF-8?q?=C2=A3=20target=20alongside=20band=20counts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wires the second FRS data point into the LA reweighter, addressing the 28 Apr standup ALIGNED decision: "calibrate the two FRS data points as the council tax information is provided after deductions." Both sides of the new constraint are net of CTR: - matrix col = council_tax_less_benefit (gross − CTR benefit) - y = directly observed net council tax requirement per LA Sources (no national-total apportionment, all directly published): - England (296 LAs): MHCLG Council Taxbase 2025, Table 1.35 "Tax base after allowance for council tax support" × Band D amount. Sums to £47.4bn, within 3.4% of the MHCLG Table 1 published England Council Tax Requirement of £45.86bn (small gap from year mismatch: 2025 taxbase × 2026-27 Band D). - Wales (22 LAs): Welsh Government "Council Tax Levels April 2026 to March 2027" Table 3 "Council tax income (£m)". Sums to £2.45bn. - Scotland (32) and NI (10): no source wired; loss.py routes through the existing national × la_household_share fallback, same pattern as the band-count target and the rent target. Mirrors the rent block in loss.py: load CSV → merge into ct_merged → matrix col / y assignment / has_data mask / national-share fallback. Files: - storage/la_council_tax.csv: new column total_council_tax_net. - targets/sources/la_council_tax.py: load_la_net_council_tax() + Target objects named housing/council_tax_net/{code}. - datasets/local_areas/local_authorities/loss.py: housing/council_tax_net block immediately after the band-count block. - tests/test_la_loss_council_tax.py: 11 new tests (4 layer-1 + 7 layer-2) covering CSV column presence, country coverage, value range, England-total ballpark vs MHCLG, matrix-col correctness, na-fallback behaviour, calibratability sanity check. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../local_areas/local_authorities/loss.py | 34 +- .../storage/la_council_tax.csv | 722 +++++++++--------- .../targets/sources/la_council_tax.py | 52 ++ .../tests/test_la_loss_council_tax.py | 169 ++++ 4 files changed, 615 insertions(+), 362 deletions(-) diff --git a/policyengine_uk_data/datasets/local_areas/local_authorities/loss.py b/policyengine_uk_data/datasets/local_areas/local_authorities/loss.py index 91df6a475..c2b09386f 100644 --- a/policyengine_uk_data/datasets/local_areas/local_authorities/loss.py +++ b/policyengine_uk_data/datasets/local_areas/local_authorities/loss.py @@ -12,6 +12,8 @@ - Tenure: English Housing Survey - Private rent: VOA/ONS private rental market statistics - Council tax bands A-H: VOA Council Tax Stock of Properties (per LA) +- Council tax £ paid (net of CTR): MHCLG taxbase × Band D (England), + Welsh Government Council Tax Income (Wales) """ from policyengine_uk import Microsimulation @@ -263,7 +265,15 @@ def create_local_authority_target_matrix( if ct_path.exists(): ct_data = pd.read_csv(ct_path) ct_merged = la_codes.merge( - ct_data[["code"] + [f"count_band_{b}" for b in "ABCDEFGH"]], + ct_data[ + ["code"] + + [f"count_band_{b}" for b in "ABCDEFGH"] + + ( + ["total_council_tax_net"] + if "total_council_tax_net" in ct_data.columns + else [] + ) + ], on="code", how="left", ) @@ -280,6 +290,28 @@ def create_local_authority_target_matrix( national * la_household_share, ) + # ── Council tax £ paid, net of CTR (LA targets) ──────────── + # Mirrors the private-rent block: directly observed LA-level + # net council tax revenue from MHCLG (England) and Welsh + # Government (Wales). Scotland and NI fall back to + # national_share, same pattern as the tenure target. + # Matrix col uses council_tax_less_benefit (net of CTR award) + # so both sides of the constraint are net, per Max's standup + # decision (28 Apr) on FRS-net-of-CTR alignment. + if "total_council_tax_net" in ct_merged.columns: + matrix["housing/council_tax_net"] = sim.calculate( + "council_tax_less_benefit" + ).values + has_ct_net = ct_merged["total_council_tax_net"].notna().values + national_ct_net = ( + original_weights * matrix["housing/council_tax_net"].values + ).sum() + y["housing/council_tax_net"] = np.where( + has_ct_net, + ct_merged["total_council_tax_net"].values, + national_ct_net * la_household_share, + ) + # ── Country mask ─────────────────────────────────────────────── country_mask = create_country_mask( household_countries=sim.calculate("country").values, diff --git a/policyengine_uk_data/storage/la_council_tax.csv b/policyengine_uk_data/storage/la_council_tax.csv index 8c9739fa3..a4142e223 100644 --- a/policyengine_uk_data/storage/la_council_tax.csv +++ b/policyengine_uk_data/storage/la_council_tax.csv @@ -1,361 +1,361 @@ -code,name,country,band_d_amount,count_band_A,count_band_B,count_band_C,count_band_D,count_band_E,count_band_F,count_band_G,count_band_H,count_band_I,total_dwellings,has_council_tax -E06000001,Hartlepool,ENGLAND,2560.20,24090.00,7830.00,6780.00,3630.00,2070.00,930.00,700.00,110.00,,46140.00,True -E06000002,Middlesbrough,ENGLAND,2549.16,33080.00,11550.00,11610.00,5620.00,2810.00,1040.00,600.00,50.00,,66360.00,True -E06000003,Redcar and Cleveland,ENGLAND,2544.48,26840.00,13800.00,14820.00,6090.00,3610.00,1070.00,420.00,30.00,,66660.00,True -E06000004,Stockton-on-Tees,ENGLAND,2589.83,34900.00,17560.00,16890.00,10400.00,6430.00,3000.00,1610.00,130.00,,90910.00,True -E06000005,Darlington,ENGLAND,2493.83,23160.00,11180.00,7800.00,5950.00,3590.00,1400.00,680.00,50.00,,53820.00,True -E06000006,Halton,ENGLAND,2366.61,27340.00,12760.00,8370.00,5230.00,3890.00,1270.00,360.00,40.00,,59260.00,True -E06000007,Warrington,ENGLAND,2447.61,27780.00,21410.00,19980.00,12400.00,7960.00,4900.00,2730.00,230.00,,97390.00,True -E06000008,Blackburn with Darwen,ENGLAND,2455.27,35860.00,9950.00,9010.00,4960.00,2780.00,840.00,580.00,70.00,,64050.00,True -E06000009,Blackpool,ENGLAND,2513.22,32210.00,21330.00,11480.00,4860.00,1950.00,580.00,250.00,30.00,,72700.00,True -E06000010,"Kingston upon Hull, City of",ENGLAND,2295.04,82540.00,24430.00,11440.00,4990.00,1410.00,320.00,60.00,40.00,,125230.00,True -E06000011,East Riding of Yorkshire,ENGLAND,2466.08,40330.00,38430.00,33140.00,25660.00,17380.00,7740.00,3440.00,300.00,,166420.00,True -E06000012,North East Lincolnshire,ENGLAND,2483.85,38690.00,18400.00,9390.00,5330.00,2520.00,980.00,510.00,60.00,,75880.00,True -E06000013,North Lincolnshire,ENGLAND,2348.46,35920.00,16440.00,11580.00,7850.00,4020.00,1720.00,550.00,30.00,,78110.00,True -E06000014,York,ENGLAND,2287.15,13150.00,25560.00,27300.00,13880.00,8030.00,3830.00,1930.00,140.00,,93800.00,True -E06000015,Derby,ENGLAND,2306.00,58500.00,22270.00,17230.00,8900.00,4850.00,2340.00,710.00,50.00,,114860.00,True -E06000016,Leicester,ENGLAND,2528.75,86990.00,28270.00,16960.00,7340.00,3570.00,1590.00,620.00,60.00,,145410.00,True -E06000017,Rutland,ENGLAND,2737.58,1750.00,4890.00,3340.00,2570.00,2400.00,1690.00,1360.00,170.00,,18160.00,True -E06000018,Nottingham,ENGLAND,2755.39,92180.00,25740.00,17180.00,7790.00,2660.00,1120.00,760.00,120.00,,147540.00,True -E06000019,"Herefordshire, County of",ENGLAND,2574.37,14040.00,20630.00,17710.00,13820.00,12660.00,7680.00,3800.00,190.00,,90520.00,True -E06000020,Telford and Wrekin,ENGLAND,2256.26,26960.00,22860.00,14900.00,10050.00,5870.00,2570.00,1210.00,60.00,,84480.00,True -E06000021,Stoke-on-Trent,ENGLAND,2183.12,70450.00,25560.00,15880.00,5100.00,1980.00,560.00,200.00,40.00,,119780.00,True -E06000022,Bath and North East Somerset,ENGLAND,2383.42,9370.00,19630.00,21290.00,14500.00,10460.00,5980.00,5210.00,460.00,,86890.00,True -E06000023,"Bristol, City of",ENGLAND,2713.68,56890.00,76330.00,41320.00,19900.00,10120.00,4940.00,2900.00,360.00,,212750.00,True -E06000024,North Somerset,ENGLAND,2491.22,13940.00,22140.00,23810.00,18060.00,13390.00,6880.00,3470.00,290.00,,101970.00,True -E06000025,South Gloucestershire,ENGLAND,2550.59,14480.00,37160.00,30510.00,24250.00,13700.00,6630.00,2210.00,200.00,,129130.00,True -E06000026,Plymouth,ENGLAND,2441.85,48160.00,33380.00,23670.00,10310.00,5250.00,1890.00,620.00,60.00,,123360.00,True -E06000027,Torbay,ENGLAND,2470.25,13790.00,17850.00,17180.00,10750.00,5450.00,2420.00,1290.00,140.00,,68860.00,True -E06000030,Swindon,ENGLAND,2438.10,15190.00,28070.00,25270.00,18530.00,9640.00,4020.00,1500.00,70.00,,102290.00,True -E06000031,Peterborough,ENGLAND,2293.47,35930.00,22730.00,15460.00,9010.00,4930.00,2030.00,1070.00,80.00,,91240.00,True -E06000032,Luton,ENGLAND,2439.93,21520.00,28100.00,22860.00,8000.00,3520.00,1130.00,290.00,30.00,,85450.00,True -E06000033,Southend-on-Sea,ENGLAND,2265.17,17170.00,16180.00,24770.00,12900.00,6820.00,3710.00,1640.00,130.00,,83310.00,True -E06000034,Thurrock,ENGLAND,2254.68,7540.00,14110.00,27720.00,12800.00,4860.00,2320.00,890.00,60.00,,70300.00,True -E06000035,Medway,ENGLAND,2328.55,11470.00,38870.00,35530.00,19470.00,10230.00,4420.00,1560.00,60.00,,121600.00,True -E06000036,Bracknell Forest,ENGLAND,2264.80,1650.00,5660.00,19880.00,10500.00,8670.00,5450.00,2690.00,310.00,,54820.00,True -E06000037,West Berkshire,ENGLAND,2505.37,2750.00,7290.00,20500.00,17840.00,10950.00,7120.00,4880.00,780.00,,72100.00,True -E06000038,Reading,ENGLAND,2612.77,7270.00,14990.00,31530.00,12220.00,5920.00,3390.00,1910.00,100.00,,77330.00,True -E06000039,Slough,ENGLAND,2414.44,1560.00,10950.00,24390.00,13670.00,4700.00,1730.00,360.00,10.00,,57370.00,True -E06000040,Windsor and Maidenhead,ENGLAND,1952.62,2140.00,4110.00,10700.00,16670.00,13590.00,8410.00,9970.00,2020.00,,67610.00,True -E06000041,Wokingham,ENGLAND,2497.70,2030.00,4250.00,12130.00,21120.00,17040.00,11160.00,6830.00,570.00,,75140.00,True -E06000042,Milton Keynes,ENGLAND,2372.21,18060.00,35810.00,32280.00,16440.00,13300.00,7180.00,3240.00,180.00,,126480.00,True -E06000043,Brighton and Hove,ENGLAND,2580.54,30090.00,30490.00,35410.00,20470.00,11720.00,4830.00,2840.00,220.00,,136070.00,True -E06000044,Portsmouth,ENGLAND,2291.71,27460.00,31800.00,22440.00,6280.00,3790.00,1660.00,660.00,60.00,,94150.00,True -E06000045,Southampton,ENGLAND,2381.48,36920.00,35880.00,23760.00,9790.00,3200.00,1420.00,450.00,30.00,,111450.00,True -E06000046,Isle of Wight,ENGLAND,2625.79,10650.00,18690.00,18000.00,13460.00,7340.00,3290.00,1570.00,150.00,,73150.00,True -E06000047,County Durham,ENGLAND,2622.15,144190.00,36650.00,32590.00,23630.00,11500.00,4490.00,2310.00,280.00,,255650.00,True -E06000049,Cheshire East,ENGLAND,2454.87,31710.00,39250.00,37540.00,28220.00,23520.00,15410.00,13130.00,2010.00,,190790.00,True -E06000050,Cheshire West and Chester,ENGLAND,2517.33,35320.00,39140.00,33010.00,22530.00,17600.00,10540.00,8110.00,640.00,,166880.00,True -E06000051,Shropshire,ENGLAND,2528.18,27440.00,38890.00,31760.00,22070.00,17630.00,9370.00,4830.00,360.00,,152340.00,True -E06000052,Cornwall,ENGLAND,2590.93,66210.00,73220.00,61520.00,45030.00,26830.00,9650.00,4430.00,450.00,,287330.00,True -E06000053,Isles of Scilly,ENGLAND,2047.96,10.00,40.00,110.00,270.00,330.00,270.00,130.00,10.00,,1170.00,True -E06000054,Wiltshire,ENGLAND,2571.78,27030.00,42950.00,58820.00,41200.00,31680.00,18490.00,11570.00,1370.00,,233110.00,True -E06000055,Bedford,ENGLAND,2471.74,10800.00,19080.00,20170.00,12480.00,8960.00,5790.00,3290.00,250.00,,80820.00,True -E06000056,Central Bedfordshire,ENGLAND,2516.16,11290.00,25640.00,36860.00,26700.00,17800.00,10200.00,5700.00,410.00,,134600.00,True -E06000057,Northumberland,ENGLAND,2596.94,70860.00,26550.00,21800.00,18410.00,12210.00,7600.00,4550.00,590.00,,162560.00,True -E06000058,"Bournemouth, Christchurch and Poole",ENGLAND,2435.58,26730.00,34610.00,54390.00,36070.00,21890.00,9450.00,5820.00,1310.00,,190260.00,True -E06000059,Dorset,ENGLAND,2765.02,20840.00,31970.00,43430.00,37400.00,28890.00,16160.00,8230.00,740.00,,187640.00,True -E06000060,Buckinghamshire,ENGLAND,2526.58,6970.00,26310.00,54560.00,47150.00,36730.00,29170.00,31530.00,6160.00,,238580.00,True -E06000061,North Northamptonshire,ENGLAND,2423.96,48480.00,42960.00,29500.00,18750.00,12750.00,5530.00,3060.00,280.00,,161300.00,True -E06000062,West Northamptonshire,ENGLAND,2486.66,38700.00,41080.00,46110.00,24480.00,17970.00,10680.00,6520.00,490.00,,186010.00,True -E06000063,Cumberland,ENGLAND,2511.32,64010.00,25940.00,20470.00,15630.00,8470.00,2980.00,980.00,80.00,,138560.00,True -E06000064,Westmorland and Furness,ENGLAND,2507.99,29300.00,24520.00,23280.00,17770.00,12750.00,6480.00,3440.00,340.00,,117860.00,True -E06000065,North Yorkshire,ENGLAND,2544.34,48920.00,65620.00,70150.00,46130.00,37890.00,22340.00,14070.00,1310.00,,306440.00,True -E06000066,Somerset,ENGLAND,2560.59,43360.00,72220.00,59900.00,40390.00,31050.00,16940.00,7820.00,520.00,,272210.00,True -E07000008,Cambridge,ENGLAND,2467.02,4420.00,11090.00,20890.00,10610.00,6060.00,3990.00,3270.00,510.00,,60840.00,True -E07000009,East Cambridgeshire,ENGLAND,2485.18,5000.00,11670.00,8580.00,7610.00,5110.00,2460.00,820.00,90.00,,41350.00,True -E07000010,Fenland,ENGLAND,2537.74,17450.00,13190.00,9030.00,4960.00,2520.00,710.00,190.00,30.00,,48060.00,True -E07000011,Huntingdonshire,ENGLAND,2556.40,12600.00,21820.00,19420.00,12970.00,10360.00,4490.00,2010.00,180.00,,83840.00,True -E07000012,South Cambridgeshire,ENGLAND,2536.25,2780.00,8620.00,22500.00,13830.00,12340.00,8670.00,4900.00,420.00,,74060.00,True -E07000032,Amber Valley,ENGLAND,2407.69,22980.00,12960.00,11020.00,7050.00,3630.00,1940.00,1550.00,140.00,,61270.00,True -E07000033,Bolsover,ENGLAND,2559.41,22440.00,6910.00,4880.00,3040.00,1150.00,350.00,150.00,20.00,,38940.00,True -E07000034,Chesterfield,ENGLAND,2339.49,27100.00,10630.00,6530.00,4070.00,2150.00,620.00,220.00,30.00,,51350.00,True -E07000035,Derbyshire Dales,ENGLAND,2444.70,3680.00,7630.00,7720.00,5850.00,5290.00,3300.00,2170.00,140.00,,35770.00,True -E07000036,Erewash,ENGLAND,2360.64,22010.00,14290.00,7900.00,5080.00,2430.00,920.00,530.00,40.00,,53190.00,True -E07000037,High Peak,ENGLAND,2384.66,8670.00,13380.00,9510.00,5120.00,4100.00,2200.00,860.00,50.00,,43890.00,True -E07000038,North East Derbyshire,ENGLAND,2466.57,19260.00,10030.00,8200.00,5700.00,3300.00,1630.00,900.00,70.00,,49080.00,True -E07000039,South Derbyshire,ENGLAND,2339.61,11910.00,11780.00,9770.00,8370.00,5700.00,2430.00,1020.00,100.00,,51070.00,True -E07000040,East Devon,ENGLAND,2595.46,6860.00,14150.00,17830.00,13670.00,11400.00,6700.00,4270.00,210.00,,75100.00,True -E07000041,Exeter,ENGLAND,2495.36,13480.00,15450.00,14560.00,10030.00,4570.00,2220.00,1020.00,50.00,,61380.00,True -E07000042,Mid Devon,ENGLAND,2656.41,6550.00,9380.00,7290.00,6700.00,5010.00,2640.00,980.00,60.00,,38610.00,True -E07000043,North Devon,ENGLAND,2642.21,10450.00,11830.00,10620.00,8670.00,5100.00,2040.00,640.00,50.00,,49400.00,True -E07000044,South Hams,ENGLAND,2615.22,5360.00,9100.00,9570.00,8500.00,7590.00,4140.00,3200.00,380.00,,47840.00,True -E07000045,Teignbridge,ENGLAND,2643.12,9080.00,14740.00,14520.00,12280.00,8610.00,4110.00,2060.00,120.00,,65510.00,True -E07000046,Torridge,ENGLAND,2601.42,8460.00,7500.00,7340.00,6150.00,3520.00,1210.00,390.00,30.00,,34600.00,True -E07000047,West Devon,ENGLAND,2705.33,3640.00,6760.00,5760.00,4560.00,3710.00,1920.00,1050.00,80.00,,27470.00,True -E07000061,Eastbourne,ENGLAND,2654.28,8870.00,13370.00,10980.00,8760.00,4600.00,2070.00,1130.00,90.00,,49870.00,True -E07000062,Hastings,ENGLAND,2676.58,14990.00,12520.00,7810.00,5800.00,2350.00,860.00,200.00,40.00,,44570.00,True -E07000063,Lewes,ENGLAND,2756.17,4510.00,6410.00,13850.00,10360.00,6260.00,3300.00,2420.00,250.00,,47360.00,True -E07000064,Rother,ENGLAND,2700.95,5050.00,7420.00,10230.00,9430.00,7690.00,4110.00,2770.00,280.00,,46970.00,True -E07000065,Wealden,ENGLAND,2728.43,4360.00,8470.00,17900.00,16070.00,12010.00,8130.00,7340.00,950.00,,75240.00,True -E07000066,Basildon,ENGLAND,2327.24,9100.00,16310.00,24750.00,14900.00,7930.00,4900.00,2080.00,200.00,,80160.00,True -E07000067,Braintree,ENGLAND,2280.34,6240.00,17650.00,20390.00,10900.00,8240.00,4990.00,2500.00,230.00,,71150.00,True -E07000068,Brentwood,ENGLAND,2258.14,690.00,3080.00,6950.00,8900.00,6470.00,4620.00,4060.00,660.00,,35420.00,True -E07000069,Castle Point,ENGLAND,2318.63,3370.00,6440.00,13880.00,8710.00,4480.00,1920.00,770.00,70.00,,39630.00,True -E07000070,Chelmsford,ENGLAND,2300.18,5180.00,10960.00,23980.00,18540.00,11460.00,6610.00,4590.00,450.00,,81760.00,True -E07000071,Colchester,ENGLAND,2282.85,9600.00,23120.00,21170.00,16230.00,9320.00,4310.00,2600.00,170.00,,86520.00,True -E07000072,Epping Forest,ENGLAND,2277.21,2120.00,5220.00,12060.00,14210.00,10280.00,7130.00,6320.00,1260.00,,58610.00,True -E07000073,Harlow,ENGLAND,2298.69,2620.00,8360.00,19630.00,5240.00,3070.00,1180.00,450.00,20.00,,40560.00,True -E07000074,Maldon,ENGLAND,2328.37,2480.00,3980.00,8640.00,5690.00,4710.00,3180.00,1700.00,190.00,,30560.00,True -E07000075,Rochford,ENGLAND,2363.48,1580.00,4080.00,12110.00,10890.00,5350.00,2800.00,1450.00,80.00,,38340.00,True -E07000076,Tendring,ENGLAND,2269.63,13840.00,18040.00,22070.00,12380.00,6120.00,2160.00,980.00,90.00,,75690.00,True -E07000077,Uttlesford,ENGLAND,2333.82,1430.00,4180.00,8770.00,8080.00,7610.00,5310.00,4960.00,460.00,,40790.00,True -E07000078,Cheltenham,ENGLAND,2369.52,9990.00,13530.00,14150.00,9450.00,5270.00,2800.00,2210.00,150.00,,57560.00,True -E07000079,Cotswold,ENGLAND,2391.65,3710.00,5430.00,11550.00,7770.00,6740.00,5310.00,4950.00,780.00,,46250.00,True -E07000080,Forest of Dean,ENGLAND,2443.42,7210.00,10410.00,9230.00,6150.00,4670.00,2190.00,1040.00,80.00,,40980.00,True -E07000081,Gloucester,ENGLAND,2355.84,17700.00,16980.00,14340.00,6110.00,3880.00,930.00,180.00,10.00,,60130.00,True -E07000082,Stroud,ENGLAND,2491.36,7630.00,13050.00,13150.00,8640.00,7320.00,4230.00,2660.00,260.00,,56940.00,True -E07000083,Tewkesbury,ENGLAND,2340.53,7060.00,7130.00,13060.00,6790.00,6070.00,3780.00,2130.00,210.00,,46230.00,True -E07000084,Basingstoke and Deane,ENGLAND,2255.21,2620.00,13300.00,28100.00,15490.00,11350.00,6790.00,3570.00,460.00,,81690.00,True -E07000085,East Hampshire,ENGLAND,2343.92,3080.00,6360.00,13430.00,11590.00,9270.00,6950.00,5160.00,670.00,,56500.00,True -E07000086,Eastleigh,ENGLAND,2342.21,4710.00,12600.00,19810.00,11260.00,8190.00,3510.00,1210.00,30.00,,61320.00,True -E07000087,Fareham,ENGLAND,2270.55,3640.00,7390.00,15710.00,10880.00,8130.00,3720.00,1530.00,140.00,,51150.00,True -E07000088,Gosport,ENGLAND,2344.29,6170.00,13380.00,9230.00,5170.00,2010.00,1570.00,330.00,20.00,,37880.00,True -E07000089,Hart,ENGLAND,2400.02,780.00,2600.00,10120.00,9720.00,8280.00,7220.00,4050.00,260.00,,43030.00,True -E07000090,Havant,ENGLAND,2320.28,8610.00,14860.00,13770.00,10550.00,5950.00,2590.00,990.00,50.00,,57380.00,True -E07000091,New Forest,ENGLAND,2419.76,7330.00,12250.00,18260.00,19460.00,13700.00,7220.00,4700.00,620.00,,83540.00,True -E07000092,Rushmoor,ENGLAND,2320.28,1500.00,9090.00,16950.00,9310.00,4250.00,1320.00,330.00,20.00,,42770.00,True -E07000093,Test Valley,ENGLAND,2305.52,3120.00,10040.00,15600.00,11420.00,8800.00,5320.00,3950.00,560.00,,58810.00,True -E07000094,Winchester,ENGLAND,2359.76,3050.00,7530.00,13750.00,11310.00,9190.00,7180.00,6020.00,750.00,,58770.00,True -E07000095,Broxbourne,ENGLAND,2306.43,590.00,3820.00,9960.00,14530.00,7880.00,3010.00,2350.00,230.00,,42360.00,True -E07000096,Dacorum,ENGLAND,2408.51,1240.00,8300.00,20760.00,16240.00,9420.00,5860.00,5260.00,850.00,,67930.00,True -E07000098,Hertsmere,ENGLAND,2405.83,820.00,3090.00,7450.00,14980.00,8990.00,4640.00,4750.00,1230.00,,45940.00,True -E07000099,North Hertfordshire,ENGLAND,2448.52,3450.00,9440.00,20320.00,10450.00,7490.00,4900.00,3630.00,360.00,,60020.00,True -E07000102,Three Rivers,ENGLAND,2422.31,890.00,2430.00,6980.00,10030.00,7560.00,4470.00,5170.00,1630.00,,39150.00,True -E07000103,Watford,ENGLAND,2446.70,470.00,4490.00,16000.00,14260.00,3890.00,2220.00,1930.00,80.00,,43350.00,True -E07000105,Ashford,ENGLAND,2410.16,4380.00,13910.00,13710.00,10220.00,7120.00,6220.00,3570.00,220.00,,59350.00,True -E07000106,Canterbury,ENGLAND,2419.33,7760.00,14100.00,21250.00,14160.00,7950.00,4210.00,2320.00,120.00,,71860.00,True -E07000107,Dartford,ENGLAND,2375.15,1750.00,6830.00,15370.00,14590.00,7750.00,3030.00,1120.00,70.00,,50510.00,True -E07000108,Dover,ENGLAND,2461.74,7300.00,17350.00,14600.00,7750.00,4650.00,2580.00,1590.00,80.00,,55890.00,True -E07000109,Gravesham,ENGLAND,2408.24,3680.00,7050.00,15260.00,10970.00,4780.00,2130.00,1100.00,110.00,,45070.00,True -E07000110,Maidstone,ENGLAND,2502.59,4520.00,9570.00,21210.00,20600.00,10980.00,6610.00,4720.00,390.00,,78600.00,True -E07000111,Sevenoaks,ENGLAND,2522.36,1910.00,3480.00,11660.00,12160.00,7730.00,6170.00,7990.00,1550.00,,52660.00,True -E07000112,Folkestone and Hythe,ENGLAND,2538.75,7190.00,13030.00,14680.00,8720.00,5280.00,2790.00,1980.00,100.00,,53780.00,True -E07000113,Swale,ENGLAND,2405.65,10400.00,16590.00,17920.00,12190.00,6130.00,2820.00,1310.00,120.00,,67470.00,True -E07000114,Thanet,ENGLAND,2490.90,16400.00,20220.00,18390.00,8250.00,4210.00,1660.00,840.00,40.00,,70010.00,True -E07000115,Tonbridge and Malling,ENGLAND,2471.83,1770.00,4080.00,16220.00,14410.00,9650.00,5570.00,5100.00,470.00,,57270.00,True -E07000116,Tunbridge Wells,ENGLAND,2446.15,3500.00,5440.00,14220.00,11090.00,7180.00,5240.00,5620.00,620.00,,52900.00,True -E07000117,Burnley,ENGLAND,2549.42,25800.00,5850.00,6530.00,3080.00,1350.00,340.00,130.00,20.00,,43090.00,True -E07000118,Chorley,ENGLAND,2430.23,15200.00,12200.00,9810.00,7020.00,5490.00,2390.00,1050.00,70.00,,53230.00,True -E07000119,Fylde,ENGLAND,2483.94,7180.00,7030.00,9690.00,7560.00,5420.00,2960.00,1690.00,140.00,,41680.00,True -E07000120,Hyndburn,ENGLAND,2465.98,21980.00,5870.00,5900.00,2870.00,870.00,280.00,170.00,10.00,,37960.00,True -E07000121,Lancaster,ENGLAND,2503.19,23600.00,16510.00,12830.00,6740.00,4270.00,2130.00,870.00,80.00,,67020.00,True -E07000122,Pendle,ENGLAND,2640.18,25170.00,4850.00,4640.00,3500.00,1890.00,1030.00,550.00,40.00,,41660.00,True -E07000123,Preston,ENGLAND,2575.74,31000.00,13610.00,11260.00,7490.00,3750.00,2130.00,1080.00,70.00,,70390.00,True -E07000124,Ribble Valley,ENGLAND,2386.50,3900.00,5620.00,5810.00,5100.00,4310.00,2680.00,2050.00,240.00,,29700.00,True -E07000125,Rossendale,ENGLAND,2519.97,16480.00,5250.00,4430.00,3460.00,2040.00,720.00,470.00,40.00,,32890.00,True -E07000126,South Ribble,ENGLAND,2442.66,10130.00,13620.00,13130.00,8660.00,4510.00,1770.00,610.00,30.00,,52470.00,True -E07000127,West Lancashire,ENGLAND,2456.23,14980.00,9760.00,10530.00,7650.00,5430.00,2690.00,1700.00,110.00,,52850.00,True -E07000128,Wyre,ENGLAND,2460.53,12060.00,12580.00,13420.00,7900.00,6050.00,2760.00,1150.00,80.00,,55980.00,True -E07000129,Blaby,ENGLAND,2490.22,5040.00,15700.00,10280.00,6940.00,4640.00,1660.00,550.00,40.00,,44840.00,True -E07000130,Charnwood,ENGLAND,2405.64,13340.00,22020.00,19430.00,11510.00,7600.00,3430.00,2070.00,230.00,,79620.00,True -E07000131,Harborough,ENGLAND,2389.87,4750.00,9770.00,8640.00,7110.00,7400.00,4120.00,2840.00,260.00,,44900.00,True -E07000132,Hinckley and Bosworth,ENGLAND,2382.62,8930.00,16590.00,11540.00,7590.00,4630.00,2350.00,1160.00,70.00,,52840.00,True -E07000133,Melton,ENGLAND,2429.67,3700.00,7790.00,4100.00,4050.00,2690.00,1640.00,1050.00,90.00,,25110.00,True -E07000134,North West Leicestershire,ENGLAND,2418.20,10270.00,14790.00,8280.00,7300.00,5420.00,2050.00,990.00,60.00,,49150.00,True -E07000135,Oadby and Wigston,ENGLAND,2406.85,4150.00,6340.00,7340.00,3290.00,2200.00,650.00,490.00,90.00,,24560.00,True -E07000136,Boston,ENGLAND,2308.73,15550.00,6610.00,6240.00,2390.00,880.00,240.00,80.00,20.00,,31990.00,True -E07000137,East Lindsey,ENGLAND,2275.88,28110.00,15500.00,16290.00,6970.00,3790.00,1490.00,610.00,60.00,,72820.00,True -E07000138,Lincoln,ENGLAND,2323.08,28930.00,9140.00,4950.00,2570.00,1440.00,530.00,140.00,40.00,,47750.00,True -E07000139,North Kesteven,ENGLAND,2337.81,14220.00,14110.00,13430.00,7480.00,3840.00,1680.00,430.00,60.00,,55250.00,True -E07000140,South Holland,ENGLAND,2278.20,16760.00,9810.00,10700.00,4790.00,2150.00,450.00,120.00,20.00,,44790.00,True -E07000141,South Kesteven,ENGLAND,2260.00,20100.00,15530.00,11790.00,9650.00,6080.00,3130.00,1130.00,110.00,,67510.00,True -E07000142,West Lindsey,ENGLAND,2354.25,17270.00,8670.00,8200.00,6290.00,3970.00,1690.00,550.00,70.00,,46710.00,True -E07000143,Breckland,ENGLAND,2443.67,16260.00,18480.00,14810.00,8550.00,5040.00,1910.00,830.00,60.00,,65950.00,True -E07000144,Broadland,ENGLAND,2437.78,5060.00,16080.00,21850.00,10660.00,5650.00,2370.00,880.00,100.00,,62650.00,True -E07000145,Great Yarmouth,ENGLAND,2414.41,20910.00,12800.00,9080.00,4480.00,2020.00,640.00,260.00,20.00,,50210.00,True -E07000146,King's Lynn and West Norfolk,ENGLAND,2430.13,24670.00,17970.00,13850.00,10010.00,5410.00,2790.00,1220.00,120.00,,76030.00,True -E07000147,North Norfolk,ENGLAND,2459.93,12190.00,14640.00,11880.00,9220.00,5130.00,2460.00,1100.00,90.00,,56700.00,True -E07000148,Norwich,ENGLAND,2503.44,28590.00,23800.00,9090.00,3760.00,2360.00,930.00,610.00,70.00,,69220.00,True -E07000149,South Norfolk,ENGLAND,2482.87,7340.00,18430.00,16780.00,11990.00,7950.00,3400.00,1580.00,120.00,,67590.00,True -E07000170,Ashfield,ENGLAND,2608.76,30290.00,11920.00,9110.00,4460.00,1560.00,520.00,130.00,30.00,,58020.00,True -E07000171,Bassetlaw,ENGLAND,2644.95,28230.00,9040.00,7100.00,7070.00,3530.00,1720.00,740.00,60.00,,57490.00,True -E07000172,Broxtowe,ENGLAND,2618.21,16870.00,13610.00,11200.00,6230.00,2840.00,840.00,510.00,30.00,,52130.00,True -E07000173,Gedling,ENGLAND,2609.55,14900.00,15650.00,10760.00,7070.00,4390.00,1500.00,950.00,100.00,,55320.00,True -E07000174,Mansfield,ENGLAND,2600.38,27850.00,9960.00,7030.00,4250.00,1770.00,470.00,210.00,30.00,,51550.00,True -E07000175,Newark and Sherwood,ENGLAND,2682.10,24260.00,8980.00,9640.00,6640.00,4570.00,2810.00,1530.00,140.00,,58560.00,True -E07000176,Rushcliffe,ENGLAND,2643.27,6420.00,11430.00,12090.00,10200.00,7720.00,4640.00,2720.00,150.00,,55380.00,True -E07000177,Cherwell,ENGLAND,2582.96,6230.00,16680.00,19780.00,12700.00,9260.00,4490.00,2890.00,270.00,,72300.00,True -E07000178,Oxford,ENGLAND,2678.40,2970.00,9890.00,19810.00,16320.00,7670.00,3140.00,3370.00,610.00,,63780.00,True -E07000179,South Oxfordshire,ENGLAND,2597.57,2130.00,6070.00,18530.00,15260.00,10980.00,6810.00,6420.00,990.00,,67190.00,True -E07000180,Vale of White Horse,ENGLAND,2577.44,1910.00,6870.00,19390.00,14150.00,10450.00,6620.00,4870.00,490.00,,64750.00,True -E07000181,West Oxfordshire,ENGLAND,2566.95,1690.00,6220.00,17990.00,11950.00,7990.00,4640.00,3100.00,420.00,,53990.00,True -E07000192,Cannock Chase,ENGLAND,2375.83,14120.00,14510.00,8860.00,5680.00,2000.00,660.00,280.00,20.00,,46120.00,True -E07000193,East Staffordshire,ENGLAND,2351.34,18370.00,12310.00,9590.00,6790.00,5160.00,2660.00,1300.00,100.00,,56270.00,True -E07000194,Lichfield,ENGLAND,2351.90,6010.00,11020.00,12460.00,7530.00,5140.00,4030.00,2730.00,430.00,,49330.00,True -E07000195,Newcastle-under-Lyme,ENGLAND,2334.25,24990.00,10910.00,11780.00,4990.00,2910.00,1860.00,1020.00,50.00,,58520.00,True -E07000196,South Staffordshire,ENGLAND,2313.67,6900.00,10910.00,12080.00,7570.00,5600.00,3610.00,2490.00,220.00,,49370.00,True -E07000197,Stafford,ENGLAND,2302.68,12420.00,14480.00,14660.00,10060.00,7020.00,3780.00,1660.00,110.00,,64170.00,True -E07000198,Staffordshire Moorlands,ENGLAND,2338.21,9660.00,10860.00,10880.00,6360.00,4560.00,2020.00,810.00,40.00,,45180.00,True -E07000199,Tamworth,ENGLAND,2300.76,9530.00,12410.00,6180.00,4020.00,2210.00,600.00,130.00,10.00,,35070.00,True -E07000200,Babergh,ENGLAND,2341.55,5220.00,12430.00,9280.00,7820.00,4880.00,2650.00,1800.00,200.00,,44280.00,True -E07000202,Ipswich,ENGLAND,2468.25,19420.00,23220.00,11540.00,4510.00,2370.00,960.00,380.00,20.00,,62410.00,True -E07000203,Mid Suffolk,ENGLAND,2316.88,5950.00,13510.00,11200.00,8080.00,6420.00,3390.00,1740.00,110.00,,50400.00,True -E07000207,Elmbridge,ENGLAND,2557.75,460.00,1890.00,8180.00,14150.00,11310.00,8140.00,11460.00,4550.00,,60130.00,True -E07000208,Epsom and Ewell,ENGLAND,2530.84,160.00,1270.00,5610.00,9290.00,7810.00,4830.00,4180.00,150.00,,33310.00,True -E07000209,Guildford,ENGLAND,2547.30,2290.00,3550.00,12790.00,16940.00,10640.00,6920.00,7590.00,1860.00,,62580.00,True -E07000210,Mole Valley,ENGLAND,2519.86,1690.00,2740.00,4520.00,8420.00,7240.00,6310.00,7830.00,1080.00,,39830.00,True -E07000211,Reigate and Banstead,ENGLAND,2566.61,1230.00,4270.00,13130.00,18260.00,11660.00,7700.00,7540.00,1140.00,,64930.00,True -E07000212,Runnymede,ENGLAND,2492.99,2500.00,1610.00,8040.00,11690.00,6950.00,4300.00,3230.00,1140.00,,39460.00,True -E07000213,Spelthorne,ENGLAND,2526.44,460.00,1790.00,10140.00,15180.00,10110.00,4730.00,2200.00,120.00,,44730.00,True -E07000214,Surrey Heath,ENGLAND,2585.16,740.00,2650.00,6380.00,10230.00,6900.00,5940.00,5330.00,540.00,,38700.00,True -E07000215,Tandridge,ENGLAND,2594.85,940.00,2230.00,5440.00,9130.00,7870.00,4940.00,6400.00,1290.00,,38240.00,True -E07000216,Waverley,ENGLAND,2604.87,1030.00,3480.00,10920.00,13590.00,10110.00,7380.00,8910.00,2180.00,,57590.00,True -E07000217,Woking,ENGLAND,2598.04,340.00,3620.00,11320.00,12600.00,6360.00,4240.00,5260.00,830.00,,44560.00,True -E07000218,North Warwickshire,ENGLAND,2532.10,6750.00,7510.00,6520.00,4060.00,2610.00,1420.00,790.00,80.00,,29740.00,True -E07000219,Nuneaton and Bedworth,ENGLAND,2502.16,20960.00,13710.00,14700.00,7910.00,3180.00,870.00,200.00,20.00,,61530.00,True -E07000220,Rugby,ENGLAND,2483.05,9090.00,12130.00,12530.00,7400.00,5280.00,3530.00,1910.00,110.00,,51990.00,True -E07000221,Stratford-on-Avon,ENGLAND,2484.17,3850.00,8630.00,18950.00,11350.00,10780.00,6850.00,5980.00,1000.00,,67380.00,True -E07000222,Warwick,ENGLAND,2461.55,5040.00,12630.00,18940.00,13730.00,8520.00,5700.00,4720.00,460.00,,69750.00,True -E07000223,Adur,ENGLAND,2548.28,2780.00,5110.00,11580.00,6340.00,2050.00,760.00,340.00,10.00,,28980.00,True -E07000224,Arun,ENGLAND,2487.24,8520.00,12990.00,21180.00,16680.00,10930.00,6350.00,2800.00,310.00,,79760.00,True -E07000225,Chichester,ENGLAND,2469.68,3350.00,6540.00,15290.00,13040.00,9560.00,6440.00,6020.00,1360.00,,61610.00,True -E07000226,Crawley,ENGLAND,2418.46,1300.00,7670.00,22570.00,9100.00,3820.00,2350.00,470.00,10.00,,47290.00,True -E07000227,Horsham,ENGLAND,2441.01,2440.00,6790.00,14020.00,14410.00,11640.00,8560.00,8080.00,840.00,,66760.00,True -E07000228,Mid Sussex,ENGLAND,2474.26,2340.00,7790.00,15320.00,17830.00,12370.00,9200.00,5050.00,450.00,,70340.00,True -E07000229,Worthing,ENGLAND,2456.13,8370.00,11640.00,13190.00,9760.00,5610.00,2450.00,930.00,30.00,,51980.00,True -E07000234,Bromsgrove,ENGLAND,2478.65,3950.00,7460.00,9350.00,8060.00,7220.00,3850.00,2920.00,380.00,,43190.00,True -E07000235,Malvern Hills,ENGLAND,2450.92,4100.00,7690.00,8820.00,5980.00,5370.00,4150.00,2550.00,130.00,,38780.00,True -E07000236,Redditch,ENGLAND,2462.95,8040.00,12220.00,7970.00,4490.00,3450.00,1290.00,480.00,20.00,,37960.00,True -E07000237,Worcester,ENGLAND,2405.81,9010.00,15430.00,12030.00,5670.00,3590.00,1620.00,450.00,10.00,,47800.00,True -E07000238,Wychavon,ENGLAND,2373.19,7180.00,12070.00,14580.00,8550.00,7890.00,6900.00,4850.00,230.00,,62250.00,True -E07000239,Wyre Forest,ENGLAND,2512.47,11730.00,11960.00,12080.00,6540.00,3610.00,1800.00,1300.00,140.00,,49150.00,True -E07000240,St Albans,ENGLAND,2419.22,880.00,3220.00,10530.00,16530.00,13100.00,9530.00,8270.00,1410.00,,63480.00,True -E07000241,Welwyn Hatfield,ENGLAND,2452.26,1250.00,5850.00,16360.00,12550.00,5590.00,4500.00,3960.00,750.00,,50790.00,True -E07000242,East Hertfordshire,ENGLAND,2454.78,1000.00,6460.00,16520.00,17010.00,12070.00,8140.00,5950.00,870.00,,68010.00,True -E07000243,Stevenage,ENGLAND,2391.97,1700.00,6890.00,21760.00,3380.00,3280.00,980.00,430.00,20.00,,38440.00,True -E07000244,East Suffolk,ENGLAND,2334.80,28230.00,31230.00,23810.00,18810.00,11760.00,5650.00,3070.00,250.00,,122810.00,True -E07000245,West Suffolk,ENGLAND,2351.47,12730.00,29030.00,17370.00,12390.00,7410.00,3050.00,2100.00,200.00,,84280.00,True -E08000001,Bolton,ENGLAND,2399.74,65640.00,22820.00,18990.00,11000.00,5820.00,2370.00,1930.00,250.00,,128800.00,True -E08000002,Bury,ENGLAND,2555.15,30710.00,18680.00,17540.00,9380.00,5700.00,1900.00,1320.00,180.00,,85410.00,True -E08000003,Manchester,ENGLAND,2312.04,137810.00,43100.00,38170.00,21260.00,7640.00,3400.00,1270.00,150.00,,252810.00,True -E08000004,Oldham,ENGLAND,2602.23,51140.00,17700.00,16730.00,7310.00,3540.00,1630.00,940.00,80.00,,99070.00,True -E08000005,Rochdale,ENGLAND,2600.83,51910.00,17400.00,13280.00,8260.00,4580.00,1710.00,900.00,50.00,,98100.00,True -E08000006,Salford,ENGLAND,2594.45,63640.00,31220.00,22180.00,12350.00,3910.00,1490.00,880.00,110.00,,135780.00,True -E08000007,Stockport,ENGLAND,2618.90,31820.00,29160.00,28940.00,19920.00,13320.00,6570.00,3620.00,230.00,,133580.00,True -E08000008,Tameside,ENGLAND,2447.21,53040.00,19680.00,20250.00,7290.00,4000.00,950.00,450.00,40.00,,105700.00,True -E08000009,Trafford,ENGLAND,2291.70,20050.00,23020.00,27720.00,15590.00,7940.00,4690.00,4230.00,1070.00,,104300.00,True -E08000010,Wigan,ENGLAND,2152.68,68940.00,34800.00,25810.00,13480.00,7730.00,2030.00,650.00,60.00,,153490.00,True -E08000011,Knowsley,ENGLAND,2488.25,38180.00,15340.00,10660.00,5000.00,2110.00,330.00,130.00,20.00,,71770.00,True -E08000012,Liverpool,ENGLAND,2673.59,143680.00,44920.00,29870.00,14000.00,5140.00,2360.00,1760.00,150.00,,241880.00,True -E08000013,St. Helens,ENGLAND,2403.38,37850.00,19360.00,15770.00,7030.00,3810.00,1690.00,600.00,40.00,,86150.00,True -E08000014,Sefton,ENGLAND,2583.22,39990.00,28250.00,31380.00,15840.00,8930.00,3990.00,2740.00,290.00,,131400.00,True -E08000015,Wirral,ENGLAND,2500.59,61080.00,33140.00,27740.00,13690.00,8580.00,4390.00,3220.00,290.00,,152120.00,True -E08000016,Barnsley,ENGLAND,2325.96,65310.00,19340.00,14570.00,9790.00,4190.00,1630.00,710.00,60.00,,115610.00,True -E08000017,Doncaster,ENGLAND,2167.75,82760.00,27200.00,16270.00,10220.00,4900.00,2280.00,980.00,140.00,,144760.00,True -E08000018,Rotherham,ENGLAND,2381.53,64280.00,24200.00,16130.00,9790.00,5070.00,2010.00,810.00,70.00,,122350.00,True -E08000019,Sheffield,ENGLAND,2510.16,152470.00,42460.00,33260.00,16910.00,9780.00,4420.00,2890.00,220.00,,262400.00,True -E08000021,Newcastle upon Tyne,ENGLAND,2542.19,77750.00,21680.00,20520.00,10160.00,5940.00,2640.00,1930.00,140.00,,140760.00,True -E08000022,North Tyneside,ENGLAND,2461.77,50580.00,16240.00,20200.00,8490.00,4540.00,1590.00,380.00,40.00,,102050.00,True -E08000023,South Tyneside,ENGLAND,2434.43,45760.00,10470.00,8880.00,4940.00,1850.00,730.00,340.00,50.00,,73020.00,True -E08000024,Sunderland,ENGLAND,2197.14,80320.00,20110.00,18370.00,10090.00,3780.00,1230.00,700.00,60.00,,134650.00,True -E08000025,Birmingham,ENGLAND,2362.90,164600.00,132630.00,85230.00,44530.00,23130.00,9140.00,5960.00,930.00,,466150.00,True -E08000026,Coventry,ENGLAND,2516.72,63820.00,44330.00,25210.00,10750.00,5230.00,2610.00,1490.00,190.00,,153630.00,True -E08000027,Dudley,ENGLAND,2144.84,43610.00,40300.00,31110.00,16400.00,7150.00,2530.00,980.00,140.00,,142230.00,True -E08000028,Sandwell,ENGLAND,2244.46,59230.00,44650.00,21640.00,7680.00,2990.00,550.00,70.00,40.00,,136860.00,True -E08000029,Solihull,ENGLAND,2197.26,14590.00,12510.00,23390.00,17700.00,12200.00,9260.00,5820.00,490.00,,95950.00,True -E08000030,Walsall,ENGLAND,2627.48,52370.00,27810.00,18930.00,10490.00,5680.00,2420.00,860.00,60.00,,118620.00,True -E08000031,Wolverhampton,ENGLAND,2538.99,57530.00,25570.00,17660.00,7370.00,3150.00,1730.00,1000.00,130.00,,114130.00,True -E08000032,Bradford,ENGLAND,2360.73,92730.00,46940.00,41630.00,19000.00,13330.00,6260.00,3820.00,330.00,,224030.00,True -E08000033,Calderdale,ENGLAND,2420.15,44900.00,18530.00,16060.00,7730.00,5630.00,3150.00,1380.00,60.00,,97430.00,True -E08000034,Kirklees,ENGLAND,2441.07,86120.00,35310.00,33310.00,17860.00,12720.00,5720.00,2330.00,170.00,,193530.00,True -E08000035,Leeds,ENGLAND,2283.73,143230.00,80140.00,73400.00,38150.00,22930.00,10740.00,7490.00,760.00,,376840.00,True -E08000036,Wakefield,ENGLAND,2296.89,79970.00,31330.00,24780.00,16330.00,8860.00,2600.00,1230.00,100.00,,165190.00,True -E08000037,Gateshead,ENGLAND,2715.81,56090.00,13230.00,15950.00,6070.00,2780.00,900.00,390.00,50.00,,95480.00,True -E09000001,City of London,ENGLAND,1329.56,,350.00,690.00,950.00,2890.00,1390.00,1500.00,310.00,,8080.00,True -E09000002,Barking and Dagenham,ENGLAND,2198.51,6030.00,12420.00,50340.00,10770.00,1800.00,390.00,50.00,10.00,,81800.00,True -E09000003,Barnet,ENGLAND,2132.60,3420.00,9570.00,32530.00,39640.00,33920.00,20370.00,16820.00,4350.00,,160620.00,True -E09000004,Bexley,ENGLAND,2366.36,4350.00,11380.00,31230.00,28140.00,19550.00,5290.00,1750.00,50.00,,101750.00,True -E09000005,Brent,ENGLAND,2235.27,6090.00,14040.00,41900.00,39340.00,23430.00,6590.00,3460.00,250.00,,135110.00,True -E09000006,Bromley,ENGLAND,2140.04,2100.00,10590.00,30460.00,36460.00,29550.00,18580.00,14120.00,1750.00,,143600.00,True -E09000007,Camden,ENGLAND,2207.55,3380.00,12270.00,20780.00,26560.00,19820.00,12950.00,13140.00,4940.00,,113830.00,True -E09000008,Croydon,ENGLAND,2599.91,4450.00,24400.00,52850.00,42340.00,24140.00,11860.00,7520.00,660.00,,168220.00,True -E09000009,Ealing,ENGLAND,2138.53,5200.00,14970.00,36980.00,48680.00,25200.00,10520.00,7200.00,1060.00,,149800.00,True -E09000010,Enfield,ENGLAND,2267.67,5420.00,12400.00,35190.00,37170.00,21550.00,9590.00,6050.00,1020.00,,128400.00,True -E09000011,Greenwich,ENGLAND,2107.86,10790.00,22200.00,45460.00,27100.00,12850.00,4010.00,2280.00,360.00,,125040.00,True -E09000012,Hackney,ENGLAND,2060.30,8170.00,31670.00,35990.00,25200.00,13500.00,4950.00,1320.00,50.00,,120850.00,True -E09000013,Hammersmith and Fulham,ENGLAND,1519.51,4120.00,6630.00,14510.00,25920.00,17400.00,11330.00,12270.00,2940.00,,95120.00,True -E09000014,Haringey,ENGLAND,2313.78,7700.00,19400.00,36160.00,28640.00,11700.00,5540.00,4800.00,750.00,,114700.00,True -E09000015,Harrow,ENGLAND,2511.07,840.00,4470.00,22800.00,30020.00,22620.00,8550.00,6220.00,1320.00,,96860.00,True -E09000016,Havering,ENGLAND,2424.66,5300.00,11080.00,29790.00,36200.00,16040.00,6770.00,3140.00,380.00,,108680.00,True -E09000017,Hillingdon,ENGLAND,2045.46,1270.00,6550.00,28300.00,47450.00,18810.00,10050.00,5340.00,490.00,,118260.00,True -E09000018,Hounslow,ENGLAND,2185.56,2560.00,9560.00,30620.00,40720.00,16350.00,6370.00,4120.00,1030.00,,111320.00,True -E09000019,Islington,ENGLAND,2108.15,4660.00,6180.00,29760.00,33560.00,19520.00,10380.00,7300.00,960.00,,112320.00,True -E09000020,Kensington and Chelsea,ENGLAND,1666.65,1460.00,3310.00,9370.00,14110.00,13410.00,12210.00,19930.00,15480.00,,89280.00,True -E09000021,Kingston upon Thames,ENGLAND,2609.20,630.00,3420.00,16020.00,21010.00,15050.00,8770.00,4460.00,1080.00,,70440.00,True -E09000022,Lambeth,ENGLAND,2047.11,5020.00,33450.00,42330.00,33160.00,16550.00,10820.00,5960.00,1180.00,,148470.00,True -E09000023,Lewisham,ENGLAND,2237.33,9280.00,36440.00,48040.00,27670.00,8060.00,2820.00,1360.00,190.00,,133860.00,True -E09000024,Merton,ENGLAND,2146.76,1190.00,8590.00,24140.00,28360.00,13540.00,5940.00,4180.00,1850.00,,87780.00,True -E09000025,Newham,ENGLAND,1944.23,5570.00,34340.00,56120.00,26900.00,7220.00,2210.00,240.00,40.00,,132640.00,True -E09000026,Redbridge,ENGLAND,2294.58,2790.00,14100.00,27920.00,32140.00,19750.00,7820.00,3320.00,220.00,,108060.00,True -E09000027,Richmond upon Thames,ENGLAND,2486.10,600.00,2180.00,13480.00,20700.00,19770.00,12160.00,13290.00,3640.00,,85810.00,True -E09000028,Southwark,ENGLAND,1967.26,13220.00,38050.00,35710.00,28440.00,21540.00,7920.00,4590.00,830.00,,150300.00,True -E09000029,Sutton,ENGLAND,2378.64,990.00,8050.00,28300.00,24800.00,12950.00,7110.00,3780.00,290.00,,86270.00,True -E09000030,Tower Hamlets,ENGLAND,1837.78,4500.00,25040.00,40570.00,32250.00,27010.00,14280.00,5570.00,780.00,,150000.00,True -E09000031,Waltham Forest,ENGLAND,2386.96,5230.00,32380.00,39150.00,23440.00,8390.00,1850.00,440.00,30.00,,110900.00,True -E09000032,Wandsworth,ENGLAND,1028.21,6560.00,13280.00,37340.00,35080.00,26990.00,20450.00,15230.00,3040.00,,157970.00,True -E09000033,Westminster,ENGLAND,1049.55,1660.00,6460.00,15690.00,23130.00,24460.00,19180.00,24500.00,17190.00,,132280.00,True -N09000001,Antrim and Newtownabbey,NORTHERN_IRELAND,,,,,,,,,,,,False -N09000002,"Armagh City, Banbridge and Craigavon",NORTHERN_IRELAND,,,,,,,,,,,,False -N09000003,Belfast,NORTHERN_IRELAND,,,,,,,,,,,,False -N09000004,Causeway Coast and Glens,NORTHERN_IRELAND,,,,,,,,,,,,False -N09000005,Derry City and Strabane,NORTHERN_IRELAND,,,,,,,,,,,,False -N09000006,Fermanagh and Omagh,NORTHERN_IRELAND,,,,,,,,,,,,False -N09000007,Lisburn and Castlereagh,NORTHERN_IRELAND,,,,,,,,,,,,False -N09000008,Mid and East Antrim,NORTHERN_IRELAND,,,,,,,,,,,,False -N09000009,Mid Ulster,NORTHERN_IRELAND,,,,,,,,,,,,False -N09000010,"Newry, Mourne and Down",NORTHERN_IRELAND,,,,,,,,,,,,False -S12000005,Clackmannanshire,SCOTLAND,1594.38,,,,,,,,,,,True -S12000006,Dumfries and Galloway,SCOTLAND,1454.98,,,,,,,,,,,True -S12000008,East Ayrshire,SCOTLAND,1606.44,,,,,,,,,,,True -S12000010,East Lothian,SCOTLAND,1579.18,,,,,,,,,,,True -S12000011,East Renfrewshire,SCOTLAND,1528.44,,,,,,,,,,,True -S12000013,Na h-Eileanan Siar,SCOTLAND,1387.56,,,,,,,,,,,True -S12000014,Falkirk,SCOTLAND,1576.77,,,,,,,,,,,True -S12000017,Highland,SCOTLAND,1527.09,,,,,,,,,,,True -S12000018,Inverclyde,SCOTLAND,1551.30,,,,,,,,,,,True -S12000019,Midlothian,SCOTLAND,1666.20,,,,,,,,,,,True -S12000020,Moray,SCOTLAND,1573.76,,,,,,,,,,,True -S12000021,North Ayrshire,SCOTLAND,1553.77,,,,,,,,,,,True -S12000023,Orkney Islands,SCOTLAND,1574.60,,,,,,,,,,,True -S12000026,Scottish Borders,SCOTLAND,1491.72,,,,,,,,,,,True -S12000027,Shetland Islands,SCOTLAND,1386.67,,,,,,,,,,,True -S12000028,South Ayrshire,SCOTLAND,1569.41,,,,,,,,,,,True -S12000029,South Lanarkshire,SCOTLAND,1378.85,,,,,,,,,,,True -S12000030,Stirling,SCOTLAND,1611.78,,,,,,,,,,,True -S12000033,Aberdeen City,SCOTLAND,1636.27,,,,,,,,,,,True -S12000034,Aberdeenshire,SCOTLAND,1532.76,,,,,,,,,,,True -S12000035,Argyll and Bute,SCOTLAND,1625.64,,,,,,,,,,,True -S12000036,City of Edinburgh,SCOTLAND,1563.51,,,,,,,,,,,True -S12000038,Renfrewshire,SCOTLAND,1572.61,,,,,,,,,,,True -S12000039,West Dunbartonshire,SCOTLAND,1559.86,,,,,,,,,,,True -S12000040,West Lothian,SCOTLAND,1515.45,,,,,,,,,,,True -S12000041,Angus,SCOTLAND,1461.52,,,,,,,,,,,True -S12000042,Dundee City,SCOTLAND,1605.34,,,,,,,,,,,True -S12000045,East Dunbartonshire,SCOTLAND,1599.70,,,,,,,,,,,True -S12000047,Fife,SCOTLAND,1498.76,,,,,,,,,,,True -S12000048,Perth and Kinross,SCOTLAND,1537.04,,,,,,,,,,,True -S12000049,Glasgow City,SCOTLAND,1611.00,,,,,,,,,,,True -S12000050,North Lanarkshire,SCOTLAND,1452.86,,,,,,,,,,,True -W06000001,Isle of Anglesey,WALES,2260.73,4960.00,6930.00,7210.00,7400.00,5540.00,2770.00,1080.00,170.00,60.0,36120.00,True -W06000002,Gwynedd,WALES,2468.77,9310.00,15800.00,12700.00,10720.00,8300.00,4030.00,1280.00,210.00,90.0,62440.00,True -W06000003,Conwy,WALES,2472.82,5460.00,8340.00,15610.00,11970.00,9300.00,5120.00,1940.00,430.00,160.0,58340.00,True -W06000004,Denbighshire,WALES,2339.03,4160.00,7420.00,14970.00,8050.00,5660.00,3920.00,2060.00,320.00,170.0,46720.00,True -W06000005,Flintshire,WALES,2376.17,4520.00,9640.00,20990.00,13400.00,11140.00,7830.00,3230.00,600.00,220.0,71570.00,True -W06000006,Wrexham,WALES,2308.88,4510.00,12770.00,17250.00,10350.00,8270.00,5190.00,2570.00,720.00,290.0,61910.00,True -W06000008,Ceredigion,WALES,2419.45,1780.00,5000.00,7730.00,7570.00,9180.00,3890.00,980.00,110.00,20.0,36260.00,True -W06000009,Pembrokeshire,WALES,2166.15,6730.00,9460.00,14520.00,11520.00,12550.00,6070.00,2120.00,340.00,100.0,63400.00,True -W06000010,Carmarthenshire,WALES,2351.20,9370.00,24550.00,18930.00,14700.00,13440.00,6700.00,2260.00,300.00,70.0,90310.00,True -W06000011,Swansea,WALES,2238.29,17730.00,28650.00,25020.00,17330.00,13200.00,8180.00,3880.00,1200.00,540.0,115730.00,True -W06000012,Neath Port Talbot,WALES,2541.39,13830.00,27500.00,11720.00,7430.00,4580.00,1530.00,540.00,110.00,20.0,67260.00,True -W06000013,Bridgend,WALES,2477.99,10600.00,15370.00,14840.00,11050.00,8020.00,4480.00,1510.00,300.00,110.0,66280.00,True -W06000014,Vale of Glamorgan,WALES,2231.54,1510.00,6680.00,14520.00,11910.00,10790.00,7740.00,5920.00,2270.00,1060.0,62400.00,True -W06000015,Cardiff,WALES,2013.18,5320.00,20420.00,34920.00,37370.00,31540.00,22250.00,10590.00,2850.00,1480.0,166750.00,True -W06000016,Rhondda Cynon Taf,WALES,2289.43,47080.00,25500.00,17510.00,9660.00,7140.00,3520.00,1190.00,200.00,70.0,111860.00,True -W06000018,Caerphilly,WALES,2082.88,15550.00,26890.00,18930.00,9540.00,6840.00,2430.00,840.00,90.00,80.0,81190.00,True -W06000019,Blaenau Gwent,WALES,2531.26,19200.00,8160.00,2730.00,1810.00,900.00,350.00,60.00,,20.0,33230.00,True -W06000020,Torfaen,WALES,2155.68,6300.00,13120.00,12050.00,4350.00,4330.00,2410.00,690.00,70.00,30.0,43340.00,True -W06000021,Monmouthshire,WALES,2416.50,520.00,3450.00,7140.00,9460.00,7660.00,8100.00,5520.00,1790.00,670.0,44300.00,True -W06000022,Newport,WALES,2088.48,6910.00,15400.00,18470.00,12990.00,8560.00,6090.00,2710.00,560.00,190.0,71880.00,True -W06000023,Powys,WALES,2351.72,6090.00,9440.00,13330.00,10630.00,12660.00,9740.00,4180.00,580.00,210.0,66870.00,True -W06000024,Merthyr Tydfil,WALES,2593.60,14150.00,6680.00,2270.00,2210.00,1560.00,580.00,160.00,,10.0,27620.00,True +code,name,country,band_d_amount,count_band_A,count_band_B,count_band_C,count_band_D,count_band_E,count_band_F,count_band_G,count_band_H,count_band_I,total_dwellings,has_council_tax,total_council_tax_net +E06000001,Hartlepool,ENGLAND,2560.2,24090.0,7830.0,6780.0,3630.0,2070.0,930.0,700.0,110.0,,46140.0,True,69738772.716 +E06000002,Middlesbrough,ENGLAND,2549.16,33080.0,11550.0,11610.0,5620.0,2810.0,1040.0,600.0,50.0,,66360.0,True,96111361.854 +E06000003,Redcar and Cleveland,ENGLAND,2544.48,26840.0,13800.0,14820.0,6090.0,3610.0,1070.0,420.0,30.0,,66660.0,True,108610441.7904 +E06000004,Stockton-on-Tees,ENGLAND,2589.83,34900.0,17560.0,16890.0,10400.0,6430.0,3000.0,1610.0,130.0,,90910.0,True,163386702.9723 +E06000005,Darlington,ENGLAND,2493.83,23160.0,11180.0,7800.0,5950.0,3590.0,1400.0,680.0,50.0,,53820.0,True,89851198.602 +E06000006,Halton,ENGLAND,2366.61,27340.0,12760.0,8370.0,5230.0,3890.0,1270.0,360.0,40.0,,59260.0,True,90641943.9813 +E06000007,Warrington,ENGLAND,2447.61,27780.0,21410.0,19980.0,12400.0,7960.0,4900.0,2730.0,230.0,,97390.0,True,179465496.1275 +E06000008,Blackburn with Darwen,ENGLAND,2455.27,35860.0,9950.0,9010.0,4960.0,2780.0,840.0,580.0,70.0,,64050.0,True,97480357.175 +E06000009,Blackpool,ENGLAND,2513.22,32210.0,21330.0,11480.0,4860.0,1950.0,580.0,250.0,30.0,,72700.0,True,105132843.1146 +E06000010,"Kingston upon Hull, City of",ENGLAND,2295.04,82540.0,24430.0,11440.0,4990.0,1410.0,320.0,60.0,40.0,,125230.0,True,158193802.34239998 +E06000011,East Riding of Yorkshire,ENGLAND,2466.08,40330.0,38430.0,33140.0,25660.0,17380.0,7740.0,3440.0,300.0,,166420.0,True,322923928.2 +E06000012,North East Lincolnshire,ENGLAND,2483.85,38690.0,18400.0,9390.0,5330.0,2520.0,980.0,510.0,60.0,,75880.0,True,119402941.722 +E06000013,North Lincolnshire,ENGLAND,2348.46,35920.0,16440.0,11580.0,7850.0,4020.0,1720.0,550.0,30.0,,78110.0,True,124935934.9014 +E06000014,York,ENGLAND,2287.15,13150.0,25560.0,27300.0,13880.0,8030.0,3830.0,1930.0,140.0,,93800.0,True,161307680.6415 +E06000015,Derby,ENGLAND,2306.0,58500.0,22270.0,17230.0,8900.0,4850.0,2340.0,710.0,50.0,,114860.0,True,172765773.66 +E06000016,Leicester,ENGLAND,2528.75,86990.0,28270.0,16960.0,7340.0,3570.0,1590.0,620.0,60.0,,145410.0,True,216985639.7625 +E06000017,Rutland,ENGLAND,2737.58,1750.0,4890.0,3340.0,2570.0,2400.0,1690.0,1360.0,170.0,,18160.0,True,44849143.4966 +E06000018,Nottingham,ENGLAND,2755.39,92180.0,25740.0,17180.0,7790.0,2660.0,1120.0,760.0,120.0,,147540.0,True,204079861.5691 +E06000019,"Herefordshire, County of",ENGLAND,2574.37,14040.0,20630.0,17710.0,13820.0,12660.0,7680.0,3800.0,190.0,,90520.0,True,191881285.7988 +E06000020,Telford and Wrekin,ENGLAND,2256.26,26960.0,22860.0,14900.0,10050.0,5870.0,2570.0,1210.0,60.0,,84480.0,True,136176527.1748 +E06000021,Stoke-on-Trent,ENGLAND,2183.12,70450.0,25560.0,15880.0,5100.0,1980.0,560.0,200.0,40.0,,119780.0,True,153262730.4136 +E06000022,Bath and North East Somerset,ENGLAND,2383.42,9370.0,19630.0,21290.0,14500.0,10460.0,5980.0,5210.0,460.0,,86890.0,True,170676301.01860002 +E06000023,"Bristol, City of",ENGLAND,2713.68,56890.0,76330.0,41320.0,19900.0,10120.0,4940.0,2900.0,360.0,,212750.0,True,385352247.8376 +E06000024,North Somerset,ENGLAND,2491.22,13940.0,22140.0,23810.0,18060.0,13390.0,6880.0,3470.0,290.0,,101970.0,True,208481532.3544 +E06000025,South Gloucestershire,ENGLAND,2550.59,14480.0,37160.0,30510.0,24250.0,13700.0,6630.0,2210.0,200.0,,129130.0,True,266248336.30640003 +E06000026,Plymouth,ENGLAND,2441.85,48160.0,33380.0,23670.0,10310.0,5250.0,1890.0,620.0,60.0,,123360.0,True,191876739.2955 +E06000027,Torbay,ENGLAND,2470.25,13790.0,17850.0,17180.0,10750.0,5450.0,2420.0,1290.0,140.0,,68860.0,True,128340628.3275 +E06000030,Swindon,ENGLAND,2438.1,15190.0,28070.0,25270.0,18530.0,9640.0,4020.0,1500.0,70.0,,102290.0,True,192953720.862 +E06000031,Peterborough,ENGLAND,2293.47,35930.0,22730.0,15460.0,9010.0,4930.0,2030.0,1070.0,80.0,,91240.0,True,146052091.4337 +E06000032,Luton,ENGLAND,2439.93,21520.0,28100.0,22860.0,8000.0,3520.0,1130.0,290.0,30.0,,85450.0,True,145845376.1913 +E06000033,Southend-on-Sea,ENGLAND,2265.17,17170.0,16180.0,24770.0,12900.0,6820.0,3710.0,1640.0,130.0,,83310.0,True,142569029.64220002 +E06000034,Thurrock,ENGLAND,2254.68,7540.0,14110.0,27720.0,12800.0,4860.0,2320.0,890.0,60.0,,70300.0,True,123409210.8492 +E06000035,Medway,ENGLAND,2328.55,11470.0,38870.0,35530.0,19470.0,10230.0,4420.0,1560.0,60.0,,121600.0,True,218665514.865 +E06000036,Bracknell Forest,ENGLAND,2264.8,1650.0,5660.0,19880.0,10500.0,8670.0,5450.0,2690.0,310.0,,54820.0,True,113227158.584 +E06000037,West Berkshire,ENGLAND,2505.37,2750.0,7290.0,20500.0,17840.0,10950.0,7120.0,4880.0,780.0,,72100.0,True,170564587.45200002 +E06000038,Reading,ENGLAND,2612.77,7270.0,14990.0,31530.0,12220.0,5920.0,3390.0,1910.0,100.0,,77330.0,True,160555291.3094 +E06000039,Slough,ENGLAND,2414.44,1560.0,10950.0,24390.0,13670.0,4700.0,1730.0,360.0,10.0,,57370.0,True,108753476.0536 +E06000040,Windsor and Maidenhead,ENGLAND,1952.62,2140.0,4110.0,10700.0,16670.0,13590.0,8410.0,9970.0,2020.0,,67610.0,True,141816135.0368 +E06000041,Wokingham,ENGLAND,2497.7,2030.0,4250.0,12130.0,21120.0,17040.0,11160.0,6830.0,570.0,,75140.0,True,194973858.872 +E06000042,Milton Keynes,ENGLAND,2372.21,18060.0,35810.0,32280.0,16440.0,13300.0,7180.0,3240.0,180.0,,126480.0,True,241552441.9611 +E06000043,Brighton and Hove,ENGLAND,2580.54,30090.0,30490.0,35410.0,20470.0,11720.0,4830.0,2840.0,220.0,,136070.0,True,250160876.49659997 +E06000044,Portsmouth,ENGLAND,2291.71,27460.0,31800.0,22440.0,6280.0,3790.0,1660.0,660.0,60.0,,94150.0,True,141561630.9178 +E06000045,Southampton,ENGLAND,2381.48,36920.0,35880.0,23760.0,9790.0,3200.0,1420.0,450.0,30.0,,111450.0,True,166766709.22 +E06000046,Isle of Wight,ENGLAND,2625.79,10650.0,18690.0,18000.0,13460.0,7340.0,3290.0,1570.0,150.0,,73150.0,True,156531403.0753 +E06000047,County Durham,ENGLAND,2622.15,144190.0,36650.0,32590.0,23630.0,11500.0,4490.0,2310.0,280.0,,255650.0,True,398097461.3715 +E06000049,Cheshire East,ENGLAND,2454.87,31710.0,39250.0,37540.0,28220.0,23520.0,15410.0,13130.0,2010.0,,190790.0,True,405983135.6229 +E06000050,Cheshire West and Chester,ENGLAND,2517.33,35320.0,39140.0,33010.0,22530.0,17600.0,10540.0,8110.0,640.0,,166880.0,True,334162542.90389997 +E06000051,Shropshire,ENGLAND,2528.18,27440.0,38890.0,31760.0,22070.0,17630.0,9370.0,4830.0,360.0,,152340.0,True,311591738.141 +E06000052,Cornwall,ENGLAND,2590.93,66210.0,73220.0,61520.0,45030.0,26830.0,9650.0,4430.0,450.0,,287330.0,True,580602125.5231999 +E06000053,Isles of Scilly,ENGLAND,2047.96,10.0,40.0,110.0,270.0,330.0,270.0,130.0,10.0,,1170.0,True,2924282.0840000003 +E06000054,Wiltshire,ENGLAND,2571.78,27030.0,42950.0,58820.0,41200.0,31680.0,18490.0,11570.0,1370.0,,233110.0,True,509263386.9618 +E06000055,Bedford,ENGLAND,2471.74,10800.0,19080.0,20170.0,12480.0,8960.0,5790.0,3290.0,250.0,,80820.0,True,161728840.13579997 +E06000056,Central Bedfordshire,ENGLAND,2516.16,11290.0,25640.0,36860.0,26700.0,17800.0,10200.0,5700.0,410.0,,134600.0,True,287374256.8704 +E06000057,Northumberland,ENGLAND,2596.94,70860.0,26550.0,21800.0,18410.0,12210.0,7600.0,4550.0,590.0,,162560.0,True,307605231.7234 +E06000058,"Bournemouth, Christchurch and Poole",ENGLAND,2435.58,26730.0,34610.0,54390.0,36070.0,21890.0,9450.0,5820.0,1310.0,,190260.0,True,374759089.9416 +E06000059,Dorset,ENGLAND,2765.02,20840.0,31970.0,43430.0,37400.0,28890.0,16160.0,8230.0,740.0,,187640.0,True,455833178.642 +E06000060,Buckinghamshire,ENGLAND,2526.58,6970.0,26310.0,54560.0,47150.0,36730.0,29170.0,31530.0,6160.0,,238580.0,True,600363690.9438 +E06000061,North Northamptonshire,ENGLAND,2423.96,48480.0,42960.0,29500.0,18750.0,12750.0,5530.0,3060.0,280.0,,161300.0,True,290406600.0528 +E06000062,West Northamptonshire,ENGLAND,2486.66,38700.0,41080.0,46110.0,24480.0,17970.0,10680.0,6520.0,490.0,,186010.0,True,367682918.7856 +E06000063,Cumberland,ENGLAND,2511.32,64010.0,25940.0,20470.0,15630.0,8470.0,2980.0,980.0,80.0,,138560.0,True,236997160.946 +E06000064,Westmorland and Furness,ENGLAND,2507.99,29300.0,24520.0,23280.0,17770.0,12750.0,6480.0,3440.0,340.0,,117860.0,True,242993207.1637 +E06000065,North Yorkshire,ENGLAND,2544.34,48920.0,65620.0,70150.0,46130.0,37890.0,22340.0,14070.0,1310.0,,306440.0,True,660473592.9662 +E06000066,Somerset,ENGLAND,2560.59,43360.0,72220.0,59900.0,40390.0,31050.0,16940.0,7820.0,520.0,,272210.0,True,564425860.5495 +E07000008,Cambridge,ENGLAND,2467.02,4420.0,11090.0,20890.0,10610.0,6060.0,3990.0,3270.0,510.0,,60840.0,True,116051433.2028 +E07000009,East Cambridgeshire,ENGLAND,2485.18,5000.0,11670.0,8580.0,7610.0,5110.0,2460.0,820.0,90.0,,41350.0,True,84112209.39359999 +E07000010,Fenland,ENGLAND,2537.74,17450.0,13190.0,9030.0,4960.0,2520.0,710.0,190.0,30.0,,48060.0,True,83011632.47899999 +E07000011,Huntingdonshire,ENGLAND,2556.4,12600.0,21820.0,19420.0,12970.0,10360.0,4490.0,2010.0,180.0,,83840.0,True,170498919.052 +E07000012,South Cambridgeshire,ENGLAND,2536.25,2780.0,8620.0,22500.0,13830.0,12340.0,8670.0,4900.0,420.0,,74060.0,True,176533018.1875 +E07000032,Amber Valley,ENGLAND,2407.69,22980.0,12960.0,11020.0,7050.0,3630.0,1940.0,1550.0,140.0,,61270.0,True,103047976.3088 +E07000033,Bolsover,ENGLAND,2559.41,22440.0,6910.0,4880.0,3040.0,1150.0,350.0,150.0,20.0,,38940.0,True,61046074.74419999 +E07000034,Chesterfield,ENGLAND,2339.49,27100.0,10630.0,6530.0,4070.0,2150.0,620.0,220.0,30.0,,51350.0,True,72837728.4498 +E07000035,Derbyshire Dales,ENGLAND,2444.7,3680.0,7630.0,7720.0,5850.0,5290.0,3300.0,2170.0,140.0,,35770.0,True,77618344.90799999 +E07000036,Erewash,ENGLAND,2360.64,22010.0,14290.0,7900.0,5080.0,2430.0,920.0,530.0,40.0,,53190.0,True,83145730.2816 +E07000037,High Peak,ENGLAND,2384.66,8670.0,13380.0,9510.0,5120.0,4100.0,2200.0,860.0,50.0,,43890.0,True,78740328.56319998 +E07000038,North East Derbyshire,ENGLAND,2466.57,19260.0,10030.0,8200.0,5700.0,3300.0,1630.0,900.0,70.0,,49080.0,True,84402991.51889999 +E07000039,South Derbyshire,ENGLAND,2339.61,11910.0,11780.0,9770.0,8370.0,5700.0,2430.0,1020.0,100.0,,51070.0,True,92340288.9864 +E07000040,East Devon,ENGLAND,2595.46,6860.0,14150.0,17830.0,13670.0,11400.0,6700.0,4270.0,210.0,,75100.0,True,172658590.1726 +E07000041,Exeter,ENGLAND,2495.36,13480.0,15450.0,14560.0,10030.0,4570.0,2220.0,1020.0,50.0,,61380.0,True,102276147.5008 +E07000042,Mid Devon,ENGLAND,2656.41,6550.0,9380.0,7290.0,6700.0,5010.0,2640.0,980.0,60.0,,38610.0,True,83891659.18439999 +E07000043,North Devon,ENGLAND,2642.21,10450.0,11830.0,10620.0,8670.0,5100.0,2040.0,640.0,50.0,,49400.0,True,101676124.8487 +E07000044,South Hams,ENGLAND,2615.22,5360.0,9100.0,9570.0,8500.0,7590.0,4140.0,3200.0,380.0,,47840.0,True,121130556.9588 +E07000045,Teignbridge,ENGLAND,2643.12,9080.0,14740.0,14520.0,12280.0,8610.0,4110.0,2060.0,120.0,,65510.0,True,140888947.77359998 +E07000046,Torridge,ENGLAND,2601.42,8460.0,7500.0,7340.0,6150.0,3520.0,1210.0,390.0,30.0,,34600.0,True,70389872.715 +E07000047,West Devon,ENGLAND,2705.33,3640.0,6760.0,5760.0,4560.0,3710.0,1920.0,1050.0,80.0,,27470.0,True,61999400.275 +E07000061,Eastbourne,ENGLAND,2654.28,8870.0,13370.0,10980.0,8760.0,4600.0,2070.0,1130.0,90.0,,49870.0,True,100026807.228 +E07000062,Hastings,ENGLAND,2676.58,14990.0,12520.0,7810.0,5800.0,2350.0,860.0,200.0,40.0,,44570.0,True,78580133.0378 +E07000063,Lewes,ENGLAND,2756.17,4510.0,6410.0,13850.0,10360.0,6260.0,3300.0,2420.0,250.0,,47360.0,True,109470855.4599 +E07000064,Rother,ENGLAND,2700.95,5050.0,7420.0,10230.0,9430.0,7690.0,4110.0,2770.0,280.0,,46970.0,True,108819546.892 +E07000065,Wealden,ENGLAND,2728.43,4360.0,8470.0,17900.0,16070.0,12010.0,8130.0,7340.0,950.0,,75240.0,True,192940927.45 +E07000066,Basildon,ENGLAND,2327.24,9100.0,16310.0,24750.0,14900.0,7930.0,4900.0,2080.0,200.0,,80160.0,True,147426464.96799996 +E07000067,Braintree,ENGLAND,2280.34,6240.0,17650.0,20390.0,10900.0,8240.0,4990.0,2500.0,230.0,,71150.0,True,136107360.4854 +E07000068,Brentwood,ENGLAND,2258.14,690.0,3080.0,6950.0,8900.0,6470.0,4620.0,4060.0,660.0,,35420.0,True,79803886.9956 +E07000069,Castle Point,ENGLAND,2318.63,3370.0,6440.0,13880.0,8710.0,4480.0,1920.0,770.0,70.0,,39630.0,True,74080576.29450001 +E07000070,Chelmsford,ENGLAND,2300.18,5180.0,10960.0,23980.0,18540.0,11460.0,6610.0,4590.0,450.0,,81760.0,True,167657590.00199997 +E07000071,Colchester,ENGLAND,2282.85,9600.0,23120.0,21170.0,16230.0,9320.0,4310.0,2600.0,170.0,,86520.0,True,154434870.98549998 +E07000072,Epping Forest,ENGLAND,2277.21,2120.0,5220.0,12060.0,14210.0,10280.0,7130.0,6320.0,1260.0,,58610.0,True,130820750.1822 +E07000073,Harlow,ENGLAND,2298.69,2620.0,8360.0,19630.0,5240.0,3070.0,1180.0,450.0,20.0,,40560.0,True,70293043.71090001 +E07000074,Maldon,ENGLAND,2328.37,2480.0,3980.0,8640.0,5690.0,4710.0,3180.0,1700.0,190.0,,30560.0,True,64400222.8441 +E07000075,Rochford,ENGLAND,2363.48,1580.0,4080.0,12110.0,10890.0,5350.0,2800.0,1450.0,80.0,,38340.0,True,80682376.7428 +E07000076,Tendring,ENGLAND,2269.63,13840.0,18040.0,22070.0,12380.0,6120.0,2160.0,980.0,90.0,,75690.0,True,127770023.7539 +E07000077,Uttlesford,ENGLAND,2333.82,1430.0,4180.0,8770.0,8080.0,7610.0,5310.0,4960.0,460.0,,40790.0,True,95153738.8794 +E07000078,Cheltenham,ENGLAND,2369.52,9990.0,13530.0,14150.0,9450.0,5270.0,2800.0,2210.0,150.0,,57560.0,True,107492824.5912 +E07000079,Cotswold,ENGLAND,2391.65,3710.0,5430.0,11550.0,7770.0,6740.0,5310.0,4950.0,780.0,,46250.0,True,108783482.755 +E07000080,Forest of Dean,ENGLAND,2443.42,7210.0,10410.0,9230.0,6150.0,4670.0,2190.0,1040.0,80.0,,40980.0,True,77993453.2818 +E07000081,Gloucester,ENGLAND,2355.84,17700.0,16980.0,14340.0,6110.0,3880.0,930.0,180.0,10.0,,60130.0,True,96160677.12 +E07000082,Stroud,ENGLAND,2491.36,7630.0,13050.0,13150.0,8640.0,7320.0,4230.0,2660.0,260.0,,56940.0,True,120515229.9472 +E07000083,Tewkesbury,ENGLAND,2340.53,7060.0,7130.0,13060.0,6790.0,6070.0,3780.0,2130.0,210.0,,46230.0,True,91803099.7013 +E07000084,Basingstoke and Deane,ENGLAND,2255.21,2620.0,13300.0,28100.0,15490.0,11350.0,6790.0,3570.0,460.0,,81690.0,True,161429600.6554 +E07000085,East Hampshire,ENGLAND,2343.92,3080.0,6360.0,13430.0,11590.0,9270.0,6950.0,5160.0,670.0,,56500.0,True,125280437.9112 +E07000086,Eastleigh,ENGLAND,2342.21,4710.0,12600.0,19810.0,11260.0,8190.0,3510.0,1210.0,30.0,,61320.0,True,120453442.6446 +E07000087,Fareham,ENGLAND,2270.55,3640.0,7390.0,15710.0,10880.0,8130.0,3720.0,1530.0,140.0,,51150.0,True,102211759.96500002 +E07000088,Gosport,ENGLAND,2344.29,6170.0,13380.0,9230.0,5170.0,2010.0,1570.0,330.0,20.0,,37880.0,True,65026548.9783 +E07000089,Hart,ENGLAND,2400.02,780.0,2600.0,10120.0,9720.0,8280.0,7220.0,4050.0,260.0,,43030.0,True,104670992.251 +E07000090,Havant,ENGLAND,2320.28,8610.0,14860.0,13770.0,10550.0,5950.0,2590.0,990.0,50.0,,57380.0,True,100856260.4384 +E07000091,New Forest,ENGLAND,2419.76,7330.0,12250.0,18260.0,19460.0,13700.0,7220.0,4700.0,620.0,,83540.0,True,182225326.0744 +E07000092,Rushmoor,ENGLAND,2320.28,1500.0,9090.0,16950.0,9310.0,4250.0,1320.0,330.0,20.0,,42770.0,True,77926023.73 +E07000093,Test Valley,ENGLAND,2305.52,3120.0,10040.0,15600.0,11420.0,8800.0,5320.0,3950.0,560.0,,58810.0,True,122507609.308 +E07000094,Winchester,ENGLAND,2359.76,3050.0,7530.0,13750.0,11310.0,9190.0,7180.0,6020.0,750.0,,58770.0,True,130385919.4664 +E07000095,Broxbourne,ENGLAND,2306.43,590.0,3820.0,9960.0,14530.0,7880.0,3010.0,2350.0,230.0,,42360.0,True,86002461.67589998 +E07000096,Dacorum,ENGLAND,2408.51,1240.0,8300.0,20760.0,16240.0,9420.0,5860.0,5260.0,850.0,,67930.0,True,148105614.2813 +E07000098,Hertsmere,ENGLAND,2405.83,820.0,3090.0,7450.0,14980.0,8990.0,4640.0,4750.0,1230.0,,45940.0,True,105962184.0536 +E07000099,North Hertfordshire,ENGLAND,2448.52,3450.0,9440.0,20320.0,10450.0,7490.0,4900.0,3630.0,360.0,,60020.0,True,126916316.3428 +E07000102,Three Rivers,ENGLAND,2422.31,890.0,2430.0,6980.0,10030.0,7560.0,4470.0,5170.0,1630.0,,39150.0,True,95732065.0638 +E07000103,Watford,ENGLAND,2446.7,470.0,4490.0,16000.0,14260.0,3890.0,2220.0,1930.0,80.0,,43350.0,True,88923036.06899999 +E07000105,Ashford,ENGLAND,2410.16,4380.0,13910.0,13710.0,10220.0,7120.0,6220.0,3570.0,220.0,,59350.0,True,122977522.2408 +E07000106,Canterbury,ENGLAND,2419.33,7760.0,14100.0,21250.0,14160.0,7950.0,4210.0,2320.0,120.0,,71860.0,True,136703588.4309 +E07000107,Dartford,ENGLAND,2375.15,1750.0,6830.0,15370.0,14590.0,7750.0,3030.0,1120.0,70.0,,50510.0,True,102951399.283 +E07000108,Dover,ENGLAND,2461.74,7300.0,17350.0,14600.0,7750.0,4650.0,2580.0,1590.0,80.0,,55890.0,True,105381919.746 +E07000109,Gravesham,ENGLAND,2408.24,3680.0,7050.0,15260.0,10970.0,4780.0,2130.0,1100.0,110.0,,45070.0,True,87394547.95199999 +E07000110,Maidstone,ENGLAND,2502.59,4520.0,9570.0,21210.0,20600.0,10980.0,6610.0,4720.0,390.0,,78600.0,True,174634859.47349998 +E07000111,Sevenoaks,ENGLAND,2522.36,1910.0,3480.0,11660.0,12160.0,7730.0,6170.0,7990.0,1550.0,,52660.0,True,135170775.26360002 +E07000112,Folkestone and Hythe,ENGLAND,2538.75,7190.0,13030.0,14680.0,8720.0,5280.0,2790.0,1980.0,100.0,,53780.0,True,108702648.8625 +E07000113,Swale,ENGLAND,2405.65,10400.0,16590.0,17920.0,12190.0,6130.0,2820.0,1310.0,120.0,,67470.0,True,124193966.6175 +E07000114,Thanet,ENGLAND,2490.9,16400.0,20220.0,18390.0,8250.0,4210.0,1660.0,840.0,40.0,,70010.0,True,122454935.628 +E07000115,Tonbridge and Malling,ENGLAND,2471.83,1770.0,4080.0,16220.0,14410.0,9650.0,5570.0,5100.0,470.0,,57270.0,True,135852345.3209 +E07000116,Tunbridge Wells,ENGLAND,2446.15,3500.0,5440.0,14220.0,11090.0,7180.0,5240.0,5620.0,620.0,,52900.0,True,121677542.9905 +E07000117,Burnley,ENGLAND,2549.42,25800.0,5850.0,6530.0,3080.0,1350.0,340.0,130.0,20.0,,43090.0,True,63026276.850200005 +E07000118,Chorley,ENGLAND,2430.23,15200.0,12200.0,9810.0,7020.0,5490.0,2390.0,1050.0,70.0,,53230.0,True,95874955.1254 +E07000119,Fylde,ENGLAND,2483.94,7180.0,7030.0,9690.0,7560.0,5420.0,2960.0,1690.0,140.0,,41680.0,True,82953511.2036 +E07000120,Hyndburn,ENGLAND,2465.98,21980.0,5870.0,5900.0,2870.0,870.0,280.0,170.0,10.0,,37960.0,True,56535230.0986 +E07000121,Lancaster,ENGLAND,2503.19,23600.0,16510.0,12830.0,6740.0,4270.0,2130.0,870.0,80.0,,67020.0,True,111255931.6554 +E07000122,Pendle,ENGLAND,2640.18,25170.0,4850.0,4640.0,3500.0,1890.0,1030.0,550.0,40.0,,41660.0,True,68878098.31379999 +E07000123,Preston,ENGLAND,2575.74,31000.0,13610.0,11260.0,7490.0,3750.0,2130.0,1080.0,70.0,,70390.0,True,120344265.1854 +E07000124,Ribble Valley,ENGLAND,2386.5,3900.0,5620.0,5810.0,5100.0,4310.0,2680.0,2050.0,240.0,,29700.0,True,62155509.495000005 +E07000125,Rossendale,ENGLAND,2519.97,16480.0,5250.0,4430.0,3460.0,2040.0,720.0,470.0,40.0,,32890.0,True,55365000.885 +E07000126,South Ribble,ENGLAND,2442.66,10130.0,13620.0,13130.0,8660.0,4510.0,1770.0,610.0,30.0,,52470.0,True,95763190.6902 +E07000127,West Lancashire,ENGLAND,2456.23,14980.0,9760.0,10530.0,7650.0,5430.0,2690.0,1700.0,110.0,,52850.0,True,99299213.7627 +E07000128,Wyre,ENGLAND,2460.53,12060.0,12580.0,13420.0,7900.0,6050.0,2760.0,1150.0,80.0,,55980.0,True,101098232.0347 +E07000129,Blaby,ENGLAND,2490.22,5040.0,15700.0,10280.0,6940.0,4640.0,1660.0,550.0,40.0,,44840.0,True,87035255.8826 +E07000130,Charnwood,ENGLAND,2405.64,13340.0,22020.0,19430.0,11510.0,7600.0,3430.0,2070.0,230.0,,79620.0,True,146830955.77319998 +E07000131,Harborough,ENGLAND,2389.87,4750.0,9770.0,8640.0,7110.0,7400.0,4120.0,2840.0,260.0,,44900.0,True,96766553.261 +E07000132,Hinckley and Bosworth,ENGLAND,2382.62,8930.0,16590.0,11540.0,7590.0,4630.0,2350.0,1160.0,70.0,,52840.0,True,97034200.9008 +E07000133,Melton,ENGLAND,2429.67,3700.0,7790.0,4100.0,4050.0,2690.0,1640.0,1050.0,90.0,,25110.0,True,50451320.0556 +E07000134,North West Leicestershire,ENGLAND,2418.2,10270.0,14790.0,8280.0,7300.0,5420.0,2050.0,990.0,60.0,,49150.0,True,92237450.964 +E07000135,Oadby and Wigston,ENGLAND,2406.85,4150.0,6340.0,7340.0,3290.0,2200.0,650.0,490.0,90.0,,24560.0,True,45705768.6095 +E07000136,Boston,ENGLAND,2308.73,15550.0,6610.0,6240.0,2390.0,880.0,240.0,80.0,20.0,,31990.0,True,47770163.303 +E07000137,East Lindsey,ENGLAND,2275.88,28110.0,15500.0,16290.0,6970.0,3790.0,1490.0,610.0,60.0,,72820.0,True,113440237.2128 +E07000138,Lincoln,ENGLAND,2323.08,28930.0,9140.0,4950.0,2570.0,1440.0,530.0,140.0,40.0,,47750.0,True,61694105.2524 +E07000139,North Kesteven,ENGLAND,2337.81,14220.0,14110.0,13430.0,7480.0,3840.0,1680.0,430.0,60.0,,55250.0,True,95308586.1792 +E07000140,South Holland,ENGLAND,2278.2,16760.0,9810.0,10700.0,4790.0,2150.0,450.0,120.0,20.0,,44790.0,True,71420499.24599999 +E07000141,South Kesteven,ENGLAND,2260.0,20100.0,15530.0,11790.0,9650.0,6080.0,3130.0,1130.0,110.0,,67510.0,True,114197302.8 +E07000142,West Lindsey,ENGLAND,2354.25,17270.0,8670.0,8200.0,6290.0,3970.0,1690.0,550.0,70.0,,46710.0,True,79041283.4475 +E07000143,Breckland,ENGLAND,2443.67,16260.0,18480.0,14810.0,8550.0,5040.0,1910.0,830.0,60.0,,65950.0,True,117759650.8889 +E07000144,Broadland,ENGLAND,2437.78,5060.0,16080.0,21850.0,10660.0,5650.0,2370.0,880.0,100.0,,62650.0,True,122031390.72980002 +E07000145,Great Yarmouth,ENGLAND,2414.41,20910.0,12800.0,9080.0,4480.0,2020.0,640.0,260.0,20.0,,50210.0,True,78466876.354 +E07000146,King's Lynn and West Norfolk,ENGLAND,2430.13,24670.0,17970.0,13850.0,10010.0,5410.0,2790.0,1220.0,120.0,,76030.0,True,139444747.608 +E07000147,North Norfolk,ENGLAND,2459.93,12190.0,14640.0,11880.0,9220.0,5130.0,2460.0,1100.0,90.0,,56700.0,True,115525372.7991 +E07000148,Norwich,ENGLAND,2503.44,28590.0,23800.0,9090.0,3760.0,2360.0,930.0,610.0,70.0,,69220.0,True,104319095.832 +E07000149,South Norfolk,ENGLAND,2482.87,7340.0,18430.0,16780.0,11990.0,7950.0,3400.0,1580.0,120.0,,67590.0,True,135243344.1359 +E07000170,Ashfield,ENGLAND,2608.76,30290.0,11920.0,9110.0,4460.0,1560.0,520.0,130.0,30.0,,58020.0,True,93062738.9692 +E07000171,Bassetlaw,ENGLAND,2644.95,28230.0,9040.0,7100.0,7070.0,3530.0,1720.0,740.0,60.0,,57490.0,True,104384221.326 +E07000172,Broxtowe,ENGLAND,2618.21,16870.0,13610.0,11200.0,6230.0,2840.0,840.0,510.0,30.0,,52130.0,True,94838792.4596 +E07000173,Gedling,ENGLAND,2609.55,14900.0,15650.0,10760.0,7070.0,4390.0,1500.0,950.0,100.0,,55320.0,True,105315566.5125 +E07000174,Mansfield,ENGLAND,2600.38,27850.0,9960.0,7030.0,4250.0,1770.0,470.0,210.0,30.0,,51550.0,True,82840253.6524 +E07000175,Newark and Sherwood,ENGLAND,2682.1,24260.0,8980.0,9640.0,6640.0,4570.0,2810.0,1530.0,140.0,,58560.0,True,115832603.688 +E07000176,Rushcliffe,ENGLAND,2643.27,6420.0,11430.0,12090.0,10200.0,7720.0,4640.0,2720.0,150.0,,55380.0,True,126555776.2623 +E07000177,Cherwell,ENGLAND,2582.96,6230.0,16680.0,19780.0,12700.0,9260.0,4490.0,2890.0,270.0,,72300.0,True,157880562.9144 +E07000178,Oxford,ENGLAND,2678.4,2970.0,9890.0,19810.0,16320.0,7670.0,3140.0,3370.0,610.0,,63780.0,True,133562326.464 +E07000179,South Oxfordshire,ENGLAND,2597.57,2130.0,6070.0,18530.0,15260.0,10980.0,6810.0,6420.0,990.0,,67190.0,True,169008476.30990002 +E07000180,Vale of White Horse,ENGLAND,2577.44,1910.0,6870.0,19390.0,14150.0,10450.0,6620.0,4870.0,490.0,,64750.0,True,156141676.0416 +E07000181,West Oxfordshire,ENGLAND,2566.95,1690.0,6220.0,17990.0,11950.0,7990.0,4640.0,3100.0,420.0,,53990.0,True,128058641.1165 +E07000192,Cannock Chase,ENGLAND,2375.83,14120.0,14510.0,8860.0,5680.0,2000.0,660.0,280.0,20.0,,46120.0,True,73182739.00659999 +E07000193,East Staffordshire,ENGLAND,2351.34,18370.0,12310.0,9590.0,6790.0,5160.0,2660.0,1300.0,100.0,,56270.0,True,98871566.2002 +E07000194,Lichfield,ENGLAND,2351.9,6010.0,11020.0,12460.0,7530.0,5140.0,4030.0,2730.0,430.0,,49330.0,True,99099705.438 +E07000195,Newcastle-under-Lyme,ENGLAND,2334.25,24990.0,10910.0,11780.0,4990.0,2910.0,1860.0,1020.0,50.0,,58520.0,True,92254905.4325 +E07000196,South Staffordshire,ENGLAND,2313.67,6900.0,10910.0,12080.0,7570.0,5600.0,3610.0,2490.0,220.0,,49370.0,True,94538916.1434 +E07000197,Stafford,ENGLAND,2302.68,12420.0,14480.0,14660.0,10060.0,7020.0,3780.0,1660.0,110.0,,64170.0,True,117457312.0128 +E07000198,Staffordshire Moorlands,ENGLAND,2338.21,9660.0,10860.0,10880.0,6360.0,4560.0,2020.0,810.0,40.0,,45180.0,True,81123728.30800001 +E07000199,Tamworth,ENGLAND,2300.76,9530.0,12410.0,6180.0,4020.0,2210.0,600.0,130.0,10.0,,35070.0,True,55627499.18880001 +E07000200,Babergh,ENGLAND,2341.55,5220.0,12430.0,9280.0,7820.0,4880.0,2650.0,1800.0,200.0,,44280.0,True,86388232.49550001 +E07000202,Ipswich,ENGLAND,2468.25,19420.0,23220.0,11540.0,4510.0,2370.0,960.0,380.0,20.0,,62410.0,True,100245258.675 +E07000203,Mid Suffolk,ENGLAND,2316.88,5950.0,13510.0,11200.0,8080.0,6420.0,3390.0,1740.0,110.0,,50400.0,True,98656457.408 +E07000207,Elmbridge,ENGLAND,2557.75,460.0,1890.0,8180.0,14150.0,11310.0,8140.0,11460.0,4550.0,,60130.0,True,174567000.205 +E07000208,Epsom and Ewell,ENGLAND,2530.84,160.0,1270.0,5610.0,9290.0,7810.0,4830.0,4180.0,150.0,,33310.0,True,86398878.87280001 +E07000209,Guildford,ENGLAND,2547.3,2290.0,3550.0,12790.0,16940.0,10640.0,6920.0,7590.0,1860.0,,62580.0,True,159479498.871 +E07000210,Mole Valley,ENGLAND,2519.86,1690.0,2740.0,4520.0,8420.0,7240.0,6310.0,7830.0,1080.0,,39830.0,True,107809539.0484 +E07000211,Reigate and Banstead,ENGLAND,2566.61,1230.0,4270.0,13130.0,18260.0,11660.0,7700.0,7540.0,1140.0,,64930.0,True,167523096.6898 +E07000212,Runnymede,ENGLAND,2492.99,2500.0,1610.0,8040.0,11690.0,6950.0,4300.0,3230.0,1140.0,,39460.0,True,92856672.7589 +E07000213,Spelthorne,ENGLAND,2526.44,460.0,1790.0,10140.0,15180.0,10110.0,4730.0,2200.0,120.0,,44730.0,True,106445081.7136 +E07000214,Surrey Heath,ENGLAND,2585.16,740.0,2650.0,6380.0,10230.0,6900.0,5940.0,5330.0,540.0,,38700.0,True,105937943.7816 +E07000215,Tandridge,ENGLAND,2594.85,940.0,2230.0,5440.0,9130.0,7870.0,4940.0,6400.0,1290.0,,38240.0,True,103822024.38 +E07000216,Waverley,ENGLAND,2604.87,1030.0,3480.0,10920.0,13590.0,10110.0,7380.0,8910.0,2180.0,,57590.0,True,157838242.44239998 +E07000217,Woking,ENGLAND,2598.04,340.0,3620.0,11320.0,12600.0,6360.0,4240.0,5260.0,830.0,,44560.0,True,114327659.514 +E07000218,North Warwickshire,ENGLAND,2532.1,6750.0,7510.0,6520.0,4060.0,2610.0,1420.0,790.0,80.0,,29740.0,True,56553111.487 +E07000219,Nuneaton and Bedworth,ENGLAND,2502.16,20960.0,13710.0,14700.0,7910.0,3180.0,870.0,200.0,20.0,,61530.0,True,105203242.1352 +E07000220,Rugby,ENGLAND,2483.05,9090.0,12130.0,12530.0,7400.0,5280.0,3530.0,1910.0,110.0,,51990.0,True,104257558.485 +E07000221,Stratford-on-Avon,ENGLAND,2484.17,3850.0,8630.0,18950.0,11350.0,10780.0,6850.0,5980.0,1000.0,,67380.0,True,156157534.5785 +E07000222,Warwick,ENGLAND,2461.55,5040.0,12630.0,18940.0,13730.0,8520.0,5700.0,4720.0,460.0,,69750.0,True,147803375.902 +E07000223,Adur,ENGLAND,2548.28,2780.0,5110.0,11580.0,6340.0,2050.0,760.0,340.0,10.0,,28980.0,True,56716252.510400005 +E07000224,Arun,ENGLAND,2487.24,8520.0,12990.0,21180.0,16680.0,10930.0,6350.0,2800.0,310.0,,79760.0,True,168637981.04999998 +E07000225,Chichester,ENGLAND,2469.68,3350.0,6540.0,15290.0,13040.0,9560.0,6440.0,6020.0,1360.0,,61610.0,True,147627418.8024 +E07000226,Crawley,ENGLAND,2418.46,1300.0,7670.0,22570.0,9100.0,3820.0,2350.0,470.0,10.0,,47290.0,True,89533759.2908 +E07000227,Horsham,ENGLAND,2441.01,2440.0,6790.0,14020.0,14410.0,11640.0,8560.0,8080.0,840.0,,66760.0,True,161787091.53750002 +E07000228,Mid Sussex,ENGLAND,2474.26,2340.0,7790.0,15320.0,17830.0,12370.0,9200.0,5050.0,450.0,,70340.0,True,167375845.5958 +E07000229,Worthing,ENGLAND,2456.13,8370.0,11640.0,13190.0,9760.0,5610.0,2450.0,930.0,30.0,,51980.0,True,99423479.24490002 +E07000234,Bromsgrove,ENGLAND,2478.65,3950.0,7460.0,9350.0,8060.0,7220.0,3850.0,2920.0,380.0,,43190.0,True,95860549.425 +E07000235,Malvern Hills,ENGLAND,2450.92,4100.0,7690.0,8820.0,5980.0,5370.0,4150.0,2550.0,130.0,,38780.0,True,83479413.6048 +E07000236,Redditch,ENGLAND,2462.95,8040.0,12220.0,7970.0,4490.0,3450.0,1290.0,480.0,20.0,,37960.0,True,66457090.224 +E07000237,Worcester,ENGLAND,2405.81,9010.0,15430.0,12030.0,5670.0,3590.0,1620.0,450.0,10.0,,47800.0,True,82468785.04810001 +E07000238,Wychavon,ENGLAND,2373.19,7180.0,12070.0,14580.0,8550.0,7890.0,6900.0,4850.0,230.0,,62250.0,True,131136427.7655 +E07000239,Wyre Forest,ENGLAND,2512.47,11730.0,11960.0,12080.0,6540.0,3610.0,1800.0,1300.0,140.0,,49150.0,True,88924076.83229998 +E07000240,St Albans,ENGLAND,2419.22,880.0,3220.0,10530.0,16530.0,13100.0,9530.0,8270.0,1410.0,,63480.0,True,159353973.01559997 +E07000241,Welwyn Hatfield,ENGLAND,2452.26,1250.0,5850.0,16360.0,12550.0,5590.0,4500.0,3960.0,750.0,,50790.0,True,110078150.397 +E07000242,East Hertfordshire,ENGLAND,2454.78,1000.0,6460.0,16520.0,17010.0,12070.0,8140.0,5950.0,870.0,,68010.0,True,163143549.60119998 +E07000243,Stevenage,ENGLAND,2391.97,1700.0,6890.0,21760.0,3380.0,3280.0,980.0,430.0,20.0,,38440.0,True,69980502.8671 +E07000244,East Suffolk,ENGLAND,2334.8,28230.0,31230.0,23810.0,18810.0,11760.0,5650.0,3070.0,250.0,,122810.0,True,226694674.284 +E07000245,West Suffolk,ENGLAND,2351.47,12730.0,29030.0,17370.0,12390.0,7410.0,3050.0,2100.0,200.0,,84280.0,True,145044054.46629998 +E08000001,Bolton,ENGLAND,2399.74,65640.0,22820.0,18990.0,11000.0,5820.0,2370.0,1930.0,250.0,,128800.0,True,200612072.67079997 +E08000002,Bury,ENGLAND,2555.15,30710.0,18680.0,17540.0,9380.0,5700.0,1900.0,1320.0,180.0,,85410.0,True,151795814.6185 +E08000003,Manchester,ENGLAND,2312.04,137810.0,43100.0,38170.0,21260.0,7640.0,3400.0,1270.0,150.0,,252810.0,True,329432337.26280004 +E08000004,Oldham,ENGLAND,2602.23,51140.0,17700.0,16730.0,7310.0,3540.0,1630.0,940.0,80.0,,99070.0,True,159794278.8741 +E08000005,Rochdale,ENGLAND,2600.83,51910.0,17400.0,13280.0,8260.0,4580.0,1710.0,900.0,50.0,,98100.0,True,159790833.872 +E08000006,Salford,ENGLAND,2594.45,63640.0,31220.0,22180.0,12350.0,3910.0,1490.0,880.0,110.0,,135780.0,True,217839621.46499997 +E08000007,Stockport,ENGLAND,2618.9,31820.0,29160.0,28940.0,19920.0,13320.0,6570.0,3620.0,230.0,,133580.0,True,262258400.663 +E08000008,Tameside,ENGLAND,2447.21,53040.0,19680.0,20250.0,7290.0,4000.0,950.0,450.0,40.0,,105700.0,True,163602522.5507 +E08000009,Trafford,ENGLAND,2291.7,20050.0,23020.0,27720.0,15590.0,7940.0,4690.0,4230.0,1070.0,,104300.0,True,190331322.582 +E08000010,Wigan,ENGLAND,2152.68,68940.0,34800.0,25810.0,13480.0,7730.0,2030.0,650.0,60.0,,153490.0,True,214035504.5928 +E08000011,Knowsley,ENGLAND,2488.25,38180.0,15340.0,10660.0,5000.0,2110.0,330.0,130.0,20.0,,71770.0,True,102122010.025 +E08000012,Liverpool,ENGLAND,2673.59,143680.0,44920.0,29870.0,14000.0,5140.0,2360.0,1760.0,150.0,,241880.0,True,341610797.0288 +E08000013,St. Helens,ENGLAND,2403.38,37850.0,19360.0,15770.0,7030.0,3810.0,1690.0,600.0,40.0,,86150.0,True,135803491.6098 +E08000014,Sefton,ENGLAND,2583.22,39990.0,28250.0,31380.0,15840.0,8930.0,3990.0,2740.0,290.0,,131400.0,True,236006001.5674 +E08000015,Wirral,ENGLAND,2500.59,61080.0,33140.0,27740.0,13690.0,8580.0,4390.0,3220.0,290.0,,152120.0,True,252960384.5652 +E08000016,Barnsley,ENGLAND,2325.96,65310.0,19340.0,14570.0,9790.0,4190.0,1630.0,710.0,60.0,,115610.0,True,164690528.184 +E08000017,Doncaster,ENGLAND,2167.75,82760.0,27200.0,16270.0,10220.0,4900.0,2280.0,980.0,140.0,,144760.0,True,193081752.63 +E08000018,Rotherham,ENGLAND,2381.53,64280.0,24200.0,16130.0,9790.0,5070.0,2010.0,810.0,70.0,,122350.0,True,180542241.30550003 +E08000019,Sheffield,ENGLAND,2510.16,152470.0,42460.0,33260.0,16910.0,9780.0,4420.0,2890.0,220.0,,262400.0,True,393731372.7144 +E08000021,Newcastle upon Tyne,ENGLAND,2542.19,77750.0,21680.0,20520.0,10160.0,5940.0,2640.0,1930.0,140.0,,140760.0,True,202683393.8353 +E08000022,North Tyneside,ENGLAND,2461.77,50580.0,16240.0,20200.0,8490.0,4540.0,1590.0,380.0,40.0,,102050.0,True,161795549.77019998 +E08000023,South Tyneside,ENGLAND,2434.43,45760.0,10470.0,8880.0,4940.0,1850.0,730.0,340.0,50.0,,73020.0,True,97994108.9063 +E08000024,Sunderland,ENGLAND,2197.14,80320.0,20110.0,18370.0,10090.0,3780.0,1230.0,700.0,60.0,,134650.0,True,174110755.3878 +E08000025,Birmingham,ENGLAND,2362.9,164600.0,132630.0,85230.0,44530.0,23130.0,9140.0,5960.0,930.0,,466150.0,True,667795638.413 +E08000026,Coventry,ENGLAND,2516.72,63820.0,44330.0,25210.0,10750.0,5230.0,2610.0,1490.0,190.0,,153630.0,True,240351793.43999997 +E08000027,Dudley,ENGLAND,2144.84,43610.0,40300.0,31110.0,16400.0,7150.0,2530.0,980.0,140.0,,142230.0,True,214959553.9248 +E08000028,Sandwell,ENGLAND,2244.46,59230.0,44650.0,21640.0,7680.0,2990.0,550.0,70.0,40.0,,136860.0,True,186768586.649 +E08000029,Solihull,ENGLAND,2197.26,14590.0,12510.0,23390.0,17700.0,12200.0,9260.0,5820.0,490.0,,95950.0,True,178805570.0886 +E08000030,Walsall,ENGLAND,2627.48,52370.0,27810.0,18930.0,10490.0,5680.0,2420.0,860.0,60.0,,118620.0,True,201080913.026 +E08000031,Wolverhampton,ENGLAND,2538.99,57530.0,25570.0,17660.0,7370.0,3150.0,1730.0,1000.0,130.0,,114130.0,True,176264505.8892 +E08000032,Bradford,ENGLAND,2360.73,92730.0,46940.0,41630.0,19000.0,13330.0,6260.0,3820.0,330.0,,224030.0,True,360921787.7391 +E08000033,Calderdale,ENGLAND,2420.15,44900.0,18530.0,16060.0,7730.0,5630.0,3150.0,1380.0,60.0,,97430.0,True,159935951.571 +E08000034,Kirklees,ENGLAND,2441.07,86120.0,35310.0,33310.0,17860.0,12720.0,5720.0,2330.0,170.0,,193530.0,True,322588621.035 +E08000035,Leeds,ENGLAND,2283.73,143230.0,80140.0,73400.0,38150.0,22930.0,10740.0,7490.0,760.0,,376840.0,True,573341150.031 +E08000036,Wakefield,ENGLAND,2296.89,79970.0,31330.0,24780.0,16330.0,8860.0,2600.0,1230.0,100.0,,165190.0,True,246450485.8683 +E08000037,Gateshead,ENGLAND,2715.81,56090.0,13230.0,15950.0,6070.0,2780.0,900.0,390.0,50.0,,95480.0,True,151587307.6041 +E09000001,City of London,ENGLAND,1329.56,,350.0,690.0,950.0,2890.0,1390.0,1500.0,310.0,,8080.0,True,15244455.7524 +E09000002,Barking and Dagenham,ENGLAND,2198.51,6030.0,12420.0,50340.0,10770.0,1800.0,390.0,50.0,10.0,,81800.0,True,129472518.3653 +E09000003,Barnet,ENGLAND,2132.6,3420.0,9570.0,32530.0,39640.0,33920.0,20370.0,16820.0,4350.0,,160620.0,True,339539499.162 +E09000004,Bexley,ENGLAND,2366.36,4350.0,11380.0,31230.0,28140.0,19550.0,5290.0,1750.0,50.0,,101750.0,True,206446665.3644 +E09000005,Brent,ENGLAND,2235.27,6090.0,14040.0,41900.0,39340.0,23430.0,6590.0,3460.0,250.0,,135110.0,True,251602952.3661 +E09000006,Bromley,ENGLAND,2140.04,2100.0,10590.0,30460.0,36460.0,29550.0,18580.0,14120.0,1750.0,,143600.0,True,304871061.41800004 +E09000007,Camden,ENGLAND,2207.55,3380.0,12270.0,20780.0,26560.0,19820.0,12950.0,13140.0,4940.0,,113830.0,True,220511198.178 +E09000008,Croydon,ENGLAND,2599.91,4450.0,24400.0,52850.0,42340.0,24140.0,11860.0,7520.0,660.0,,168220.0,True,368973637.3935 +E09000009,Ealing,ENGLAND,2138.53,5200.0,14970.0,36980.0,48680.0,25200.0,10520.0,7200.0,1060.0,,149800.0,True,274136385.72010005 +E09000010,Enfield,ENGLAND,2267.67,5420.0,12400.0,35190.0,37170.0,21550.0,9590.0,6050.0,1020.0,,128400.0,True,250144478.0601 +E09000011,Greenwich,ENGLAND,2107.86,10790.0,22200.0,45460.0,27100.0,12850.0,4010.0,2280.0,360.0,,125040.0,True,204263058.6012 +E09000012,Hackney,ENGLAND,2060.3,8170.0,31670.0,35990.0,25200.0,13500.0,4950.0,1320.0,50.0,,120850.0,True,174558361.219 +E09000013,Hammersmith and Fulham,ENGLAND,1519.51,4120.0,6630.0,14510.0,25920.0,17400.0,11330.0,12270.0,2940.0,,95120.0,True,141718057.4413 +E09000014,Haringey,ENGLAND,2313.78,7700.0,19400.0,36160.0,28640.0,11700.0,5540.0,4800.0,750.0,,114700.0,True,202145101.8972 +E09000015,Harrow,ENGLAND,2511.07,840.0,4470.0,22800.0,30020.0,22620.0,8550.0,6220.0,1320.0,,96860.0,True,232407940.58450004 +E09000016,Havering,ENGLAND,2424.66,5300.0,11080.0,29790.0,36200.0,16040.0,6770.0,3140.0,380.0,,108680.0,True,228206356.3206 +E09000017,Hillingdon,ENGLAND,2045.46,1270.0,6550.0,28300.0,47450.0,18810.0,10050.0,5340.0,490.0,,118260.0,True,217533341.451 +E09000018,Hounslow,ENGLAND,2185.56,2560.0,9560.0,30620.0,40720.0,16350.0,6370.0,4120.0,1030.0,,111320.0,True,208959599.4408 +E09000019,Islington,ENGLAND,2108.15,4660.0,6180.0,29760.0,33560.0,19520.0,10380.0,7300.0,960.0,,112320.0,True,181931110.361 +E09000020,Kensington and Chelsea,ENGLAND,1666.65,1460.0,3310.0,9370.0,14110.0,13410.0,12210.0,19930.0,15480.0,,89280.0,True,171780148.848 +E09000021,Kingston upon Thames,ENGLAND,2609.2,630.0,3420.0,16020.0,21010.0,15050.0,8770.0,4460.0,1080.0,,70440.0,True,178293341.644 +E09000022,Lambeth,ENGLAND,2047.11,5020.0,33450.0,42330.0,33160.0,16550.0,10820.0,5960.0,1180.0,,148470.0,True,245763600.6423 +E09000023,Lewisham,ENGLAND,2237.33,9280.0,36440.0,48040.0,27670.0,8060.0,2820.0,1360.0,190.0,,133860.0,True,218508185.6243 +E09000024,Merton,ENGLAND,2146.76,1190.0,8590.0,24140.0,28360.0,13540.0,5940.0,4180.0,1850.0,,87780.0,True,175588523.8184 +E09000025,Newham,ENGLAND,1944.23,5570.0,34340.0,56120.0,26900.0,7220.0,2210.0,240.0,40.0,,132640.0,True,188163726.4957 +E09000026,Redbridge,ENGLAND,2294.58,2790.0,14100.0,27920.0,32140.0,19750.0,7820.0,3320.0,220.0,,108060.0,True,220890933.1662 +E09000027,Richmond upon Thames,ENGLAND,2486.1,600.0,2180.0,13480.0,20700.0,19770.0,12160.0,13290.0,3640.0,,85810.0,True,227971988.904 +E09000028,Southwark,ENGLAND,1967.26,13220.0,38050.0,35710.0,28440.0,21540.0,7920.0,4590.0,830.0,,150300.0,True,227093195.8654 +E09000029,Sutton,ENGLAND,2378.64,990.0,8050.0,28300.0,24800.0,12950.0,7110.0,3780.0,290.0,,86270.0,True,183237343.08 +E09000030,Tower Hamlets,ENGLAND,1837.78,4500.0,25040.0,40570.0,32250.0,27010.0,14280.0,5570.0,780.0,,150000.0,True,222040965.5338 +E09000031,Waltham Forest,ENGLAND,2386.96,5230.0,32380.0,39150.0,23440.0,8390.0,1850.0,440.0,30.0,,110900.0,True,201084766.7584 +E09000032,Wandsworth,ENGLAND,1028.21,6560.0,13280.0,37340.0,35080.0,26990.0,20450.0,15230.0,3040.0,,157970.0,True,156911704.16070002 +E09000033,Westminster,ENGLAND,1049.55,1660.0,6460.0,15690.0,23130.0,24460.0,19180.0,24500.0,17190.0,,132280.0,True,170747374.67849997 +N09000001,Antrim and Newtownabbey,NORTHERN_IRELAND,,,,,,,,,,,,False, +N09000002,"Armagh City, Banbridge and Craigavon",NORTHERN_IRELAND,,,,,,,,,,,,False, +N09000003,Belfast,NORTHERN_IRELAND,,,,,,,,,,,,False, +N09000004,Causeway Coast and Glens,NORTHERN_IRELAND,,,,,,,,,,,,False, +N09000005,Derry City and Strabane,NORTHERN_IRELAND,,,,,,,,,,,,False, +N09000006,Fermanagh and Omagh,NORTHERN_IRELAND,,,,,,,,,,,,False, +N09000007,Lisburn and Castlereagh,NORTHERN_IRELAND,,,,,,,,,,,,False, +N09000008,Mid and East Antrim,NORTHERN_IRELAND,,,,,,,,,,,,False, +N09000009,Mid Ulster,NORTHERN_IRELAND,,,,,,,,,,,,False, +N09000010,"Newry, Mourne and Down",NORTHERN_IRELAND,,,,,,,,,,,,False, +S12000005,Clackmannanshire,SCOTLAND,1594.38,,,,,,,,,,,True, +S12000006,Dumfries and Galloway,SCOTLAND,1454.98,,,,,,,,,,,True, +S12000008,East Ayrshire,SCOTLAND,1606.44,,,,,,,,,,,True, +S12000010,East Lothian,SCOTLAND,1579.18,,,,,,,,,,,True, +S12000011,East Renfrewshire,SCOTLAND,1528.44,,,,,,,,,,,True, +S12000013,Na h-Eileanan Siar,SCOTLAND,1387.56,,,,,,,,,,,True, +S12000014,Falkirk,SCOTLAND,1576.77,,,,,,,,,,,True, +S12000017,Highland,SCOTLAND,1527.09,,,,,,,,,,,True, +S12000018,Inverclyde,SCOTLAND,1551.3,,,,,,,,,,,True, +S12000019,Midlothian,SCOTLAND,1666.2,,,,,,,,,,,True, +S12000020,Moray,SCOTLAND,1573.76,,,,,,,,,,,True, +S12000021,North Ayrshire,SCOTLAND,1553.77,,,,,,,,,,,True, +S12000023,Orkney Islands,SCOTLAND,1574.6,,,,,,,,,,,True, +S12000026,Scottish Borders,SCOTLAND,1491.72,,,,,,,,,,,True, +S12000027,Shetland Islands,SCOTLAND,1386.67,,,,,,,,,,,True, +S12000028,South Ayrshire,SCOTLAND,1569.41,,,,,,,,,,,True, +S12000029,South Lanarkshire,SCOTLAND,1378.85,,,,,,,,,,,True, +S12000030,Stirling,SCOTLAND,1611.78,,,,,,,,,,,True, +S12000033,Aberdeen City,SCOTLAND,1636.27,,,,,,,,,,,True, +S12000034,Aberdeenshire,SCOTLAND,1532.76,,,,,,,,,,,True, +S12000035,Argyll and Bute,SCOTLAND,1625.64,,,,,,,,,,,True, +S12000036,City of Edinburgh,SCOTLAND,1563.51,,,,,,,,,,,True, +S12000038,Renfrewshire,SCOTLAND,1572.61,,,,,,,,,,,True, +S12000039,West Dunbartonshire,SCOTLAND,1559.86,,,,,,,,,,,True, +S12000040,West Lothian,SCOTLAND,1515.45,,,,,,,,,,,True, +S12000041,Angus,SCOTLAND,1461.52,,,,,,,,,,,True, +S12000042,Dundee City,SCOTLAND,1605.34,,,,,,,,,,,True, +S12000045,East Dunbartonshire,SCOTLAND,1599.7,,,,,,,,,,,True, +S12000047,Fife,SCOTLAND,1498.76,,,,,,,,,,,True, +S12000048,Perth and Kinross,SCOTLAND,1537.04,,,,,,,,,,,True, +S12000049,Glasgow City,SCOTLAND,1611.0,,,,,,,,,,,True, +S12000050,North Lanarkshire,SCOTLAND,1452.86,,,,,,,,,,,True, +W06000001,Isle of Anglesey,WALES,2260.73,4960.0,6930.0,7210.0,7400.0,5540.0,2770.0,1080.0,170.0,60.0,36120.0,True,63114620.0 +W06000002,Gwynedd,WALES,2468.77,9310.0,15800.0,12700.0,10720.0,8300.0,4030.0,1280.0,210.0,90.0,62440.0,True,119406313.0 +W06000003,Conwy,WALES,2472.82,5460.0,8340.0,15610.0,11970.0,9300.0,5120.0,1940.0,430.0,160.0,58340.0,True,110610412.0 +W06000004,Denbighshire,WALES,2339.03,4160.0,7420.0,14970.0,8050.0,5660.0,3920.0,2060.0,320.0,170.0,46720.0,True,82023146.0 +W06000005,Flintshire,WALES,2376.17,4520.0,9640.0,20990.0,13400.0,11140.0,7830.0,3230.0,600.0,220.0,71570.0,True,131972546.99999999 +W06000006,Wrexham,WALES,2308.88,4510.0,12770.0,17250.0,10350.0,8270.0,5190.0,2570.0,720.0,290.0,61910.0,True,104887499.37199569 +W06000008,Ceredigion,WALES,2419.45,1780.0,5000.0,7730.0,7570.0,9180.0,3890.0,980.0,110.0,20.0,36260.0,True,70082599.0 +W06000009,Pembrokeshire,WALES,2166.15,6730.0,9460.0,14520.0,11520.0,12550.0,6070.0,2120.0,340.0,100.0,63400.0,True,111301517.0 +W06000010,Carmarthenshire,WALES,2351.2,9370.0,24550.0,18930.0,14700.0,13440.0,6700.0,2260.0,300.0,70.0,90310.0,True,151662184.0 +W06000011,Swansea,WALES,2238.29,17730.0,28650.0,25020.0,17330.0,13200.0,8180.0,3880.0,1200.0,540.0,115730.0,True,177267464.0 +W06000012,Neath Port Talbot,WALES,2541.39,13830.0,27500.0,11720.0,7430.0,4580.0,1530.0,540.0,110.0,20.0,67260.0,True,106279092.92000002 +W06000013,Bridgend,WALES,2477.99,10600.0,15370.0,14840.0,11050.0,8020.0,4480.0,1510.0,300.0,110.0,66280.0,True,115651162.0 +W06000014,Vale of Glamorgan,WALES,2231.54,1510.0,6680.0,14520.0,11910.0,10790.0,7740.0,5920.0,2270.0,1060.0,62400.0,True,118046914.0 +W06000015,Cardiff,WALES,2013.18,5320.0,20420.0,34920.0,37370.0,31540.0,22250.0,10590.0,2850.0,1480.0,166750.0,True,250934240.0 +W06000016,Rhondda Cynon Taf,WALES,2289.43,47080.0,25500.0,17510.0,9660.0,7140.0,3520.0,1190.0,200.0,70.0,111860.0,True,151783228.38 +W06000018,Caerphilly,WALES,2082.88,15550.0,26890.0,18930.0,9540.0,6840.0,2430.0,840.0,90.0,80.0,81190.0,True,105324903.21000004 +W06000019,Blaenau Gwent,WALES,2531.26,19200.0,8160.0,2730.0,1810.0,900.0,350.0,60.0,,20.0,33230.0,True,45129431.0 +W06000020,Torfaen,WALES,2155.68,6300.0,13120.0,12050.0,4350.0,4330.0,2410.0,690.0,70.0,30.0,43340.0,True,60708353.0 +W06000021,Monmouthshire,WALES,2416.5,520.0,3450.0,7140.0,9460.0,7660.0,8100.0,5520.0,1790.0,670.0,44300.0,True,98574346.0 +W06000022,Newport,WALES,2088.48,6910.0,15400.0,18470.0,12990.0,8560.0,6090.0,2710.0,560.0,190.0,71880.0,True,107214282.0 +W06000023,Powys,WALES,2351.72,6090.0,9440.0,13330.0,10630.0,12660.0,9740.0,4180.0,580.0,210.0,66870.0,True,129025924.0 +W06000024,Merthyr Tydfil,WALES,2593.6,14150.0,6680.0,2270.0,2210.0,1560.0,580.0,160.0,,10.0,27620.0,True,41504016.0 diff --git a/policyengine_uk_data/targets/sources/la_council_tax.py b/policyengine_uk_data/targets/sources/la_council_tax.py index 982cc83ab..adece17ca 100644 --- a/policyengine_uk_data/targets/sources/la_council_tax.py +++ b/policyengine_uk_data/targets/sources/la_council_tax.py @@ -74,6 +74,14 @@ _VOA_REF = ( "https://www.gov.uk/government/statistics/council-tax-stock-of-properties-2025" ) +# Net council tax requirement per LA. England derived from MHCLG +# Council Taxbase 2025 Table 1.35 ("Tax base after allowance for council +# tax support") × LA Band D amount. Wales sourced directly from the +# Welsh Government Table 3 "Council tax income (£m)" — already net. +_NET_CT_REF_ENG = ( + "https://www.gov.uk/government/statistics/council-taxbase-2025-in-england" +) +_NET_CT_REF_WAL = _WALES_REF @lru_cache(maxsize=1) @@ -85,6 +93,26 @@ def _load_table() -> pd.DataFrame | None: return pd.read_csv(csv_path) +def load_la_net_council_tax() -> pd.DataFrame: + """Load per-LA net council tax requirement (£, after CTR support). + + Returns a DataFrame with columns ``code, total_council_tax_net`` + for LAs where a directly-observed net figure is available + (England + Wales). Scotland and NI are absent and handled by the + loss-matrix national-share fallback — same pattern as the rent + and tenure targets. + """ + df = _load_table() + if df is None or df.empty: + return pd.DataFrame(columns=["code", "total_council_tax_net"]) + if "total_council_tax_net" not in df.columns: + return pd.DataFrame(columns=["code", "total_council_tax_net"]) + return df.loc[ + df["total_council_tax_net"].notna(), + ["code", "total_council_tax_net"], + ].reset_index(drop=True) + + def _year_for_band_d(country: str) -> int: if country == "WALES": return _YEAR_BAND_D_WALES @@ -153,4 +181,28 @@ def get_targets() -> list[Target]: ) ) + # Net council tax £ targets — one per LA with an observed value. + # Mirrors the FRS net-of-CTR amount; pairs with the band targets + # above to cover both FRS council-tax data points. + if "total_council_tax_net" in df.columns: + for _, row in df.iterrows(): + net = row.get("total_council_tax_net") + if pd.isna(net): + continue + country = str(row["country"]) + ref = _NET_CT_REF_WAL if country == "WALES" else _NET_CT_REF_ENG + targets.append( + Target( + name=f"housing/council_tax_net/{row['code']}", + variable="council_tax_less_benefit", + source="mhclg" if country == "ENGLAND" else "stats_wales", + unit=Unit.GBP, + geographic_level=GeographicLevel.LOCAL_AUTHORITY, + geo_code=str(row["code"]), + geo_name=str(row["name"]), + values={_YEAR_BAND_D_ENGLAND: float(net)}, + reference_url=ref, + ) + ) + return targets diff --git a/policyengine_uk_data/tests/test_la_loss_council_tax.py b/policyengine_uk_data/tests/test_la_loss_council_tax.py index fee38c3af..80cef7388 100644 --- a/policyengine_uk_data/tests/test_la_loss_council_tax.py +++ b/policyengine_uk_data/tests/test_la_loss_council_tax.py @@ -215,3 +215,172 @@ def test_la_loss_band_y_uses_fallback_for_ni(enhanced_frs): for band in WIRED_BANDS: val = float(y[f"voa/council_tax/{band}"].iloc[la_index]) assert val > 0, f"NI LA {ni_la} band {band}: fallback produced {val}" + + +# ── Council tax £ paid (net of CTR) ───────────────────────────────── + + +def test_csv_has_net_council_tax_column(): + """The CSV must expose total_council_tax_net so loss.py can wire it.""" + assert "total_council_tax_net" in CT_DATA.columns + + +def test_net_council_tax_covers_england_and_wales(): + """Direct-formula values are produced for England (MHCLG taxbase × Band D) + and Wales (Welsh Government Council Tax Income). Scotland and NI fall + through to the loss.py national-share fallback, same pattern as + band counts and the existing tenure target.""" + cov = ( + CT_DATA.assign(has_net=CT_DATA["total_council_tax_net"].notna()) + .groupby("country")["has_net"] + .agg(["sum", "count"]) + ) + assert cov.loc["ENGLAND", "sum"] == cov.loc["ENGLAND", "count"] + assert cov.loc["WALES", "sum"] == cov.loc["WALES", "count"] + assert cov.loc["SCOTLAND", "sum"] == 0 + assert cov.loc["NORTHERN_IRELAND", "sum"] == 0 + + +def test_net_council_tax_value_range(): + """Per-LA net council tax should be in £2m–£1.5bn. Lower bound is + set by Isles of Scilly (~£3m on ~1,100 households); upper bound by + Birmingham (~£700m). A 1000x outlier — like the IoS fallback leak + pre-review on #371 — must be caught by bounds, not spotted by eye.""" + covered = CT_DATA["total_council_tax_net"].dropna() + out_of_range = covered[(covered < 2e6) | (covered > 1.5e9)] + assert out_of_range.empty, ( + f"Net CT outside [£2m, £1.5bn]: {out_of_range.tolist()[:3]}" + ) + + +def test_england_net_total_in_range_of_mhclg_summary(): + """Sum of England LA net targets should be within ~5% of MHCLG's + published England Council Tax Requirement (~£45.86bn for 2026-27; + we compute from 2025 taxbase × 2026-27 Band D so a small year-mismatch + gap is expected).""" + eng_total = CT_DATA.loc[ + CT_DATA["country"] == "ENGLAND", "total_council_tax_net" + ].sum() + assert 4.3e10 < eng_total < 5.0e10, ( + f"England net total £{eng_total / 1e9:.2f}bn outside [£43bn, £50bn]" + ) + + +def test_la_loss_matrix_includes_council_tax_net(enhanced_frs): + """matrix and y must expose housing/council_tax_net so the + calibrator trains on the net £-amount target alongside band counts.""" + from policyengine_uk_data.datasets.local_areas.local_authorities.loss import ( + create_local_authority_target_matrix, + ) + + matrix, y, _ = create_local_authority_target_matrix( + enhanced_frs, time_period=enhanced_frs.time_period + ) + assert "housing/council_tax_net" in matrix.columns + assert "housing/council_tax_net" in y.columns + + +def test_la_loss_council_tax_net_matrix_uses_net_variable(enhanced_frs): + """Matrix col must be council_tax_less_benefit (net of CTR), so both + sides of the calibration constraint are net per the 28 Apr standup + decision on FRS-net-of-CTR alignment.""" + from policyengine_uk import Microsimulation + from policyengine_uk_data.datasets.local_areas.local_authorities.loss import ( + create_local_authority_target_matrix, + ) + + matrix, _, _ = create_local_authority_target_matrix( + enhanced_frs, time_period=enhanced_frs.time_period + ) + + sim = Microsimulation(dataset=enhanced_frs) + sim.default_calculation_period = enhanced_frs.time_period + expected = sim.calculate("council_tax_less_benefit").values + np.testing.assert_array_equal(matrix["housing/council_tax_net"].values, expected) + + +def test_la_loss_council_tax_net_y_finite_positive(enhanced_frs): + """y has no NaN/inf, all positive — Scotland and NI use fallback.""" + from policyengine_uk_data.datasets.local_areas.local_authorities.loss import ( + create_local_authority_target_matrix, + ) + + _, y, _ = create_local_authority_target_matrix( + enhanced_frs, time_period=enhanced_frs.time_period + ) + col = y["housing/council_tax_net"] + assert np.isfinite(col).all() + assert (col > 0).all() + + +def test_la_loss_council_tax_net_y_matches_csv_for_english_la(enhanced_frs): + """For a covered (English) LA, y must equal the CSV value verbatim + rather than the national-share fallback.""" + from policyengine_uk_data.datasets.local_areas.local_authorities.loss import ( + create_local_authority_target_matrix, + ) + + _, y, _ = create_local_authority_target_matrix( + enhanced_frs, time_period=enhanced_frs.time_period + ) + + target_code = "E06000001" # Hartlepool + la_index = LA_CODES.index[LA_CODES["code"] == target_code][0] + expected = float( + CT_DATA.loc[CT_DATA["code"] == target_code, "total_council_tax_net"].iloc[0] + ) + actual = float(y["housing/council_tax_net"].iloc[la_index]) + assert actual == pytest.approx(expected, rel=1e-6) + + +def test_la_loss_council_tax_net_y_uses_fallback_for_scotland(enhanced_frs): + """Scottish LAs have no published net CT in the CSV; the fallback + must produce a positive value.""" + from policyengine_uk_data.datasets.local_areas.local_authorities.loss import ( + create_local_authority_target_matrix, + ) + + _, y, _ = create_local_authority_target_matrix( + enhanced_frs, time_period=enhanced_frs.time_period + ) + scotland_code = CT_DATA[CT_DATA["country"] == "SCOTLAND"]["code"].iloc[0] + la_index = LA_CODES.index[LA_CODES["code"] == scotland_code][0] + assert float(y["housing/council_tax_net"].iloc[la_index]) > 0 + + +def test_la_loss_english_council_tax_net_in_reach_of_initial_weights( + enhanced_frs, +): + """Sum of English LA net council-tax targets should be in the same + order of magnitude (0.3x–3x) as the implied initial weighted English + council_tax_less_benefit total — so the calibrator can reach the + target via reweighting rather than 100x weight inflation.""" + from policyengine_uk import Microsimulation + from policyengine_uk_data.datasets.local_areas.local_authorities.loss import ( + create_local_authority_target_matrix, + ) + + _, y, _ = create_local_authority_target_matrix( + enhanced_frs, time_period=enhanced_frs.time_period + ) + + sim = Microsimulation(dataset=enhanced_frs) + weights = sim.calculate("household_weight", 2025).values + ct_net = sim.calculate("council_tax_less_benefit", enhanced_frs.time_period).values + country = sim.calculate("country", enhanced_frs.time_period).values + england_initial = ( + weights[country == "ENGLAND"] * ct_net[country == "ENGLAND"] + ).sum() + + english_indices = [ + i for i, c in enumerate(LA_CODES["code"].values) if c.startswith("E0") + ] + english_target_sum = y["housing/council_tax_net"].iloc[english_indices].sum() + + if england_initial > 0: + ratio = english_target_sum / england_initial + assert 0.3 < ratio < 3.0, ( + f"England target sum (£{english_target_sum / 1e9:.1f}bn) / " + f"initial weighted England net CT (£{england_initial / 1e9:.1f}bn) " + f"= {ratio:.2f}; calibration target may be hard to reach" + ) From 3277a212a431b35b55e61fd730cc50a454a407bc Mon Sep 17 00:00:00 2001 From: Vahid Ahmadi Date: Wed, 29 Apr 2026 13:47:54 +0100 Subject: [PATCH 06/10] Fix gross/net mismatch in OBR national council tax compute MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit OBR EFO Table 4.1 reports "Total net council tax receipts" — net of council tax reduction (CTR). The matching household-level signal is council_tax_less_benefit (= gross council tax − CTR award), not council_tax (which is the gross liability before CTR per its docstring "Gross amount spent on Council Tax, before discounts"). Calibrating gross household values against a net national target systematically pulls weights down to fit (Σ w × gross > Σ w × net), leaking bias into adjacent national targets that share the weight vector. Order-of-magnitude sanity (UK 2024-25): Σ w × council_tax (gross) ≈ £55bn Σ w × council_tax_less_benefit (net) ≈ £47bn OBR Table 4.1 "Total net council tax" ≈ £44bn After the fix, the council tax constraint is internally consistent (both sides net) and aligns with Max's 28 Apr standup decision on FRS-net-of-CTR alignment. Pairs naturally with the LA-level housing/council_tax_net target this PR adds — both use the same net variable. Adds three regression tests pinning the net-variable contract. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../targets/compute/council_tax.py | 13 ++- .../tests/test_obr_council_tax.py | 86 +++++++++++++++++++ 2 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 policyengine_uk_data/tests/test_obr_council_tax.py diff --git a/policyengine_uk_data/targets/compute/council_tax.py b/policyengine_uk_data/targets/compute/council_tax.py index 2c538f253..0c52856d7 100644 --- a/policyengine_uk_data/targets/compute/council_tax.py +++ b/policyengine_uk_data/targets/compute/council_tax.py @@ -19,9 +19,18 @@ def compute_council_tax_band(target, ctx) -> np.ndarray: def compute_obr_council_tax(target, ctx) -> np.ndarray: - """Compute OBR council tax receipts, optionally by country.""" + """Compute OBR council tax receipts, optionally by country. + + OBR Table 4.1 reports "Total net council tax receipts" — net of + council tax reduction (CTR) support. The matching household-level + signal is therefore ``council_tax_less_benefit`` (= gross council + tax less the CTR award), not ``council_tax`` (which is the gross + liability before CTR). Using the gross variable here would + systematically push weights down to fit a net target, leaking + bias into adjacent national calibrations. + """ name = target.name - ct = ctx.pe("council_tax") + ct = ctx.pe("council_tax_less_benefit") if name == "obr/council_tax": return ct diff --git a/policyengine_uk_data/tests/test_obr_council_tax.py b/policyengine_uk_data/tests/test_obr_council_tax.py new file mode 100644 index 000000000..74b054fc3 --- /dev/null +++ b/policyengine_uk_data/tests/test_obr_council_tax.py @@ -0,0 +1,86 @@ +"""Tests for the national OBR council tax compute function. + +OBR EFO Table 4.1 reports "Total net council tax receipts" — net of +council tax reduction (CTR). The matching household-level signal is +``council_tax_less_benefit`` (= gross council tax less the CTR +award), not ``council_tax`` (which is the gross liability). + +These tests pin the matrix column to the net variable so a future +edit cannot silently regress the gross/net mismatch. +""" + +from types import SimpleNamespace + +import numpy as np + + +def _dummy_ctx(council_tax_less_benefit, country): + """Return a context object compatible with compute_obr_council_tax.""" + + class _Ctx: + pass + + ctx = _Ctx() + ctx.country = np.array(country) + + def pe(variable): + if variable == "council_tax_less_benefit": + return np.array(council_tax_less_benefit) + raise AssertionError(f"unexpected pe call: {variable}") + + ctx.pe = pe + return ctx + + +def test_compute_uses_net_variable_not_gross(): + """matrix col for obr/council_tax must be council_tax_less_benefit + so it matches the OBR net target value. Calibrating gross against + a net target systematically pushes weights down to fit.""" + from policyengine_uk_data.targets.compute.council_tax import ( + compute_obr_council_tax, + ) + + ctx = _dummy_ctx( + council_tax_less_benefit=[1000.0, 1500.0, 0.0, 800.0], + country=["ENGLAND", "ENGLAND", "SCOTLAND", "WALES"], + ) + + out = compute_obr_council_tax(SimpleNamespace(name="obr/council_tax"), ctx) + np.testing.assert_array_equal(out, [1000.0, 1500.0, 0.0, 800.0]) + + +def test_compute_country_masks_apply_after_net_extraction(): + """Country variants must zero out non-matching households on the + net variable, not on a gross variable.""" + from policyengine_uk_data.targets.compute.council_tax import ( + compute_obr_council_tax, + ) + + ctx = _dummy_ctx( + council_tax_less_benefit=[1000.0, 1500.0, 600.0, 800.0], + country=["ENGLAND", "ENGLAND", "SCOTLAND", "WALES"], + ) + + eng = compute_obr_council_tax(SimpleNamespace(name="obr/council_tax_england"), ctx) + sco = compute_obr_council_tax(SimpleNamespace(name="obr/council_tax_scotland"), ctx) + wal = compute_obr_council_tax(SimpleNamespace(name="obr/council_tax_wales"), ctx) + + np.testing.assert_array_equal(eng, [1000.0, 1500.0, 0.0, 0.0]) + np.testing.assert_array_equal(sco, [0.0, 0.0, 600.0, 0.0]) + np.testing.assert_array_equal(wal, [0.0, 0.0, 0.0, 800.0]) + + +def test_compute_does_not_call_gross_variable(): + """If a future refactor reintroduces ctx.pe('council_tax'), the + DummyCtx will raise AssertionError. Pins the net-only contract.""" + from policyengine_uk_data.targets.compute.council_tax import ( + compute_obr_council_tax, + ) + + ctx = _dummy_ctx( + council_tax_less_benefit=[100.0, 200.0], + country=["ENGLAND", "WALES"], + ) + + # No exception means only council_tax_less_benefit was queried. + compute_obr_council_tax(SimpleNamespace(name="obr/council_tax"), ctx) From 37becabae2dfdeced902e45554e36ea01a1bdd7b Mon Sep 17 00:00:00 2001 From: Vahid Ahmadi Date: Wed, 29 Apr 2026 15:40:15 +0100 Subject: [PATCH 07/10] Zero NI council tax targets instead of fabricating fallbacks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Northern Ireland uses domestic rates, not council tax. The CSV's has_council_tax flag has been False for NI from the original commit, but loss.py was ignoring it and assigning national × la_household_share to NI LAs for both band counts and the new net £ column. Effect: the optimiser was being told "NI households should pay this much council tax" with a positive target, while every NI household has council_tax_band == None and council_tax_less_benefit == 0 — an unsatisfiable constraint that wastes loss the optimiser cannot drive to zero. Reported by @MaxGhenis in PR review. Fix: read has_council_tax from the CSV, gate the np.where so NI LAs get y == 0 for all 9 council-tax columns. Direct-value and fallback paths unchanged for E/W/S. Updates two tests that previously asserted positive fallback for NI; adds explicit zero-NI assertion for housing/council_tax_net. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../local_areas/local_authorities/loss.py | 50 ++++++++-------- .../tests/test_la_loss_council_tax.py | 59 ++++++++++++++----- 2 files changed, 70 insertions(+), 39 deletions(-) diff --git a/policyengine_uk_data/datasets/local_areas/local_authorities/loss.py b/policyengine_uk_data/datasets/local_areas/local_authorities/loss.py index c2b09386f..41f81d3a9 100644 --- a/policyengine_uk_data/datasets/local_areas/local_authorities/loss.py +++ b/policyengine_uk_data/datasets/local_areas/local_authorities/loss.py @@ -257,26 +257,23 @@ def create_local_authority_target_matrix( # ── Council tax band counts (LA targets) ─────────────────────── # Per-LA dwellings in each band A-H from VOA Council Tax Stock of - # Properties. Scotland LAs have no VOA band data and Northern Ireland - # has no council tax — both fall back to national-share estimation, - # matching the tenure block's pattern. Band I is Wales-only and + # Properties. Scotland LAs have no VOA band data — fall back to + # national-share estimation, matching the tenure block's pattern. + # Northern Ireland has no council tax (domestic rates instead); + # the CSV's has_council_tax flag drives a hard zero target rather + # than a fabricated fallback, otherwise the optimiser would spend + # loss on an impossible constraint. Band I is Wales-only and # rarely populated, so it is intentionally excluded. ct_path = STORAGE_FOLDER / "la_council_tax.csv" if ct_path.exists(): ct_data = pd.read_csv(ct_path) - ct_merged = la_codes.merge( - ct_data[ - ["code"] - + [f"count_band_{b}" for b in "ABCDEFGH"] - + ( - ["total_council_tax_net"] - if "total_council_tax_net" in ct_data.columns - else [] - ) - ], - on="code", - how="left", - ) + ct_columns = ["code", "has_council_tax"] + [ + f"count_band_{b}" for b in "ABCDEFGH" + ] + if "total_council_tax_net" in ct_data.columns: + ct_columns.append("total_council_tax_net") + ct_merged = la_codes.merge(ct_data[ct_columns], on="code", how="left") + is_ct_la = ct_merged["has_council_tax"].fillna(True).astype(bool).values ct_band = sim.calculate("council_tax_band").values for band in "ABCDEFGH": col = f"voa/council_tax/{band}" @@ -284,17 +281,20 @@ def create_local_authority_target_matrix( csv_col = f"count_band_{band}" has_count = ct_merged[csv_col].notna().values national = (original_weights * matrix[col].values).sum() + direct = ct_merged[csv_col].values + fallback = national * la_household_share y[col] = np.where( - has_count, - ct_merged[csv_col].values, - national * la_household_share, + is_ct_la, + np.where(has_count, direct, fallback), + 0.0, ) # ── Council tax £ paid, net of CTR (LA targets) ──────────── # Mirrors the private-rent block: directly observed LA-level # net council tax revenue from MHCLG (England) and Welsh - # Government (Wales). Scotland and NI fall back to - # national_share, same pattern as the tenure target. + # Government (Wales). Scotland falls back to national_share + # (same pattern as the tenure target). Northern Ireland is + # zeroed via has_council_tax — no council tax, no constraint. # Matrix col uses council_tax_less_benefit (net of CTR award) # so both sides of the constraint are net, per Max's standup # decision (28 Apr) on FRS-net-of-CTR alignment. @@ -306,10 +306,12 @@ def create_local_authority_target_matrix( national_ct_net = ( original_weights * matrix["housing/council_tax_net"].values ).sum() + direct_net = ct_merged["total_council_tax_net"].values + fallback_net = national_ct_net * la_household_share y["housing/council_tax_net"] = np.where( - has_ct_net, - ct_merged["total_council_tax_net"].values, - national_ct_net * la_household_share, + is_ct_la, + np.where(has_ct_net, direct_net, fallback_net), + 0.0, ) # ── Country mask ─────────────────────────────────────────────── diff --git a/policyengine_uk_data/tests/test_la_loss_council_tax.py b/policyengine_uk_data/tests/test_la_loss_council_tax.py index 80cef7388..ba21ef13c 100644 --- a/policyengine_uk_data/tests/test_la_loss_council_tax.py +++ b/policyengine_uk_data/tests/test_la_loss_council_tax.py @@ -110,9 +110,9 @@ def test_la_loss_band_y_vectors_length_360(enhanced_frs): assert len(y[f"voa/council_tax/{band}"]) == 360 -def test_la_loss_band_y_finite_and_positive(enhanced_frs): - """No NaNs / negatives in y. Scotland and NI cells must be filled by - the fallback (national_band_count × la_household_share).""" +def test_la_loss_band_y_finite(enhanced_frs): + """No NaNs / negatives in y. NI LAs are zero (no council tax there); + other LAs are positive via direct value or national-share fallback.""" from policyengine_uk_data.datasets.local_areas.local_authorities.loss import ( create_local_authority_target_matrix, ) @@ -120,10 +120,19 @@ def test_la_loss_band_y_finite_and_positive(enhanced_frs): _, y, _ = create_local_authority_target_matrix( enhanced_frs, time_period=enhanced_frs.time_period ) + + ni_indices = LA_CODES.index[ + LA_CODES["code"].isin( + CT_DATA.loc[CT_DATA["country"] == "NORTHERN_IRELAND", "code"] + ) + ] for band in WIRED_BANDS: col = f"voa/council_tax/{band}" assert np.isfinite(y[col]).all(), f"{col}: NaN/inf in y" - assert (y[col] > 0).all(), f"{col}: non-positive y values" + assert (y[col] >= 0).all(), f"{col}: negative y values" + # All non-NI LAs have positive targets. + non_ni = y[col].drop(ni_indices) + assert (non_ni > 0).all(), f"{col}: non-positive y for non-NI LA" def test_la_loss_band_matrix_columns_are_indicators(enhanced_frs): @@ -199,9 +208,12 @@ def test_la_loss_band_y_uses_fallback_for_scotland(enhanced_frs): ) -def test_la_loss_band_y_uses_fallback_for_ni(enhanced_frs): - """NI LAs have no council tax data at all; y must still be positive - via the fallback (the country mask zeroes the prediction anyway).""" +def test_la_loss_band_y_zero_for_ni(enhanced_frs): + """NI LAs have no council tax (domestic rates instead). Band targets + must be exactly zero — a positive fallback would be an impossible + constraint (NI households have council_tax_band == None, so the + matrix column is zero everywhere) and the optimiser would waste + loss on a constraint it cannot satisfy.""" from policyengine_uk_data.datasets.local_areas.local_authorities.loss import ( create_local_authority_target_matrix, ) @@ -210,11 +222,14 @@ def test_la_loss_band_y_uses_fallback_for_ni(enhanced_frs): enhanced_frs, time_period=enhanced_frs.time_period ) - ni_la = CT_DATA[CT_DATA["country"] == "NORTHERN_IRELAND"]["code"].iloc[0] - la_index = LA_CODES.index[LA_CODES["code"] == ni_la][0] - for band in WIRED_BANDS: - val = float(y[f"voa/council_tax/{band}"].iloc[la_index]) - assert val > 0, f"NI LA {ni_la} band {band}: fallback produced {val}" + ni_codes = CT_DATA[CT_DATA["country"] == "NORTHERN_IRELAND"]["code"] + for ni_la in ni_codes: + la_index = LA_CODES.index[LA_CODES["code"] == ni_la][0] + for band in WIRED_BANDS: + val = float(y[f"voa/council_tax/{band}"].iloc[la_index]) + assert val == 0.0, ( + f"NI LA {ni_la} band {band}: expected 0 (no CT in NI), got {val}" + ) # ── Council tax £ paid (net of CTR) ───────────────────────────────── @@ -299,8 +314,9 @@ def test_la_loss_council_tax_net_matrix_uses_net_variable(enhanced_frs): np.testing.assert_array_equal(matrix["housing/council_tax_net"].values, expected) -def test_la_loss_council_tax_net_y_finite_positive(enhanced_frs): - """y has no NaN/inf, all positive — Scotland and NI use fallback.""" +def test_la_loss_council_tax_net_y_finite(enhanced_frs): + """y has no NaN/inf. NI LAs are zero (no council tax there); + Scotland uses fallback; England/Wales use direct values.""" from policyengine_uk_data.datasets.local_areas.local_authorities.loss import ( create_local_authority_target_matrix, ) @@ -310,7 +326,20 @@ def test_la_loss_council_tax_net_y_finite_positive(enhanced_frs): ) col = y["housing/council_tax_net"] assert np.isfinite(col).all() - assert (col > 0).all() + assert (col >= 0).all() + + ni_indices = LA_CODES.index[ + LA_CODES["code"].isin( + CT_DATA.loc[CT_DATA["country"] == "NORTHERN_IRELAND", "code"] + ) + ] + assert (col.iloc[ni_indices] == 0).all(), ( + "NI LAs should have y=0 for housing/council_tax_net " + "(NI uses domestic rates, not council tax)" + ) + assert (col.drop(ni_indices) > 0).all(), ( + "non-NI LAs should have positive y (direct value or fallback)" + ) def test_la_loss_council_tax_net_y_matches_csv_for_english_la(enhanced_frs): From de5298787d077625826a566f4eef9e08424ac0d8 Mon Sep 17 00:00:00 2001 From: Vahid Ahmadi Date: Wed, 29 Apr 2026 16:18:41 +0100 Subject: [PATCH 08/10] Document derived/proxy nature + lineage drift for #374 CT targets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Per @MaxGhenis PR review: both council-tax LA targets are derived proxies, not direct matches for the matrix-side variables. The PR description and code comments earlier overstated this. voa/council_tax/{A..H}: target counts VOA dwellings (E&W only, includes exempt/empty/second homes); matrix counts policyengine-uk households. Banding ratios differ in Scotland post-2017 and Wales has Band I. housing/council_tax_net: target value is MHCLG taxbase × Band D (taxbase = Band D equivalent dwellings adjusted for ~7 discount/ premium/exemption classes); matrix col is FRS-reported council_tax_less_benefit (household-reported gross less reported CTB). Same intent, different construction paths. Documentation only — no code, data, or test behaviour change. The la_council_tax.py docstring now has an explicit "Lineage caveats" section, and loss.py block comments label both targets as derived/proxy with cross-reference. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../local_areas/local_authorities/loss.py | 24 ++++++----- .../targets/sources/la_council_tax.py | 41 +++++++++++++++++-- 2 files changed, 51 insertions(+), 14 deletions(-) diff --git a/policyengine_uk_data/datasets/local_areas/local_authorities/loss.py b/policyengine_uk_data/datasets/local_areas/local_authorities/loss.py index 41f81d3a9..8582a50d9 100644 --- a/policyengine_uk_data/datasets/local_areas/local_authorities/loss.py +++ b/policyengine_uk_data/datasets/local_areas/local_authorities/loss.py @@ -256,8 +256,11 @@ def create_local_authority_target_matrix( ) # ── Council tax band counts (LA targets) ─────────────────────── - # Per-LA dwellings in each band A-H from VOA Council Tax Stock of - # Properties. Scotland LAs have no VOA band data — fall back to + # Derived/proxy targets: per-LA VOA dwellings in each band A-H. + # Lineage drift vs the matrix-side household council_tax_band: + # VOA counts dwellings (incl. exempt / empty / second homes); + # matrix counts households. See la_council_tax.py for full + # caveat. Scotland LAs have no VOA band data — fall back to # national-share estimation, matching the tenure block's pattern. # Northern Ireland has no council tax (domestic rates instead); # the CSV's has_council_tax flag drives a hard zero target rather @@ -290,14 +293,15 @@ def create_local_authority_target_matrix( ) # ── Council tax £ paid, net of CTR (LA targets) ──────────── - # Mirrors the private-rent block: directly observed LA-level - # net council tax revenue from MHCLG (England) and Welsh - # Government (Wales). Scotland falls back to national_share - # (same pattern as the tenure target). Northern Ireland is - # zeroed via has_council_tax — no council tax, no constraint. - # Matrix col uses council_tax_less_benefit (net of CTR award) - # so both sides of the constraint are net, per Max's standup - # decision (28 Apr) on FRS-net-of-CTR alignment. + # Derived/proxy target: y = MHCLG taxbase × Band D (E) or WG + # Council Tax Income (W). Matrix col is FRS-reported + # council_tax_less_benefit (gross − reported CTB). Same + # intent (household council tax paid net of CTR), different + # construction paths — see la_council_tax.py for the lineage + # caveat flagged in review by @MaxGhenis. Both sides are net + # of CTR, per Max's 28 Apr standup decision on FRS alignment. + # Scotland falls back to national_share; Northern Ireland is + # zeroed via has_council_tax (no council tax, no constraint). if "total_council_tax_net" in ct_merged.columns: matrix["housing/council_tax_net"] = sim.calculate( "council_tax_less_benefit" diff --git a/policyengine_uk_data/targets/sources/la_council_tax.py b/policyengine_uk_data/targets/sources/la_council_tax.py index adece17ca..5fc731b30 100644 --- a/policyengine_uk_data/targets/sources/la_council_tax.py +++ b/policyengine_uk_data/targets/sources/la_council_tax.py @@ -1,6 +1,6 @@ -"""Local-authority council tax calibration targets. +"""Local-authority council tax calibration targets (derived proxies). -Produces two kinds of LA-level calibration target from public data: +Produces three kinds of LA-level calibration target from public data: - ``ons/council_tax_band_d/{code}``: the average Band D council tax (inclusive of all precepts) each household pays in billing authority @@ -10,16 +10,47 @@ ``A``–``H`` (England) or ``A``–``I`` (Wales) for billing authority ``code``. Sourced from the VOA *Council Tax: Stock of Properties* summary tables. +- ``housing/council_tax_net/{code}``: net council tax requirement per + LA (net of CTR support). England derived from MHCLG taxbase × Band D; + Wales sourced directly from WG Council Tax Income (Table 3). Data for all 360 LAs in ``local_authorities_2021.csv`` is joined from the committed canonical file ``storage/la_council_tax.csv``. Rows where a source did not provide a value are omitted so calibrators cleanly skip them. -Known coverage gaps (documented, not bugs): +Lineage caveats (flagged in PR review by @MaxGhenis): + +- ``voa/council_tax/{A..H}`` is a **derived proxy**, not a direct + match for the matrix-side household ``council_tax_band``: + * Target counts VOA dwellings; matrix counts policyengine-uk + households. A household ≠ a dwelling in general. + * VOA stock includes exempt, empty, and second-home dwellings, + which contribute zero to the matrix-side sum (no household lives + in them in the FRS). + * VOA covers England and Wales only. Scotland uses the + national-share fallback; NI is zeroed (no council tax). + * Banding ratios differ: Scotland diverged from the standard + 6/9–18/9 E&W ratios after the 2017 reform; Wales has Band I, + England does not. + +- ``housing/council_tax_net`` is a **derived proxy**: + * Target value (England) is MHCLG ``taxbase × Band D``, where + taxbase is Band D equivalent dwellings adjusted for ~7 + discount, premium, and exemption classes (single-person, + disabled relief, second-home, empty-home premium, family + annexe, etc.). Wales uses WG-published net council tax income + direct. + * Matrix col is FRS-reported ``council_tax_less_benefit`` + (household-reported gross less reported CTB). + * Same intent (what households pay net of CTR), different + construction paths and underlying microdata sources. + +Known coverage gaps: - Northern Ireland is excluded because its domestic rates system is - distinct from council tax. + distinct from council tax. ``loss.py`` zeros the y vector for NI + rather than fabricating a fallback. - Band-count rows for Scottish LAs are absent because the VOA summary tables do not cover Scotland; Scottish Assessors publishes per-LA chargeable-dwellings data separately and is a follow-up. @@ -31,6 +62,8 @@ Sources: - MHCLG *Council Tax levels set by local authorities in England 2026-27* https://www.gov.uk/government/statistics/council-tax-levels-set-by-local-authorities-in-england-2026-to-2027 +- MHCLG *Council Taxbase 2025 in England* (Table 1.35 taxbase after CTR) + https://www.gov.uk/government/statistics/council-taxbase-2025-in-england - Welsh Government *Council Tax levels: April 2026 to March 2027* https://www.gov.wales/council-tax-levels-april-2026-march-2027-html - Scottish Government *Council Tax Assumptions 2025* (CT by Band, 2025-26) From 96f5707bcf131450df2b69d7ec16adeb7f14e476 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 29 Apr 2026 20:17:40 -0400 Subject: [PATCH 09/10] Mask unavailable LA council tax targets --- .../local_areas/local_authorities/loss.py | 33 +++----- .../targets/sources/la_council_tax.py | 13 ++- .../tests/test_calibrate_save.py | 39 +++++++++ .../tests/test_la_loss_council_tax.py | 82 ++++++++++--------- policyengine_uk_data/utils/calibrate.py | 28 +++++-- 5 files changed, 118 insertions(+), 77 deletions(-) diff --git a/policyengine_uk_data/datasets/local_areas/local_authorities/loss.py b/policyengine_uk_data/datasets/local_areas/local_authorities/loss.py index 8582a50d9..2bbc300ad 100644 --- a/policyengine_uk_data/datasets/local_areas/local_authorities/loss.py +++ b/policyengine_uk_data/datasets/local_areas/local_authorities/loss.py @@ -260,13 +260,11 @@ def create_local_authority_target_matrix( # Lineage drift vs the matrix-side household council_tax_band: # VOA counts dwellings (incl. exempt / empty / second homes); # matrix counts households. See la_council_tax.py for full - # caveat. Scotland LAs have no VOA band data — fall back to - # national-share estimation, matching the tenure block's pattern. - # Northern Ireland has no council tax (domestic rates instead); - # the CSV's has_council_tax flag drives a hard zero target rather - # than a fabricated fallback, otherwise the optimiser would spend - # loss on an impossible constraint. Band I is Wales-only and - # rarely populated, so it is intentionally excluded. + # caveat. Missing cells stay NaN and are masked out by the + # calibrator; this keeps the target direct instead of fabricating + # national-share fallbacks for Scotland or Northern Ireland. Band I + # is Wales-only and rarely populated, so it is intentionally + # excluded. ct_path = STORAGE_FOLDER / "la_council_tax.csv" if ct_path.exists(): ct_data = pd.read_csv(ct_path) @@ -283,13 +281,11 @@ def create_local_authority_target_matrix( matrix[col] = (ct_band == band).astype(float) csv_col = f"count_band_{band}" has_count = ct_merged[csv_col].notna().values - national = (original_weights * matrix[col].values).sum() direct = ct_merged[csv_col].values - fallback = national * la_household_share y[col] = np.where( - is_ct_la, - np.where(has_count, direct, fallback), - 0.0, + is_ct_la & has_count, + direct, + np.nan, ) # ── Council tax £ paid, net of CTR (LA targets) ──────────── @@ -300,22 +296,17 @@ def create_local_authority_target_matrix( # construction paths — see la_council_tax.py for the lineage # caveat flagged in review by @MaxGhenis. Both sides are net # of CTR, per Max's 28 Apr standup decision on FRS alignment. - # Scotland falls back to national_share; Northern Ireland is - # zeroed via has_council_tax (no council tax, no constraint). + # Missing cells remain NaN and are masked out by the calibrator. if "total_council_tax_net" in ct_merged.columns: matrix["housing/council_tax_net"] = sim.calculate( "council_tax_less_benefit" ).values has_ct_net = ct_merged["total_council_tax_net"].notna().values - national_ct_net = ( - original_weights * matrix["housing/council_tax_net"].values - ).sum() direct_net = ct_merged["total_council_tax_net"].values - fallback_net = national_ct_net * la_household_share y["housing/council_tax_net"] = np.where( - is_ct_la, - np.where(has_ct_net, direct_net, fallback_net), - 0.0, + is_ct_la & has_ct_net, + direct_net, + np.nan, ) # ── Country mask ─────────────────────────────────────────────── diff --git a/policyengine_uk_data/targets/sources/la_council_tax.py b/policyengine_uk_data/targets/sources/la_council_tax.py index 5fc731b30..9aac581c0 100644 --- a/policyengine_uk_data/targets/sources/la_council_tax.py +++ b/policyengine_uk_data/targets/sources/la_council_tax.py @@ -28,8 +28,8 @@ * VOA stock includes exempt, empty, and second-home dwellings, which contribute zero to the matrix-side sum (no household lives in them in the FRS). - * VOA covers England and Wales only. Scotland uses the - national-share fallback; NI is zeroed (no council tax). + * VOA covers England and Wales only. Scotland and NI cells are + masked out of the loss matrix unless a direct source is available. * Banding ratios differ: Scotland diverged from the standard 6/9–18/9 E&W ratios after the 2017 reform; Wales has Band I, England does not. @@ -49,8 +49,8 @@ Known coverage gaps: - Northern Ireland is excluded because its domestic rates system is - distinct from council tax. ``loss.py`` zeros the y vector for NI - rather than fabricating a fallback. + distinct from council tax. ``loss.py`` masks NI cells rather than + fabricating a fallback. - Band-count rows for Scottish LAs are absent because the VOA summary tables do not cover Scotland; Scottish Assessors publishes per-LA chargeable-dwellings data separately and is a follow-up. @@ -131,9 +131,8 @@ def load_la_net_council_tax() -> pd.DataFrame: Returns a DataFrame with columns ``code, total_council_tax_net`` for LAs where a directly-observed net figure is available - (England + Wales). Scotland and NI are absent and handled by the - loss-matrix national-share fallback — same pattern as the rent - and tenure targets. + (England + Wales). Scotland and NI are absent; loss-matrix callers + should mask those cells rather than fabricating fallback values. """ df = _load_table() if df is None or df.empty: diff --git a/policyengine_uk_data/tests/test_calibrate_save.py b/policyengine_uk_data/tests/test_calibrate_save.py index 20eadb8e5..6b1c04334 100644 --- a/policyengine_uk_data/tests/test_calibrate_save.py +++ b/policyengine_uk_data/tests/test_calibrate_save.py @@ -120,3 +120,42 @@ def test_calibrate_local_areas_saves_weights_in_nonverbose_branch( # Verify the saved weights have the area_count x n_households shape # produced by the calibrator. assert weights.shape == (2, 4) + + +def test_calibrate_local_areas_masks_nan_local_targets(tmp_path, monkeypatch): + """Sparse local targets should be allowed. + + Local-authority sources are not available for every area/metric pair. + A NaN target means "do not train on this cell", not "propagate NaN + through the loss". + """ + + import h5py + + from policyengine_uk_data.utils import calibrate as calibrate_module + from policyengine_uk_data.utils.calibrate import calibrate_local_areas + + monkeypatch.setattr(calibrate_module, "STORAGE_FOLDER", tmp_path) + + matrix_fn, national_matrix_fn = _make_toy_inputs(n_households=4, area_count=2) + + def sparse_matrix_fn(dataset): + matrix, local_targets, country_mask = matrix_fn(dataset) + local_targets.iloc[1, 0] = np.nan + return matrix, local_targets, country_mask + + weight_file = "toy_sparse_weights.h5" + calibrate_local_areas( + dataset=_StubDataset(np.array([1.0, 1.0, 1.0, 1.0])), + matrix_fn=sparse_matrix_fn, + national_matrix_fn=national_matrix_fn, + area_count=2, + weight_file=weight_file, + dataset_key="2025", + epochs=5, + verbose=False, + ) + + with h5py.File(tmp_path / weight_file, "r") as f: + weights = f["2025"][:] + assert np.isfinite(weights).all() diff --git a/policyengine_uk_data/tests/test_la_loss_council_tax.py b/policyengine_uk_data/tests/test_la_loss_council_tax.py index ba21ef13c..c33949e06 100644 --- a/policyengine_uk_data/tests/test_la_loss_council_tax.py +++ b/policyengine_uk_data/tests/test_la_loss_council_tax.py @@ -110,9 +110,12 @@ def test_la_loss_band_y_vectors_length_360(enhanced_frs): assert len(y[f"voa/council_tax/{band}"]) == 360 -def test_la_loss_band_y_finite(enhanced_frs): - """No NaNs / negatives in y. NI LAs are zero (no council tax there); - other LAs are positive via direct value or national-share fallback.""" +def test_la_loss_band_y_direct_cells_finite(enhanced_frs): + """Direct band-count cells are finite and non-negative. + + Missing-source cells stay NaN so the calibrator can mask them out + instead of training on fabricated national-share fallbacks. + """ from policyengine_uk_data.datasets.local_areas.local_authorities.loss import ( create_local_authority_target_matrix, ) @@ -128,11 +131,12 @@ def test_la_loss_band_y_finite(enhanced_frs): ] for band in WIRED_BANDS: col = f"voa/council_tax/{band}" - assert np.isfinite(y[col]).all(), f"{col}: NaN/inf in y" - assert (y[col] >= 0).all(), f"{col}: negative y values" - # All non-NI LAs have positive targets. - non_ni = y[col].drop(ni_indices) - assert (non_ni > 0).all(), f"{col}: non-positive y for non-NI LA" + direct = y[col].dropna() + assert np.isfinite(direct).all(), f"{col}: inf in direct y cells" + assert (direct >= 0).all(), f"{col}: negative direct y values" + assert y[col].iloc[ni_indices].isna().all(), ( + f"{col}: NI cells should be masked, not zero-filled" + ) def test_la_loss_band_matrix_columns_are_indicators(enhanced_frs): @@ -187,10 +191,9 @@ def test_la_loss_band_y_matches_csv_for_english_la(enhanced_frs): ) -def test_la_loss_band_y_uses_fallback_for_scotland(enhanced_frs): - """Scottish LAs have no VOA band counts; y must use the - national_band_count × la_household_share fallback rather than NaN - or 0.""" +def test_la_loss_band_y_masks_scotland_without_direct_source(enhanced_frs): + """Scottish LAs have no VOA band counts; y must be NaN so the + calibrator excludes those cells instead of inventing a fallback.""" from policyengine_uk_data.datasets.local_areas.local_authorities.loss import ( create_local_authority_target_matrix, ) @@ -202,18 +205,16 @@ def test_la_loss_band_y_uses_fallback_for_scotland(enhanced_frs): scotland_la = CT_DATA[CT_DATA["country"] == "SCOTLAND"]["code"].iloc[0] la_index = LA_CODES.index[LA_CODES["code"] == scotland_la][0] for band in WIRED_BANDS: - val = float(y[f"voa/council_tax/{band}"].iloc[la_index]) - assert val > 0, ( - f"Scotland LA {scotland_la} band {band}: fallback produced {val}" + val = y[f"voa/council_tax/{band}"].iloc[la_index] + assert pd.isna(val), ( + f"Scotland LA {scotland_la} band {band}: expected masked NaN, got {val}" ) -def test_la_loss_band_y_zero_for_ni(enhanced_frs): +def test_la_loss_band_y_masks_ni(enhanced_frs): """NI LAs have no council tax (domestic rates instead). Band targets - must be exactly zero — a positive fallback would be an impossible - constraint (NI households have council_tax_band == None, so the - matrix column is zero everywhere) and the optimiser would waste - loss on a constraint it cannot satisfy.""" + must be masked. A zero target is still a training constraint and can + be impossible if the matrix-side band variable is non-zero.""" from policyengine_uk_data.datasets.local_areas.local_authorities.loss import ( create_local_authority_target_matrix, ) @@ -226,9 +227,9 @@ def test_la_loss_band_y_zero_for_ni(enhanced_frs): for ni_la in ni_codes: la_index = LA_CODES.index[LA_CODES["code"] == ni_la][0] for band in WIRED_BANDS: - val = float(y[f"voa/council_tax/{band}"].iloc[la_index]) - assert val == 0.0, ( - f"NI LA {ni_la} band {band}: expected 0 (no CT in NI), got {val}" + val = y[f"voa/council_tax/{band}"].iloc[la_index] + assert pd.isna(val), ( + f"NI LA {ni_la} band {band}: expected masked NaN, got {val}" ) @@ -242,9 +243,8 @@ def test_csv_has_net_council_tax_column(): def test_net_council_tax_covers_england_and_wales(): """Direct-formula values are produced for England (MHCLG taxbase × Band D) - and Wales (Welsh Government Council Tax Income). Scotland and NI fall - through to the loss.py national-share fallback, same pattern as - band counts and the existing tenure target.""" + and Wales (Welsh Government Council Tax Income). Scotland and NI are + masked in loss.py unless direct values are added.""" cov = ( CT_DATA.assign(has_net=CT_DATA["total_council_tax_net"].notna()) .groupby("country")["has_net"] @@ -314,9 +314,12 @@ def test_la_loss_council_tax_net_matrix_uses_net_variable(enhanced_frs): np.testing.assert_array_equal(matrix["housing/council_tax_net"].values, expected) -def test_la_loss_council_tax_net_y_finite(enhanced_frs): - """y has no NaN/inf. NI LAs are zero (no council tax there); - Scotland uses fallback; England/Wales use direct values.""" +def test_la_loss_council_tax_net_y_direct_cells_finite(enhanced_frs): + """Direct net-council-tax cells are finite and non-negative. + + Missing-source cells stay NaN so the calibrator excludes them from + training instead of using national-share fallbacks or hard zeroes. + """ from policyengine_uk_data.datasets.local_areas.local_authorities.loss import ( create_local_authority_target_matrix, ) @@ -325,21 +328,20 @@ def test_la_loss_council_tax_net_y_finite(enhanced_frs): enhanced_frs, time_period=enhanced_frs.time_period ) col = y["housing/council_tax_net"] - assert np.isfinite(col).all() - assert (col >= 0).all() + direct = col.dropna() + assert np.isfinite(direct).all() + assert (direct >= 0).all() ni_indices = LA_CODES.index[ LA_CODES["code"].isin( CT_DATA.loc[CT_DATA["country"] == "NORTHERN_IRELAND", "code"] ) ] - assert (col.iloc[ni_indices] == 0).all(), ( - "NI LAs should have y=0 for housing/council_tax_net " + assert col.iloc[ni_indices].isna().all(), ( + "NI LAs should be masked for housing/council_tax_net " "(NI uses domestic rates, not council tax)" ) - assert (col.drop(ni_indices) > 0).all(), ( - "non-NI LAs should have positive y (direct value or fallback)" - ) + assert (direct > 0).all(), "direct housing/council_tax_net cells should be positive" def test_la_loss_council_tax_net_y_matches_csv_for_english_la(enhanced_frs): @@ -362,9 +364,9 @@ def test_la_loss_council_tax_net_y_matches_csv_for_english_la(enhanced_frs): assert actual == pytest.approx(expected, rel=1e-6) -def test_la_loss_council_tax_net_y_uses_fallback_for_scotland(enhanced_frs): - """Scottish LAs have no published net CT in the CSV; the fallback - must produce a positive value.""" +def test_la_loss_council_tax_net_y_masks_scotland_without_direct_source(enhanced_frs): + """Scottish LAs have no published net CT in the CSV; the target + should be NaN until a direct source is wired in.""" from policyengine_uk_data.datasets.local_areas.local_authorities.loss import ( create_local_authority_target_matrix, ) @@ -374,7 +376,7 @@ def test_la_loss_council_tax_net_y_uses_fallback_for_scotland(enhanced_frs): ) scotland_code = CT_DATA[CT_DATA["country"] == "SCOTLAND"]["code"].iloc[0] la_index = LA_CODES.index[LA_CODES["code"] == scotland_code][0] - assert float(y["housing/council_tax_net"].iloc[la_index]) > 0 + assert pd.isna(y["housing/council_tax_net"].iloc[la_index]) def test_la_loss_english_council_tax_net_in_reach_of_initial_weights( diff --git a/policyengine_uk_data/utils/calibrate.py b/policyengine_uk_data/utils/calibrate.py index 3efd944f2..3e144126b 100644 --- a/policyengine_uk_data/utils/calibrate.py +++ b/policyengine_uk_data/utils/calibrate.py @@ -156,7 +156,10 @@ def track_stage(stage_name: str): # Set up validation targets if specified validation_targets_local = ( - matrix.columns.isin(excluded_training_targets) + torch.tensor( + matrix.columns.isin(excluded_training_targets), + dtype=torch.bool, + ) if hasattr(matrix, "columns") else None ) @@ -172,7 +175,9 @@ def track_stage(stage_name: str): matrix.values if hasattr(matrix, "values") else matrix, dtype=torch.float32, ) - y = torch.tensor(y.values if hasattr(y, "values") else y, dtype=torch.float32) + y_values = y.values if hasattr(y, "values") else y + local_target_available = torch.tensor(np.isfinite(y_values), dtype=torch.bool) + y = torch.tensor(np.nan_to_num(y_values, nan=0.0), dtype=torch.float32) matrix_national = torch.tensor( m_national.values if hasattr(m_national, "values") else m_national, dtype=torch.float32, @@ -190,15 +195,18 @@ def sre(x, y): def loss(w, validation: bool = False): pred_local = (w.unsqueeze(-1) * metrics.unsqueeze(0)).sum(dim=1) + local_mask = local_target_available if dropout_targets and validation_targets_local is not None: if validation: - mask = validation_targets_local + column_mask = validation_targets_local else: - mask = ~validation_targets_local - pred_local = pred_local[:, mask] - mse_local = torch.mean(sre(pred_local, y[:, mask])) + column_mask = ~validation_targets_local + local_mask = local_mask & column_mask.unsqueeze(0) + + if local_mask.any(): + mse_local = torch.mean(sre(pred_local[local_mask], y[local_mask])) else: - mse_local = torch.mean(sre(pred_local, y)) + mse_local = pred_local.sum() * 0 pred_national = (w.sum(axis=0) * matrix_national.T).sum(axis=1) if dropout_targets and validation_targets_national is not None: @@ -220,8 +228,10 @@ def pct_close(w, t=0.1, local=True, national=True): if local: pred_local = (w.unsqueeze(-1) * metrics.unsqueeze(0)).sum(dim=1) - e_local = torch.sum(torch.abs((pred_local / (1 + y) - 1)) < t).item() - c_local = pred_local.shape[0] * pred_local.shape[1] + e_local = torch.sum( + (torch.abs((pred_local / (1 + y) - 1)) < t) & local_target_available + ).item() + c_local = torch.sum(local_target_available).item() numerator += e_local denominator += c_local From 7f0c3e2f7e247e4604db0371384ecffc2c178711 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 30 Apr 2026 11:11:39 -0400 Subject: [PATCH 10/10] Remove redundant council tax availability gate --- .../datasets/local_areas/local_authorities/loss.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/policyengine_uk_data/datasets/local_areas/local_authorities/loss.py b/policyengine_uk_data/datasets/local_areas/local_authorities/loss.py index 2bbc300ad..d81104d8c 100644 --- a/policyengine_uk_data/datasets/local_areas/local_authorities/loss.py +++ b/policyengine_uk_data/datasets/local_areas/local_authorities/loss.py @@ -268,13 +268,10 @@ def create_local_authority_target_matrix( ct_path = STORAGE_FOLDER / "la_council_tax.csv" if ct_path.exists(): ct_data = pd.read_csv(ct_path) - ct_columns = ["code", "has_council_tax"] + [ - f"count_band_{b}" for b in "ABCDEFGH" - ] + ct_columns = ["code"] + [f"count_band_{b}" for b in "ABCDEFGH"] if "total_council_tax_net" in ct_data.columns: ct_columns.append("total_council_tax_net") ct_merged = la_codes.merge(ct_data[ct_columns], on="code", how="left") - is_ct_la = ct_merged["has_council_tax"].fillna(True).astype(bool).values ct_band = sim.calculate("council_tax_band").values for band in "ABCDEFGH": col = f"voa/council_tax/{band}" @@ -283,7 +280,7 @@ def create_local_authority_target_matrix( has_count = ct_merged[csv_col].notna().values direct = ct_merged[csv_col].values y[col] = np.where( - is_ct_la & has_count, + has_count, direct, np.nan, ) @@ -304,7 +301,7 @@ def create_local_authority_target_matrix( has_ct_net = ct_merged["total_council_tax_net"].notna().values direct_net = ct_merged["total_council_tax_net"].values y["housing/council_tax_net"] = np.where( - is_ct_la & has_ct_net, + has_ct_net, direct_net, np.nan, )