Introducción
Data Analysis Expressions (DAX) incluye la importante funcionalidad de Time Intelligence o inteligencia de tiempo, funciones integradas en el lenguaje con las que podemos manipular y agregar datos en función de periodos temporales para construir y comparar cálculos sobre dichos periodos. Este tipo de análisis de series temporales es esencial en cualquier modelo de datos.
Aunque Time Intelligence es un tema muy amplio al que dedicaremos varios artículos, en este vamos a centrarnos en uno de los intereses principales del estudio de las series temporales, que reside en la evaluación de los cambios de una magnitud a lo largo del tiempo. Estos cambios se valoran a través de las denominadas tasas de variación,que surgen de la comparación de los valores de la serie en dos periodos de tiempo distintos.
Para ello, vamos a usar la función DATEADD()
, sin duda una de las funciones de inteligencia de tiempo más versátiles a la hora de generar comparaciones temporales a lo largo de un conjunto de diferentes periodos de tiempo. Su sintaxis es muy sencilla:
DATEADD( fechas ; nº de intervalos ; intervalo )
En el primer parámetro introducimos la clave principal de nuestra tabla de fechas; en el segundo, el número de días, meses, trimestres o años a añadir o substraer del contexto de filtro (si es positivo las fechas del contexto de evaluación de la visualización correspondiente se moverán hacia delante en el tiempo y si es negativo hacia atrás) y en el tercero, el tipo de intervalo. Por ejemplo, para calcular las ventas del mes anterior:
VentasMesAnterior =
CALCULATE ( [Ventas]; DATEADD ( Calendario[Fecha]; -1; MONTH ) )
Y como podemos ver en la siguiente imagen, el filtro de contexto bajo el que CALCULATE
evalúa el parámetro de expresión, en este caso [Ventas], corresponde a las fechas correspondientes al periodo del mes anterior al de dicho contexto:
De esta manera, la función DATEADD()
trabaja de forma dinámica con el periodo del filtro de contexto presente en la visualización, de forma que si estamos mirando datos a un nivel de granularidad diaria, la fórmula anterior devolverá el importe de las ventas del mismo día del mes anterior:
Es esta versatilidad la que nos permitirá calcular de forma rápida y sencilla tasas de variación referidas a multitud de periodos de tiempo distintos.
Variación absoluta
La variación absoluta de una serie temporal (también llamada incremento) es la diferencia entre dos valores de la serie. Por ejemplo, la variación absoluta de la magnitud con respecto al periodo anterior es:
Que en DAX lo podemos expresar así:
DiferenciaVentas =
[Ventas] – [VentasMesAnterior]
Y obtendremos la diferencia entre los dos periodos, al nivel de granularidad que queramos:
Variación relativa
Las variaciones relativas de una serie temporal denominadas también tasas o tantos, son el cociente entre una variación absoluta y una medida del tamaño de la serie. A veces se multiplican por 100 para describirlas como porcentajes. La más conocida es la denominada «crecimientos básicos» de una serie temporal:
Los crecimientos básicos resultan de dividir el incremento de la serie entre el valor anterior de la misma, lo que da al incremento un marco de referencia. En DAX:
DiferenciaVentas% =
DIVIDE (( [Ventas] – [VentasMesAnterior] ); [VentasMesAnterior] )
¿Existen alternativas a las funciones de inteligencia de tiempo?
En realidad, todas las funciones de inteligencia de tiempo pueden ser reescritas usando código DAX genérico, utilizando principalmente las funciones CALCULATE()
, FILTER()
, VALUES()
y ALL()
. Las funciones integradas de inteligencia de tiempo solo nos facilitan el trabajo al simplificar la realización de este tipo de cálculos. El inconveniente de usar dichas funciones es que nuestros modelos de datos deben ceñirse a un conjunto de reglas, como que el calendario debe ser estándar, no pudiendo usar estas funciones con calendarios especiales de granularidad semanal como por ejemplo el calendario 4-4-5 o, la imposibilidad de usar conexiones a orígenes de datos mediante Direct Query.
Cabe señalar que si bien la complejidad del código aumenta notablemente, el uso de funciones DAX corrientes para realizar nuestros cálculos basados en escalas de tiempo nos permite especificar cualquier granularidad para cualquier lapso temporal (desde segundos hasta décadas). Por ejemplo, para calcular las ventas del mes anterior sin depender de las funciones de inteligencia de tiempo integradas en DAX tendríamos que hacer lo siguiente:
VentasMesAnterior DAX =
SUMX (
VALUES ( Calendario[AñoMesNumero] );
IF (
CALCULATE ( COUNTROWS ( VALUES ( Calendario[Fecha] ) ) )
= CALCULATE ( VALUES ( Calendario[DiasEnElMes] ) );
CALCULATE (
[Ventas];
ALL ( Calendario );
FILTER (
ALL ( Calendario[AñoMesNumero] );
Calendario[AñoMesNumero]
= EARLIER ( Calendario[AñoMesNumero] ) – 1
)
);
CALCULATE (
[Ventas];
ALL ( Calendario );
CALCULATETABLE ( VALUES ( Calendario[AñoMesNumero] ) );
FILTER (
ALL ( Calendario[AñoMesNumero] );
Calendario[AñoMesNumero]
= EARLIER ( Calendario[AñoMesNumero] ) – 1
)
)
)
)
Y obtendríamos el mismo resultado que usando la función DATEADD()
:
Todo el código DAX de este artículo ha sido formateado con «DAX Formatter»
Deja un comentario