Parent
#105
What to build
Compute tail_asymmetry_ratio and classify TailAsymmetryTag in NumericProfiler from the already-available PercentileSnapshot. No additional data pass over the column is required.
Computation (_numeric_profiler.py)
For each numeric column, after percentiles are computed:
tail_asymmetry_ratio = (p99 − p95) / (p5 − p1)
- When
p5 == p1 (flat left tail — denominator is zero), store tail_asymmetry_ratio = None and leave tail_asymmetry_tag = None. Do not raise.
- Otherwise, classify using
NumericProfileConfig thresholds:
- ratio >
tail_asymmetry_right_threshold → TailAsymmetryTag.RightHeavy
- ratio <
tail_asymmetry_left_threshold → TailAsymmetryTag.LeftHeavy
- otherwise →
TailAsymmetryTag.Symmetric
- Store both values on
NumericStats.tail_asymmetry_ratio and NumericStats.tail_asymmetry_tag
Acceptance criteria
Blocked by
Parent
#105
What to build
Compute
tail_asymmetry_ratioand classifyTailAsymmetryTaginNumericProfilerfrom the already-availablePercentileSnapshot. No additional data pass over the column is required.Computation (
_numeric_profiler.py)For each numeric column, after percentiles are computed:
p5 == p1(flat left tail — denominator is zero), storetail_asymmetry_ratio = Noneand leavetail_asymmetry_tag = None. Do not raise.NumericProfileConfigthresholds:tail_asymmetry_right_threshold→TailAsymmetryTag.RightHeavytail_asymmetry_left_threshold→TailAsymmetryTag.LeftHeavyTailAsymmetryTag.SymmetricNumericStats.tail_asymmetry_ratioandNumericStats.tail_asymmetry_tagAcceptance criteria
p99 − p95 >> p5 − p1) storesTailAsymmetryTag.RightHeavyTailAsymmetryTag.LeftHeavyTailAsymmetryTag.Symmetricp5 == p1storestail_asymmetry_ratio = Noneandtail_asymmetry_tag = Nonewithout raisingtail_asymmetry_ratiois computed fromPercentileSnapshotvalues already present — no second pass over the raw column datatail_asymmetry_right_thresholdandtail_asymmetry_left_thresholdare read fromNumericProfileConfig(configurable, not hard-coded)NumericProfilertests pass (no regressions)Blocked by
TailAsymmetryTag,NumericStats.tail_asymmetry_tag/ratiomust exist)