Si compartimos, crecemos todos 😎
Este es un canal de formación técnica en análisis de datos e inteligencia artificial, pensado para ayudarte a desarrollar las habilidades, herramientas y el criterio que hoy necesita un profesional de datos.

Acá hablamos de Power BI, IA, automatización y buenas prácticas, siempre con foco en lo importante: convertir datos en decisiones reales 📊🚀
Porque los datos solos no dicen nada… hasta que alguien sabe interpretarlos.

Encontrás tips, trucos y técnicas aplicadas, explicadas de forma clara y directa, tanto si estás empezando como si querés llevar tu análisis un paso más allá.

Este espacio también es comunidad: aprender juntos, compartir lo que sabemos y crecer en el proceso 💡
Si querés sacarle el máximo provecho a Power BI, al análisis de datos y a la IA aplicada, este es tu lugar 🔥

Sumate y crecemos juntos. 😎


Yanina Ariadna

💸 ¿Cómo repartís los gastos en una juntada con amigos?

Antes usábamos una app.... Después… se volvió paga 😒
Entonces probamos con GPT y Gemini.…alucinan un montón. Una te dice que Fulanito le debe a Mengano, otra te arma 25 transferencias de $37,42 🤯
y vos solo querías cerrar la cuenta y disfrutar el asado.

Entonces pasa lo de siempre:
🍕 viaje con amigos
🍻 alguien paga más
💳 otros pagan menos
📱 nadie quiere hacer cuentas
😬 y aparecen los “después te transfiero”

¿Y si lo automatizamos con Excel + Power Query? 👀

La idea es simple:

1️⃣ Ponés los nombres de los participantes
2️⃣ Ponés cuánto pagó cada uno
3️⃣ Listo.

Power Query hace el resto:

✔️ calcula el gasto total
✔️ saca el promedio por persona
✔️ detecta quién tiene saldo a favor y quién debe
✔️ arma la repartija perfecta
✔️ con la menor cantidad posible de transferencias
✔️ fragmentando pagos solo cuando hace falta
✔️ y cerrando todo exacto en cero

Resultado:
👉 menos movimientos
👉 menos “micro transferencias”
👉 menos discusiones
👉 más amigos 😅

Lo mejor de todo

📌 Está hecho 100% en Power Query (código M)
📌 Corre en Excel o Power BI
📌 Es reproducible, auditable y automático
📌 No dependés de apps externas
📌 Y lo podés adaptar a cualquier grupo, viaje o evento

Si te interesa el código M completo, lo dejo en los comentarios 👇
y si querés que lo arme paso a paso, también.

Porque sí:
👉 hasta repartir una juntada puede ser un problema de datos 😎
👉 y los datos, bien modelados, siempre ordenan el caos.

#PowerQuery #Excel #Automatización #DatosEnLaVidaReal #BusinessIntelligence #DataLife #ETL #AprenderDatos


let
// Código Yanina Ariadna y Gemini para distribución de gastos juntadas
// 1. Carga y Limpieza
Source = Excel.CurrentWorkbook(){[Name="Tabla1"]}[Content],
FixTypes = Table.TransformColumnTypes(Source, {{"Nombre", type text}, {"Gastado", type number}}),
DataClean = Table.ReplaceValue(FixTypes, null, 0, Replacer.ReplaceValue, {"Gastado"}),

// 2. Cálculos Base (Promedio y Saldo)
TotalGastado = List.Sum(DataClean[Gastado]),
CantPersonas = Table.RowCount(DataClean),
PromedioValor = Number.Round(TotalGastado / CantPersonas, 2),

AddInfo = Table.AddColumn(DataClean, "Gasto promedio", each PromedioValor, type number),
AddSaldo = Table.AddColumn(AddInfo, "Saldo", each Number.Round([Gastado] - PromedioValor, 2), type number),
AddEstado = Table.AddColumn(AddSaldo, "Estado", each
if [Saldo] > 0 then "Recibe plata"
else if [Saldo] < 0 then "Paga"
else "Al día", type text),

// 3. Ordenar por quien gastó más
SortedData = Table.Sort(AddEstado, {{"Gastado", Order.Descending}}),

// 4. Lógica de Compensación (Cálculo interno)
Deudores = Table.Buffer(Table.Sort(Table.SelectRows(SortedData, each [Saldo] < 0), {{"Saldo", Order.Ascending}})),
Acreedores = Table.Buffer(Table.Sort(Table.SelectRows(SortedData, each [Saldo] > 0), {{"Saldo", Order.Descending}})),

FnAddRanges = (tbl as table, isNegative as logical) =>
let
Idx = Table.AddIndexColumn(tbl, "Idx", 1, 1),
Hasta = Table.AddColumn(Idx, "Hasta", each
let v = List.Sum(List.FirstN(Idx[Saldo], [Idx])) in Number.Round(if isNegative then Number.Abs(v) else v, 2)),
Desde = Table.AddColumn(Hasta, "Desde", each Number.Round([Hasta] - Number.Abs([Saldo]), 2))
in Desde,

RangoD = FnAddRanges(Deudores, true),
RangoA = FnAddRanges(Acreedores, false),

// 5. Cruce de deudas
Cross = Table.AddColumn(RangoD, "A", each RangoA),
ExpandA = Table.ExpandTableColumn(Cross, "A", {"Nombre", "Desde", "Hasta"}, {"Acreedor", "A.Desde", "A.Hasta"}),
CalcMonto = Table.AddColumn(ExpandA, "Monto", each
let
MaxD = List.Max({[Desde], [A.Desde]}),
MinH = List.Min({[Hasta], [A.Hasta]}),
Dif = Number.Round(MinH - MaxD, 2)
in if Dif > 0 then Dif else 0),

// 6. Agrupación para formato horizontal
GroupPagos = Table.Group(Table.SelectRows(CalcMonto, each [Monto] > 0), {"Nombre"}, {
{"Pagos", each
let
Tbl = Table.AddIndexColumn(_, "No", 1, 1),
Recs = Table.TransformRows(Tbl, (r) =>
Record.FromList({r[Acreedor], r[Monto]}, {"Pagar a " & Text.From(r[No]), "Monto " & Text.From(r[No])}))
in Record.Combine(Recs)}
}),

// 7. Unión y Expansión
JoinFinal = Table.NestedJoin(SortedData, {"Nombre"}, GroupPagos, {"Nombre"}, "T", JoinKind.LeftOuter),
ExpandFinal = Table.ExpandTableColumn(JoinFinal, "T", {"Pagos"}),
ColsExpandir = List.Distinct(List.Combine(List.Transform(List.RemoveNulls(ExpandFinal[Pagos]), each Record.FieldNames(_)))),
FinalSinTipar = Table.ExpandRecordColumn(ExpandFinal, "Pagos", ColsExpandir),

// 8. ASIGNACIÓN DINÁMICA DE TIPOS
ListTipos = List.Transform(ColsExpandir, each
if Text.StartsWith(_, "Pagar a") then {_, type text}
else if Text.StartsWith(_, "Monto") then {_, type number}
else {_, type any}
),
Resultado = Table.TransformColumnTypes(FinalSinTipar, ListTipos)
in
Resultado

2 weeks ago | [YT] | 13

Yanina Ariadna

⏱️ ¿Sabías que en Power BI no todo es dimensión calendario?

En esta charla con Clara Vega Caballero hablamos de horas, minutos y segundos, errores típicos y cómo trabajar correctamente el tiempo usando Power Query y DAX.

👉 Mirá la charla completa acá:
youtube.com/live/tv0vWwH4wo8?t=3620s

2 weeks ago | [YT] | 3