jueves, 21 de octubre de 2021

Power Pivot: diferencia con dato previo con condición

En la entrada del blog anterior vimos cómo obtener la diferencia con el dato previo, teniendo en cuenta un criterio temporal y una condición adicional (por ejemplo de país) usando Power Query... donde se comentó la lentitud de ejecución para un número elevado de filas...
Un estándar en el uso de Power Query.

Y es aquí donde, además de otros motivos, aparece Power Pivot, donde demuestra su potencia de procesamiento...
En esta entrada replicaremos con lenguaje DAX el cálculo necesario para obtener la diferencia con el dato anterior, cumpliendo los requisitos temporales y de País definidos.
Power Pivot: diferencia con dato previo con condición


Tenemos al menos dos alternativas de inicio.
Primera: Realizar la carga de la tabla de datos origen a través de Power Query, y de paso, en el proceso añadirle una columna de Índice.
Segunda: Cargar directamente la tabla origen a Power Pivot y agregar una columna calculada que replique un Índice.

Veamos primero cuál sería el proceso si hacemos la carga en el Modelo de datos a través de Power Query.
Cargamos nuestra tabla origen en el editor de Power Query, donde agregremos una columna de Índice.
Power Pivot: diferencia con dato previo con condición

Con el Índice agregado procedemos a Cargar y Cerrar la consulta, añadiéndola al Modelo de datos.

Accederemos ahora al modelo de datos de Power Pivot en Excel, donde insertaremos la siguiente columna calculada:
= VAR FilaAnterior=TblDATOS_PP[Índice]-1
VAR LOC=TblDATOS_PP[País]
VAR DatoPrevio=
    CALCULATE (
            VALUES (   TblDATOS_PP[Importe]   );
            FILTER ( ALL ( TblDATOS_PP); (TblDATOS_PP[País]=LOC)  && VALUE(TblDATOS_PP[Índice]) = VALUE(FilaAnterior ))
        )
 VAR DatoCorriente = TblDATOS_PP[Importe]
 VAR Calc =  IF(DatoPrevio ;DatoCorriente-DatoPrevio;0)
RETURN
Calc

Power Pivot: diferencia con dato previo con condición


Nuestra fórmula DAX nos ayuda mediante el uso de variables a construir o recuperar los datos necesarios para el cálculo de la diferencia buscada.
VAR FilaAnterior=TblDATOS_PP[Índice]-1
devolvería el dato de la columna Índice de cada fila, restándole 1.

VAR LOC=TblDATOS_PP[País]
el dato de la columna País de la fila... VAR DatoPrevio= CALCULATE ( VALUES ( TblDATOS_PP[Importe] ); FILTER ( ALL ( TblDATOS_PP); (TblDATOS_PP[País]=LOC) && VALUE(TblDATOS_PP[Índice]) = VALUE(FilaAnterior )) )
en este caso recuperamos el dato de la columna 'Importe' cuando se cumpla la doble condición:
- el dato de la fila actual coincida con el País definido en la variable previa
- y además se cumpla que el dato de la columna Índice sea el mismo que el de la variable 'FilaAnterior'.

La siguiente variable VAR DatoCorriente = TblDATOS_PP[Importe]
recupera el 'Importe' de la fila corriente...

El resto es fácil de interpretar, tenemos el 'Importe' actual y el 'Importe' previo... así que solo nos queda restar uno al otro.

En el siguiente método cargamos o añadimos directamente la tabla fuente al modelo de datos.
Al acceder al modelo de datos podemos añadir una nueva columna calculada que replique el Índice, incorporando la fórmula DAX:
=RANKX(ALL(TblDATOS_PP);
		TblDATOS_PP[País] & VALUE(TblDATOS_PP[Fecha])
		;;ASC;Dense)-1

Power Pivot: diferencia con dato previo con condición


Notemos el uso de la doble condición país+fecha que hacemos en RANKX, y cómo debemos 'convertir' en valor la Fecha para que proceda con el orden adecuado...

Con el índice obtenido mediante DAX, podríamos aplicar la misma fórmula descrita anteriormente... completando el cálculo deseado.

No hay comentarios:

Publicar un comentario

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