837563c3ba
Datascience: aggregate_by_group, deduplicate_entities/relations, detect_drift, diff_entities/relations, extract_entities/relations_llm, hotness_score, melt, merge_graphs, pivot, build_entity/relation_schema_prompt. Finance: avellaneda_stoikov_quotes, generate_gbm_prices, generate_taker_order, hawkes_intensity + módulo finance.py. Cybersecurity: envelope_encrypt/decrypt + módulo cybersecurity.py. Pipelines: extraction_pipeline, monte_carlo_market, run_market_sim. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
41 lines
1.3 KiB
Python
41 lines
1.3 KiB
Python
"""Melt (unpivot) para datos tabulares list[dict]."""
|
|
|
|
|
|
def melt(
|
|
rows: list[dict],
|
|
id_vars: list[str],
|
|
value_vars: list[str] | None = None,
|
|
var_name: str = "variable",
|
|
value_name: str = "value",
|
|
) -> list[dict]:
|
|
"""Convierte columnas en filas (formato largo). Inversa de pivot.
|
|
|
|
Cada combinacion de id_vars + value_var genera una fila nueva.
|
|
Si value_vars es None, se usan todas las columnas que no esten en id_vars.
|
|
|
|
Args:
|
|
rows: Lista de dicts en formato ancho.
|
|
id_vars: Columnas que se mantienen como identificadores en cada fila.
|
|
value_vars: Columnas a convertir en filas. None = todas las no-id.
|
|
var_name: Nombre de la columna que contendra los nombres de variables.
|
|
value_name: Nombre de la columna que contendra los valores.
|
|
|
|
Returns:
|
|
Lista de dicts en formato largo con una fila por combinacion id+variable.
|
|
"""
|
|
result = []
|
|
for row in rows:
|
|
# Determinar que columnas derretir
|
|
if value_vars is None:
|
|
vars_to_melt = [k for k in row if k not in id_vars]
|
|
else:
|
|
vars_to_melt = value_vars
|
|
|
|
for var in vars_to_melt:
|
|
new_row: dict = {k: row.get(k) for k in id_vars}
|
|
new_row[var_name] = var
|
|
new_row[value_name] = row.get(var)
|
|
result.append(new_row)
|
|
|
|
return result
|