Skip to content

Commit 3ac204a

Browse files
fix: correct Plan 2/5 values from EES permalink and add source breakdown
1 parent 7e93fd8 commit 3ac204a

2 files changed

Lines changed: 49 additions & 29 deletions

File tree

policyengine_uk_data/targets/sources/slc.py

Lines changed: 47 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,59 +4,79 @@
44
borrowers liable to repay and earning above the repayment threshold.
55
This matches the FRS coverage (PAYE deductions only).
66
7-
Source: SLC 'Student loans: borrower liability and repayment' statistical
8-
release, Table 6a — Forecast number of student borrowers liable to repay
9-
and number earning above repayment threshold.
10-
https://www.gov.uk/government/collections/student-loans-in-england-statistics
7+
Source: Explore Education Statistics — Student loan forecasts for England,
8+
Table 6a: Forecast number of student borrowers liable to repay and number
9+
earning above repayment threshold, by product. Figures are the sum of
10+
higher education full-time, higher education part-time, and advanced
11+
learner loan borrowers (Master's and Doctoral loans use Plan 3 and are
12+
excluded). Academic year 20XX-YY maps to calendar year 20XX.
13+
14+
Data permalink:
15+
https://explore-education-statistics.service.gov.uk/data-tables/permalink/6ff75517-7124-487c-cb4e-08de6eccf22d
1116
"""
1217

1318
from policyengine_uk_data.targets.schema import Target, Unit
1419

20+
_REFERENCE = (
21+
"https://explore-education-statistics.service.gov.uk/data-tables"
22+
"/permalink/6ff75517-7124-487c-cb4e-08de6eccf22d"
23+
)
24+
25+
# Plan 2, earning above threshold — sum of HE full-time + part-time + AL
26+
# 2024-25: 3,670k + 225k + 90k = 3,985k
27+
# 2025-26: 4,130k + 245k + 85k = 4,460k
28+
# 2026-27: 4,480k + 260k + 85k = 4,825k
29+
# 2027-28: 4,700k + 265k + 80k = 5,045k
30+
# 2028-29: 4,820k + 265k + 70k = 5,155k
31+
# 2029-30: 4,870k + 270k + 65k = 5,205k
32+
_PLAN2_ABOVE_THRESHOLD = {
33+
2025: 3_985_000,
34+
2026: 4_460_000,
35+
2027: 4_825_000,
36+
2028: 5_045_000,
37+
2029: 5_155_000,
38+
2030: 5_205_000,
39+
}
40+
41+
# Plan 5, earning above threshold — sum of HE full-time + part-time + AL
42+
# 2024-25: 0 + 0 + 0 = 0
43+
# 2025-26: 25k + 5k + 5k = 35k
44+
# 2026-27: 115k + 20k + 10k = 145k
45+
# 2027-28: 340k + 35k + 15k = 390k
46+
# 2028-29: 700k + 50k + 15k = 765k
47+
# 2029-30: 1,140k + 75k + 20k = 1,235k
48+
_PLAN5_ABOVE_THRESHOLD = {
49+
2026: 35_000,
50+
2027: 145_000,
51+
2028: 390_000,
52+
2029: 765_000,
53+
2030: 1_235_000,
54+
}
55+
1556

1657
def get_targets() -> list[Target]:
1758
targets = []
1859

19-
_REFERENCE = (
20-
"https://www.gov.uk/government/collections/"
21-
"student-loans-in-england-statistics"
22-
)
23-
24-
# Plan 2 — England, earning above threshold
25-
# Academic year 20XX-YY maps to calendar year 20XX.
2660
targets.append(
2761
Target(
2862
name="slc/plan_2_borrowers_above_threshold",
2963
variable="student_loan_plan",
3064
source="slc",
3165
unit=Unit.COUNT,
3266
is_count=True,
33-
values={
34-
2025: 3_985_000,
35-
2026: 4_460_000,
36-
2027: 4_825_000,
37-
2028: 5_045_000,
38-
2029: 5_160_000,
39-
2030: 5_205_000,
40-
},
67+
values=_PLAN2_ABOVE_THRESHOLD,
4168
reference_url=_REFERENCE,
4269
)
4370
)
4471

45-
# Plan 5 — England, earning above threshold
4672
targets.append(
4773
Target(
4874
name="slc/plan_5_borrowers_above_threshold",
4975
variable="student_loan_plan",
5076
source="slc",
5177
unit=Unit.COUNT,
5278
is_count=True,
53-
values={
54-
2026: 35_000,
55-
2027: 145_000,
56-
2028: 390_000,
57-
2029: 770_000,
58-
2030: 1_235_000,
59-
},
79+
values=_PLAN5_ABOVE_THRESHOLD,
6080
reference_url=_REFERENCE,
6181
)
6282
)

policyengine_uk_data/tests/test_student_loan_targets.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def test_slc_plan2_values():
2020
p2 = targets["slc/plan_2_borrowers_above_threshold"]
2121
assert p2.values[2025] == 3_985_000
2222
assert p2.values[2026] == 4_460_000
23-
assert p2.values[2029] == 5_160_000
23+
assert p2.values[2029] == 5_155_000
2424

2525

2626
def test_slc_plan5_values():
@@ -31,4 +31,4 @@ def test_slc_plan5_values():
3131
p5 = targets["slc/plan_5_borrowers_above_threshold"]
3232
assert 2025 not in p5.values # no Plan 5 borrowers yet in 2024-25
3333
assert p5.values[2026] == 35_000
34-
assert p5.values[2029] == 770_000
34+
assert p5.values[2029] == 765_000

0 commit comments

Comments
 (0)