Files
fn_registry/python/functions/datascience/generate_synthetic_eda_folder.md
T
egutierrez ea6678ec23 feat(eda): generadores de datasets sintéticos Faker que ejercitan el AutomaticEDA
Añade dos funciones impuras dict-no-throw, deterministas por seed, al dominio
datascience (grupo eda):

- generate_synthetic_eda_table: una tabla DuckDB de 19 columnas (numéricas
  correlacionadas + outliers, categóricas desbalanceadas, texto largo
  multi-idioma es/en/fr, fecha DATE, lat/lon válidas, PII email/iban/phone/uuid,
  nulos con patrón MCAR/MAR co-ocurrentes). Activa 14 capítulos del motor
  AutomaticEDA (num_distr, cat_distr, text_distr, calidad, missingness,
  correlacion, relaciones, modelos, timeseries, geospatial, agregacion,
  glosario + portada/overview).
- generate_synthetic_eda_folder: 3 CSV relacionados (customers/orders/reviews)
  con FK customer detectable por containment, para el EDA de carpeta multi-tabla.

Determinismo via Faker.seed_instance + numpy.default_rng. Tests: 16 passed
(incluye determinismo por hash, rangos lat/lon, co-nulos income/spending,
mediana palabras review >=20, phone formato internacional, FK containment).

Añade faker (40.27.0) a python/pyproject.toml + uv.lock.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 21:25:31 +02:00

4.8 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
generate_synthetic_eda_folder function py datascience 1.0.0 impure def generate_synthetic_eda_folder(out_dir: str, n_rows: int = 2000, seed: int = 42) -> dict Genera una carpeta con 3 CSV RELACIONADOS (customers, orders, reviews) deterministas por seed (Faker + numpy) para ejercitar el motor AutomaticEDA multi-tabla / profile_database. orders.customer_id y reviews.customer_id estan contenidos al 100% en customers.customer_id (PK uuid), de modo que la deteccion FK por containment (min_inclusion=0.9) descubre ambas relaciones. customers es la tabla padre; reutiliza helpers de generate_synthetic_eda_table (texto multi-idioma, lat/lon validas, amount con outliers). Estilo dict-no-throw: nunca lanza.
eda
synthetic
faker
testing
fixture
datascience
name desc
out_dir Carpeta de salida. Se crea con mkdir -p si no existe. Recibe customers.csv, orders.csv y reviews.csv.
name desc
n_rows Numero de clientes (filas de customers). orders ~= 2*n_rows filas, reviews ~= n_rows filas. Default 2000.
name desc
seed Semilla para Faker (Faker.seed) y numpy (np.random.default_rng). Mismo seed -> CSVs identicos byte a byte. Default 42.
dict dict-no-throw. En exito {status:'ok', out_dir, files:{customers,orders,reviews}, n_customers, n_orders, n_reviews, expected_relations:[{from_table,from_col,to_table,to_col}, ...], seed}. En error (sin lanzar, p.ej. n_rows<=0) {status:'error', error:str}. expected_relations declara las 2 FK orders->customers y reviews->customers (ambas por customer_id).
false error_go_core
true
test_genera_ok_y_archivos
test_determinismo_mismo_seed
test_seeds_distintos_difieren
test_fk_containment
test_review_text_mediana_palabras
test_n_rows_invalido
python/functions/datascience/generate_synthetic_eda_folder_test.py python/functions/datascience/generate_synthetic_eda_folder.py

Ejemplo

# Genera /tmp/eda_folder/{customers,orders,reviews}.csv (300 customers, seed 42)
fn run generate_synthetic_eda_folder /tmp/eda_folder 300 42
import sys, os
sys.path.insert(0, os.path.join("python", "functions"))
from datascience import generate_synthetic_eda_folder

res = generate_synthetic_eda_folder("/tmp/eda_folder", n_rows=300, seed=42)
# res["files"] -> {"customers": ".../customers.csv", "orders": ..., "reviews": ...}
# res["expected_relations"] -> orders.customer_id y reviews.customer_id -> customers.customer_id
# Luego perfila la carpeta/base con el grupo eda:
#   fn run profile_database /tmp/eda_folder

Cuando usarla

  • Cuando necesites un fixture REPRODUCIBLE multi-tabla para evaluar el EDA de carpeta/base (profile_database, join graph, capitulo de relaciones inter-tabla) con relaciones FK reales y detectables.
  • Cuando escribas tests de la deteccion de claves foraneas por containment: orders y reviews referencian customer_id contenido al 100% en customers (inclusion 1.0 >= min_inclusion 0.9).
  • Como contraparte multi-tabla de generate_synthetic_eda_table (que cubre el EDA de UNA tabla).

Gotchas

  • Impura: escribe 3 CSV a disco (mkdir -p de la carpeta). Sobrescribe los CSV existentes con el mismo nombre.
  • Requiere faker, numpy y pandas en el venv. Sin faker devuelve {status:'error'} (no lanza).
  • El containment depende del orden: customers se genera PRIMERO y orders/reviews muestrean sus customer_id. Si se invierte el orden, la FK deja de estar contenida y el detector no la encuentra.
  • signup_date/ts se escriben como texto ISO en el CSV (YYYY-MM-DD / YYYY-MM-DD HH:MM:SS): es CSV, todo es texto; el profiler los promociona a datetime al leerlos.
  • Determinismo dependiente del orden de llamadas: se siembra Faker.seed(seed) + np.random.default_rng(seed) al inicio; mismo seed -> CSVs identicos byte a byte.
  • Reutiliza helpers privados de generate_synthetic_eda_table (_make_fakers, _make_latlon, _make_reviews, _amount_with_outliers): no romper esas firmas sin actualizar esta funcion.

Notas

Estructura generada:

Archivo PK FK Columnas clave
customers.csv customer_id (uuid) name, country, signup_date, latitude, longitude, email
orders.csv order_id (uuid) customer_id -> customers amount (lognormal + outliers), category, ts
reviews.csv review_id (uuid) customer_id -> customers review_text (multi-idioma, mediana palabras>=20), rating (1..5)

orders tiene ~2x filas que customers y reviews ~1x. Todos los customer_id de orders y reviews estan contenidos en customers (containment ⊆), por lo que la deteccion FK por inclusion descubre las dos relaciones declaradas en expected_relations.