avantifellows / avantifellows/external_data_sources
jnv jee_results: 2025 JEE Advanced merge key (student_id) is non-unique — collapses namesakes, drops 16 qualifiers
- Dominant language
- Python
- Stars
- 1
- Forks
- 1
- Avg merge
- 7h 7m
- Merged PRs (30d)
- 32
Description
## Problem
The 2025 JEE Advanced file has no mains application number, so `codemaps/advanced/y2025.py` maps `application_no ← student_id` and left-joins advanced ranks onto mains by `(test_year, application_no)`. **`student_id` is not unique** in that file: 1,189 rows collapse to **1,142 distinct `student_id`** — 40 values shared across 87 rows.
These collisions are **distinct people (namesakes), not duplicate rows**: 19 of the 40 groups mix a *regular* candidate and a *preparatory* candidate — mutually exclusive, since a regular qualifier is never in a prep list — and each colliding row has a different `advrollno` (the only fully-unique key, 1,189/1,189). Example — `student_id 250310019562` is three different "ASHISH KUMAR"s: one OBC-general, one ST-prep, one SC-prep. The likely upstream cause is that `student_id` was populated by name-matching to mains, which folds every namesake onto one application number.
## Effect on `jnv_fact_jee_results` (2025)
The left-join fans each collided key to 2–3 rows, then dedup on `(test_year, application_no)` keeps the row with the best **mains score — blind to the advanced rank** — so it can keep a row whose `adv_*` ranks are NULL.
- **`jee_advanced_qualified` = 822, should be ~838** — 16 genuine regular-rank qualifiers are dropped (all 16 confirmed to be collision victims).
- **Mis-attribution risk:** some of the 822 flagged rows may carry the *wrong* namesake's advanced rank.
- **2024 is unaffected** — its key is the real, unique JEE Main Application Number.
## Why it may not be cleanly fixable from current files
The advanced file has no DOB and mains has no `advrollno`, so there's no shared field to disambiguate the 40 namesake groups. Options: (a) source a 2025 advanced export that carries the real mains application number or DOB, or (b) if a `student_id → advrollno`-level identity is available elsewhere, re-key on it. Until then, treat 2025 advanced qualification as ~16 undercounted with possible namesake mis-attribution.
Related: #28 (the qualification-logic fix, verified correct).
Contributor guide
No contributing guide indexed for this repository
Research direction
Start in codemaps/advanced/y2025.py and trace how student_id becomes application_no before the left join and deduplication. Check the affected 2025 rows against advrollno and the qualification counts; completion requires a reliable shared identity key or source export, with the 16 missing qualifiers and namesake attributions resolved.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- data-engineering
- Issue type
- Bug
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 28/100