fcf5a4c6a3
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4.0 KiB
4.0 KiB
name, kind, lang, domain, version, purity, signature, description, tags, params, output, uses_functions, uses_types, returns, returns_optional, error_type, imports, tested, tests, test_file_path, file_path
| name | kind | lang | domain | version | purity | signature | description | tags | params | output | uses_functions | uses_types | returns | returns_optional | error_type | imports | tested | tests | test_file_path | file_path | |||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| build_boxplot_stats | function | py | datascience | 1.0.0 | pure | def build_boxplot_stats(numeric: dict) -> dict | Deriva las estadisticas de un boxplot de Tukey desde el sub-bloque numeric de un ColumnProfile del grupo eda (salida de describe_numeric). Aplica la regla del 1.5*IQR a los percentiles p25/p50/p75 para obtener cuartiles, fences, bigotes reales y flags de outliers. Lectura defensiva con .get; NUNCA lanza. Si faltan los percentiles clave devuelve {} para que el caller omita el grafico. |
|
|
Dict con las cifras de un boxplot horizontal de Tukey: {q1=p25, median=median(o p50), q3=p75, iqr=q3-q1, lower_fence=q1-1.5*iqr, upper_fence=q3+1.5*iqr, whisker_lo=max(min,lower_fence), whisker_hi=min(max,upper_fence), min, max, has_low_outliers=min<lower_fence, has_high_outliers=max>upper_fence, n_outliers}. Numericos en float, flags en bool nativo, n_outliers en int. Si faltan p25/median(o p50)/p75 devuelve {} (dict vacio). Cuando min/max faltan, los bigotes caen a la fence correspondiente. | false | true |
|
python/functions/datascience/build_boxplot_stats_test.py | python/functions/datascience/build_boxplot_stats.py |
Ejemplo
import sys, os
sys.path.insert(0, os.path.join("python", "functions"))
from datascience.build_boxplot_stats import build_boxplot_stats
# Sub-bloque numeric tal y como lo produce describe_numeric:
numeric = {
"min": 1.0, "max": 100.0,
"p25": 10.0, "median": 25.0, "p75": 40.0,
"iqr": 30.0, "n_outliers": 3,
}
box = build_boxplot_stats(numeric)
print(box["lower_fence"], box["upper_fence"]) # -35.0 85.0
print(box["whisker_lo"], box["whisker_hi"]) # 1.0 85.0
print(box["has_low_outliers"], box["has_high_outliers"]) # False True
Cuando usarla
- Usala al dibujar un boxplot horizontal bajo el histograma en el capitulo
num_distrdeAutomaticEDA: convierte el bloquenumericde unColumnProfileen las cifras exactas que el renderer necesita (cuartiles, fences, extremos de los bigotes y flags de outliers). - Cuando ya tengas los percentiles calculados (salida de
describe_numeric) y solo necesites derivar la geometria del boxplot de Tukey sin volver a tocar los valores crudos. - Cuando quieras decidir si una columna tiene cola alta/baja (
has_high_outliers/has_low_outliers) antes de proponer una transformacion (log, winsorize).
Gotchas
- Funcion pura, sin I/O y determinista. Lectura defensiva con
.get: NUNCA lanza. Si faltanp25,median/p50op75devuelve{}(dict vacio) — el caller debe omitir el boxplot. - Los
n_outliersque se propagan vienen del bloque z-score del profile (detect_outliers, threshold 3.0), NO de la regla IQR. Son informativos: el conteo de Tukey que esta funcion calcula son los fences (lower_fence/upper_fence), no un recuento de puntos. - No recibe los valores crudos de la columna, solo deriva cifras desde los percentiles ya calculados. Por eso no puede contar cuantos puntos caen fuera de las fences, solo si los extremos (
min/max) las superan. iqrse recalcula comoq3 - q1aunque el bloque traiganumeric['iqr']: asi funciona aunque esa clave falte.- Cuando
min/maxfaltan, los bigotes caen a la fence correspondiente y los flags de outliers quedan enFalse(sin extremo real no se afirma cola).