avantifellows / avantifellows/external_data_sources

jnv jee_results: 2025 JEE Advanced merge key (student_id) is non-unique — collapses namesakes, drops 16 qualifiers

Open
#47 0 comments 0 reactions 0 assignees View on GitHub
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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.