avantifellows / avantifellows/external_data_sources

jnv_fact_jee_results 2026: JNV name + 10th roll dropped (only state survived); recovery via name+DOB

Open
#29 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
Python
Stars
1
Forks
1
Avg merge
7h 7m
Merged PRs (30d)
32

Description

## jnv_fact_jee_results 2026: JNV name + 10th roll dropped (only `student_state` survived)

Sibling of #26 (which covers the **2025** export). This is the **2026** export gap.

### Problem
For `test_year = '2026'`, every school/identity locator is blank: `jnv_name`, `district_12`,
`place_of_school`, `school_code`, `jnv_region`, `roll_no_s1`, `roll_no_s2`. Only `student_state`
is populated. The 2026 NTA file Avanti received (`all_passing_candidates_passing_2025_or_later`)
is a qualifier-only dump keyed by `APPNO` + name + DOB + state + Class-10 marks — it never carried
the JNV/school columns the 2025 "all JNV candidates" export had.

### Evidence
```
test_year rows roll_no_s1 jnv_name marks_10_pct
2024 18590 0 573 0
2025 12103 0 12103 0 <- #26: has school, no board
2026 4197 0 0 4184 <- this: has board, no school
```

### Impact
No school-/district-level 2026 JNV analysis from this table alone (Micron Karnataka girls funnel,
CoE-lift per-centre). Forces a downstream name+DOB recovery (below) that caps ~95% for the current
cohort and 0% for the untouched-JNV tail.

### Fix (upstream — the real unlock)
Re-pull the 2026 JEE export **in the 2025 format**: include `jnvname`, `District`, `PlaceofSchool`,
and the **10th roll** (`roll_no_s1`) as the board merge key. Then `jnv_name` flows natively.

### Acceptance criteria
- `COUNTIF(jnv_name != '') / COUNT(*)` for `test_year='2026'` ≥ 0.98
- `roll_no_s1` populated for ≥ 0.9 of 2026 rows (enables exact board-10 join, like 2024).

### Downstream recovery (implemented; to upstream into `clean_jee.py` after #27 merges)
In `avanti-overview-document/11_avanti_impact_regression`: `build_jee_clean.year_2026` /
`build_analysis_dataset.year_2026` recover school + programme by matching each current-cohort
candidate (`year_of_passing_12=2026`; droppers excluded) to `dim_student` G12 on **name + DOB**
(token Jaccard ≥ 0.5, DOB-blocked) — ~95% on the fresh cohort. `build_student_unified.py` then
emits a full-outer person table (boards ∪ dim ∪ JEE) with provenance.

Residual gaps: **Dakshana** has NULL `pk_student_id` in dim_student (no SID link); ~5% + the
untouched-JNV tail unrecoverable by name+DOB (NTA initials vs full names).

Contributor guide

No contributing guide indexed for this repository

Research direction

Start by tracing the 2026 import in clean_jee.py and comparing it with the 2025-format export described here. After the upstream data is available, inspect build_jee_clean.year_2026 and build_analysis_dataset.year_2026; done means at least 98% of 2026 rows have jnv_name and at least 90% have roll_no_s1.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
data-engineering
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
38/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.