On Selection Sunday, the committee doesn't stare at one number — it reads a team sheet, the résumé that sorts every game into quadrants by opponent quality and location. We explained the system in our NET explainer; here we'll build a team-sheet analyzer in Python, using our own ranking as the sort key. Full code: scripts/cbb-quadrant-team-sheet-python.py.
The quadrant rule
A game's quadrant depends on the opponent's rank and where it was played — a road win counts more, so the thresholds shift:
def quad(opp_rank, location):
bands = {"home": (30, 75, 160), "neutral": (50, 100, 200), "away": (75, 135, 240)}
a, b, c = bands[location]
return 1 if opp_rank <= a else 2 if opp_rank <= b else 3 if opp_rank <= c else 4
Quad 1 = a top opponent; Quad 4 = a cupcake. Location moves the goalposts.
Bring your own ranking
The official NET isn't freely scriptable, so we supply our own ranking as the opponent-quality key — here, season scoring margin (swap in your adjusted efficiency for a sharper version). The method is identical to the committee's; only the ranking source differs:
margin = {} # team_id -> avg scoring margin
# ...from team box scores...
rank = {t: i+1 for i, (t, _) in enumerate(
sorted(margin.items(), key=lambda kv: kv[1], reverse=True))}
Then walk a team's schedule, classify each game by opponent rank and location, and tally a record per quadrant.
The result: a real team sheet
Run it for North Carolina's 2024-25 season — a famous bubble case — and the sheet explains the drama instantly:
Team sheet: North Carolina Tar Heels (2025)
Quadrant 1: 1-10
Quadrant 2: 2-2
Quadrant 3: 6-2
Quadrant 4: 14-0
Quad 1 & 2 games (selected):
Q1 away L 70-87 vs Duke (#1)
Q1 neutral L 84-90 vs Florida (#4)
Q1 neutral W 76-74 vs UCLA (#35)
Q1 home L 79-94 vs Alabama (#25)
Q2 home W 82-67 vs SMU (#42)
Actual output, sportsdataverse / hoopR, 2024-25, retrieved June 2026.
There's the whole bubble argument in four lines. A 1-10 Quadrant 1 record is the kind of résumé that makes a committee sweat — lots of chances against elite teams (Duke three times, Florida, Auburn, Alabama), almost no wins to show for them — propped up by a spotless 14-0 against Quadrant 4. The team sheet doesn't tell you whether they should get in; it frames the exact question the committee debates. (Our ranking differs slightly from the official NET, so treat the specific quadrants as illustrative of the method.)
Make it yours
- Plug in a better rank. Use adjusted efficiency or Elo instead of raw margin and the quadrants tighten toward the committee's.
- Add the bad-loss flag. Quad 3 and 4 losses sink résumés; surface them prominently.
- Compare bubble teams side by side — that's exactly how bracketologists argue the last four in.
Sources & further reading
- sportsdataverse / hoopR — sportsdataverse.org
- NCAA.com — ncaa.com (official quadrant definitions)
- Companion code:
scripts/cbb-quadrant-team-sheet-python.py - Related: How the NET works · The at-large math