martes, 8 de marzo de 2022

LAMBDA: Promedio de ponderaciones

Expondré hoy un cálculo elaborado empleando LAMBDA que nos permite conocer la media aritmética (por cada fila) de las ponderaciones de cada elemento sobre el acumulado de su propia columna... eligiendo un intervalo de columnas!!.
LAMBDA: Promedio de ponderaciones


Permitemé ver qué estamos viendo en la imagen anterior... con una fórmula personalizada con LAMBDA:
en I2: =fxMediaPesos($B$2:$G$7;2;5)
hemos trabajado con los datos de la columna 2 a la 5 sobre nuestra matriz de datos B2:G7, esto es, trabajamos con importes desde febrero hasta mayo.
Nuestra fórmula ha sido capaz de recuperar solo las columnas involucradas, obtener el acumulado de cada columna individualmente, y obtener, por tanto el porcentaje que representa el peso/ponderación de cada elemento de nuestra matriz indicada...
No solo eso, además, sobre el resultado de esa matriz de ponderaciones, ha realizado un cálculo por filas para obtener el promedio de los pesos de cada fila o color!!.

Igual piensas que esto no sirve para nada... pero te sorprenderá saber que es la solución a un caso real planteado por un cliente para determinar tendencias/evoluciones sobre unas ventas :OOO

Detallemos nuestra función... (en realidad dos funciones).
Nuestras dos funciones LAMBDA agregadas en el Administrador de nombres son:
fxMediaPesos =LAMBDA(matriz;ci;cf;BYROW(fxPorcINDEX(matriz;ci;cf);LAMBDA(nFila;PROMEDIO(nFila))))
esta será nuestra función final, basada en el resultado de otra función LAMBDA:
fxPorcINDEX =LAMBDA(arr;ci;cf; LET(eltos;INDICE(arr;SECUENCIA(6);SECUENCIA(1;cf-ci+1;ci;1)); totales;BYCOL(eltos;LAMBDA(col;SUMA(col))); eltos/totales))
función que se encarga de devolver la matriz con los pesos/ponderaciones del intervalo de meses elegidos...


Veamos los pasos seguidos...
LAMBDA: Promedio de ponderaciones

En el primer paso nuestra fórmula es sencilla...
En K2 creamos una sencilla función LAMBDA con tres argumentos que alimentarán nuestra función INDICE matricial.
=LAMBDA(arr;ci;cf;INDICE(arr;SECUENCIA(6);SECUENCIA(1;cf-ci+1;ci;1)))($B$2:$G$7;2;5)
el resultado es otra matriz creada a partir de la original que solo retorna ciertas columnas indicadas en los argumentos de LAMBDA.

En el segundo paso necesitamos calcular la suma de cada columna de la matriz anterior... usaremos la funcion BYCOL.
Así en K9 vemos el resultado:
=LAMBDA(arr;ci;cf;BYCOL(INDICE(arr;SECUENCIA(6);SECUENCIA(1;cf-ci+1;ci;1));LAMBDA(col;SUMA(col))))($B$2:$G$7;2;5)
Comprobamos el vector de sumas acumuladas calculado...

Paso tercero. Obvio... si tenemos los elementos por un lado y el acumulado por columnas por otro, dividimos ;-)
En K13 añadimos:
=LAMBDA(arr;ci;cf;
LET(eltos;INDICE(arr;SECUENCIA(6);SECUENCIA(1;cf-ci+1;ci;1));
totales;BYCOL(eltos;LAMBDA(col;SUMA(col)));
eltos/totales))($B$2:$G$7;2;5)

El resultado es una matriz de pesos o ponderaciones!!

Último paso. Dos posibles finales...
Fin A: Acabamos con una función BYROW directamente sobre los resultador anteriores
En K21:
=BYROW(LAMBDA(arr;ci;cf;
LET(eltos;INDICE(arr;SECUENCIA(6);SECUENCIA(1;cf-ci+1;ci;1));
totales;BYCOL(eltos;LAMBDA(col;SUMA(col)));
eltos/totales))($B$2:$G$7;2;5);LAMBDA(nFila;PROMEDIO(nFila)))
la función BYROW se encarga de calcular el promedio de cada fila...

Fin B (mi elección): Terminamos con una función LAMBDA que directamente permite alimentar nuestros tres argumentos...
En N21 añadimos:
=LAMBDA(matriz;ci;cf;BYROW(fxPorcINDEX(matriz;ci;cf);LAMBDA(nFila;PROMEDIO(nFila))))($B$2:$G$7;2;5)
función que luego trasladaremos al Administrador de nombres, y llamaré fxMediaPesos...

A parte de lo 'raro' del cálculo, me parece interesante cómo los argumentos de LAMBDA se transmiten de un nivel a otro inferior..
Fíjate como la función 'fxPorcINDEX' se alimenta con los parámetros cargados en la función LAMBDA principal...
Brutal sin duda.

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.