--- name: aggregate_by_group kind: function lang: py domain: datascience version: "1.0.0" purity: pure signature: "def aggregate_by_group(rows: list[dict], group_by: list[str], aggs: dict[str, str]) -> list[dict]" description: "GROUP BY + agregaciones sobre datos tabulares. aggs es un dict de columna a funcion (sum, mean, count, min, max, first, last, collect). collect acumula valores en lista. None se ignora en agregaciones numericas." tags: [datascience, tabular, groupby, aggregate, transform, python, pendiente-usar, transformer] uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "" imports: ["collections"] params: - name: rows desc: "lista de dicts donde cada dict representa una fila (ej: [{'dept': 'eng', 'salary': 100}, ...])" - name: group_by desc: "lista de nombres de columnas para agrupar (ej: ['dept']). Pueden ser multiples columnas." - name: aggs desc: "dict de columna -> funcion de agregacion (ej: {'salary': 'mean'}). Soporta: sum, mean, count, min, max, first, last, collect" output: "lista de dicts donde cada dict es un grupo con sus resultados de agregacion" tested: true tests: - "Group by una columna con sum" - "Group by multiples columnas" - "Agregacion mean count min max" - "collect acumula en lista" - "Grupo con una sola fila" - "Campo con None se ignora en agregaciones numericas" test_file_path: "python/functions/datascience/aggregate_by_group_test.py" file_path: "python/functions/datascience/aggregate_by_group.py" --- ## Ejemplo ```python rows = [ {"dept": "eng", "salary": 100}, {"dept": "eng", "salary": 120}, {"dept": "sales", "salary": 80}, ] aggregate_by_group(rows, group_by=["dept"], aggs={"salary": "mean"}) # [{"dept": "eng", "salary": 110.0}, {"dept": "sales", "salary": 80.0}] ``` ## Notas Funcion pura sin dependencias externas (solo collections.defaultdict de stdlib). Preserva el orden de primera aparicion de cada grupo. La funcion 'collect' no filtra None — acumula todos los valores incluyendo None.