a2074a0167
Implementa el modelo de calidad del report 2046 en el grupo eda. Score de columna: 0.6·completeness + 0.4·validity con renormalización por aplicabilidad (si la validez no es medible —texto libre o columna 100% nula— el score se basa solo en completeness). Validez = conformidad real al tipo: nativo numérico/fecha/bool = 1.0; texto promovido a número/fecha = parse rate (validity_rate); texto con semantic_type = match_rate; texto libre = no aplica. Outliers, columnas constantes e identificadores salen del score a un bloque de observaciones analíticas (no son defectos de calidad). Se elimina el doble conteo de la falta de datos (mostly_null ya no castiga validez) y el bug de escala de outliers (que además ya no entran en el score). Score de dataset: 100·(0.85·cell_quality + 0.15·row_uniqueness) en vez de la media simple. Se pobla duplicate_rows/duplicate_pct push-down en summarize_table_duckdb (COUNT sobre DISTINCT *, sin RAM) para habilitar la unicidad de registro; renormaliza a solo cell_quality si no se puede calcular. Capítulo calidad (v2.0.0): intro de dos dimensiones (60/40) que declara que los outliers no bajan el score; tabla de scores Columna|Calidad|Completitud|Validez (sin Consistencia, n/a cuando no aplica); DOS tablas separadas (Problemas de calidad vs Observaciones analíticas); resumen con Unicidad de registro; glosario clicable de completitud, validez, unicidad de registro y calidad de datos. Verificado: 123 tests verdes (automatic_eda + render_automatic_eda + column_quality_score + summarize_table_duckdb + profile_table). Golden EDA de titanic (run_models+run_llm) con score recomputado a mano, outliers separados en observaciones y glosario clicable (5 links GOTO en el PDF). column_quality_score v2.0.0, summarize_table_duckdb v1.1.0, profile_table v1.1.0. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
7.9 KiB
7.9 KiB
name, kind, lang, domain, purity, version, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, tested, tests, test_file_path, file_path, params, output
| name | kind | lang | domain | purity | version | signature | description | tags | uses_functions | uses_types | returns | returns_optional | error_type | imports | tested | tests | test_file_path | file_path | params | output | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| profile_table | pipeline | py | pipelines | impure | 1.1.0 | def profile_table(db_path: str, table: str, backend: str = "duckdb", sample: int = 5000, run_models: bool = False, run_llm: bool = False, run_series: bool = False, emit_pdf: bool = False, emit_automatic: bool = False, report_dir: str = "reports", write_report: bool = True) -> dict | Orquestador one-shot del grupo de capacidad eda: perfila UNA tabla (DuckDB o PostgreSQL) end-to-end componiendo las funciones del grupo (perfil base SQL + muestreo read-only + inferencia semantica + promocion de tipo + estadistica numerica/categorica + score de calidad + correlaciones con correccion FDR + re-expresion de Tukey + avisos exploratorios) y, opcional, modelos baratos (run_models), interpretacion LLM (run_llm) y analisis de serie temporal por columna (run_series: estacionariedad ADF+KPSS, ACF/PACF, STL, retornos). Emite el TableProfile completo mas (opcional) report markdown + JSON sidecar + PDF movil (emit_pdf). Es la composicion canonica para hazme un EDA de esta tabla. |
|
|
false | error_go_core | true |
|
python/functions/pipelines/profile_table_test.py | python/functions/pipelines/profile_table.py |
|
dict {status:'ok', profile:<TableProfile enriquecido con quality_score, key_candidates, type_breakdown recalculado, correlaciones con FDR, reexpression por columna numerica, caveats, y (con run_series) series>, report_md_path:str|None, report_json_path:str|None, pdf_path:str|None, aeda_pdf_path:str|None, aeda_pptx_path:str|None, aeda_manifest_path:str|None (estos tres solo con emit_automatic)} o {status:'error', error:str} (dict-no-throw). |
Ejemplo
import os
from pipelines.profile_table import profile_table
# Tabla real: freelance_projects (35 filas) en la DuckDB del monitor de captacion.
db = os.path.expanduser("~/.fn_freelance/freelance.duckdb")
r = profile_table(db, "freelance_projects", sample=5000, write_report=False)
print(r["status"], r["profile"]["quality_score"], r["profile"]["type_breakdown"])
# ok 98.9 {'numeric': 1, 'categorical': 9, 'datetime': 2, 'text': 0, 'boolean': 1}
# ^ 'bids' (VARCHAR '1'..'107') se promociono a numeric via semantic_type=integer.
# Con report a disco (markdown + JSON sidecar en reports/):
r = profile_table(db, "freelance_projects")
print(r["report_md_path"], r["report_json_path"])
# reports/eda_freelance_projects_20260620-101500.md reports/eda_freelance_projects_20260620-101500.json
Cuando usarla
Cuando necesites un EDA completo de una tabla DuckDB en una sola llamada: perfil
por columna + estadistica fina + calidad + report listo para leer. Usala como
primer paso al recibir un dataset desconocido, antes de modelar o limpiar, o
para auditar la calidad de una tabla ya productiva. Reemplaza orquestar a mano
summarize_table_duckdb -> muestreo -> describe_numeric/summarize_categorical
-> column_quality_score -> render_eda_markdown columna por columna.
Gotchas
- Impura: con
write_report=True(default) ESCRIBE dos archivos areport_dir(markdown + JSON). Pasawrite_report=Falsepara un dry-run sin tocar disco. - La promocion de tipo es una HEURISTICA sobre la muestra: una columna VARCHAR se
reclasifica a
numericsolo si susemantic_typees integer/decimal/currency y al menos el 80% de la muestra parsea a float; adatetimesi elsemantic_typees datetime_iso/date_eu. Tablas con datos sucios o muestras no representativas pueden quedar mal clasificadas; subesamplepara muestras mas fiables (coste: mas filas traidas a RAM por columna). - Las columnas promovidas a
datetimeaun NO reciben perfil fino:col["datetime"]queda enNone(la funcionprofile_datetimedel grupo llega en otra fase). Susemantic_typesi se conserva. - El parseo numerico limpia simbolos de moneda (€/$/£/EUR/USD/GBP), espacios y separadores de miles; con coma y punto juntos asume punto=miles, coma=decimal. Formatos exoticos pueden descartarse silenciosamente del calculo numerico.
db_pathdebe existir: DuckDB read-only NO crea la base. El muestreo usa el sandbox por defecto deduckdb_query_readonly(sin acceso a FS/red).- Score de calidad (report 2046, desde v1.1.0). Paso 5: cada columna recibe
quality_scoredecolumn_quality_scorecon la formula 60/40 (completeness/validity); al promocionar texto a numero/fecha se exponecol["validity_rate"](parse rate de la muestra) para alimentar la dimension validity. Paso 6: el score de dataset NO es la media simple — es100 * (0.85*cell_quality + 0.15*row_uniqueness), dondecell_quality = media(score_col/100)yrow_uniqueness = 1 - duplicate_pct. Siduplicate_pctesNone(backend sin calcularlo) el score se renormaliza a solocell_quality. Los outliers NO bajan el score (van aobservations).