Parent
#176
What to build
Update splitting/_profile_signals.py to use user-declared string sentinels with replace semantics when computing effective null masks for split-balance signals.
Where the module currently references _SENTINEL_STRINGS unconditionally for String/Utf8 columns (line 58), it should instead resolve the per-column sentinel set from the profile result:
- If
profile_result.string_sentinels has an entry for the column → use only the declared values (case-insensitive)
- If no entry exists → fall back to
_SENTINEL_STRINGS (unchanged current behaviour)
Empty/whitespace detection is always applied unconditionally.
StructuralProfileResult.string_sentinels (added in #177) is the source of the declarations — the split module already receives the profile result.
Acceptance criteria
Blocked by
Parent
#176
What to build
Update
splitting/_profile_signals.pyto use user-declared string sentinels with replace semantics when computing effective null masks for split-balance signals.Where the module currently references
_SENTINEL_STRINGSunconditionally for String/Utf8 columns (line 58), it should instead resolve the per-column sentinel set from the profile result:profile_result.string_sentinelshas an entry for the column → use only the declared values (case-insensitive)_SENTINEL_STRINGS(unchanged current behaviour)Empty/whitespace detection is always applied unconditionally.
StructuralProfileResult.string_sentinels(added in #177) is the source of the declarations — the split module already receives the profile result.Acceptance criteria
_SENTINEL_STRINGS(no regression)SplitImbalanceWarningfires correctly when sentinel-based missingness lands disproportionately in one split, using declared sentinelsBlocked by