Hace poco, me preguntaba un seguidor del blog sobre un calculo en una tabla dinámica, y se me ocurrio que era hora de hablar entre la diferencia de usar una metrica vs una columna calculada en Power Pivot.
A pesar de que hay mucha discusión, artículos y videos sobre el tema de Métricas DAX y columnas calculadas, hay mucha gente que tiene la duda respecto a qué hace diferente a una de la otra; en qué situación deberían usarse; o cuál es la diferencia entre crear una columna en Excel o en Power Query. Y si bien podríamos cubrir eso en otra ocasión, hoy vamos a explicar cuál es la diferencia entre columnas calculadas DAX y métricas.
Para ser más claros en el tema, estas son las preguntas que vamos a abordar:
- ¿Qué es una columna calculada?
- ¿Qué es una métrica?
- ¿Cuándo debería escribir una columna calculada o una métrica?
- ¿Cuál es su diferencia en desempeño?
- ¿Cuáles son las operaciones que no puedo hacer con estas dos?
Y claro, otras preguntas respecto a las diferencias que existen entre estos dos tipos de cálculos en DAX.
¿QUÉ ES UNA COLUMNA CALCULADA?
Para entender la diferencia entre estos dos tipos de cálculo necesitamos entender cómo es que cada una funciona. Las columnas calculadas son columnas como cualquier otra dentro de una tabla, con la diferencia de que el resultado de la columna calculada se obtiene de calcular una expresión (DAX). Usualmente, la columna calculada apalanca una expresión DAX que se aplica a cada fila en un conjunto de datos, y el resultado de eso se almacenará en la nueva columna.
Un ejemplo de esto es tener una ganancia como columna calculada.
Consideremos una tabla que tiene información de costos y ventas en ella. Calcular las ganancias en dicha tabla sería tan simple como deducir costos de las ventas por cada fila, por lo tanto esto sería una columna calculada.
La expresión usada para obtener la columna calculada es la siguiente:
Profit = Table1[Unit Price]-Table1[Unit Cost]
Contexto de fila
Ahora tenemos uno de los conceptos más importantes sobre cálculo que aplicamos a una columna calculada (aunque esto no aplica en contadas ocasiones), y es el cálculo en una fila a la vez o en otras palabras: cálculo fila por fila. En la tabla de abajo podemos ver el resultado de calcular para cada fila almacenada en la nueva columna.
Cálculo fila por fila es llamado «contexto de fila» en términos DAX.
Las columnas calculadas guardan valores en la memoria, tal y como cualquier otra columna. El cálculo sucede a la hora de actualizar, y el resultado es guardado en la memoria.
Esto significa que entre más memoria calculada tengamos, más consumo de memoria tendremos, y el tiempo para actualizar será más largo como resultado. Aun así, la mayoría de cálculos son muy simples, por lo cual este tiempo de actualización puede que no se vea afectado de manera drástica.
Basado en todo lo que hemos dicho hasta ahora, podemos destacar de las columnas calculadas lo siguiente:
- Cálculo fila por fila: contexto de fila (no siempre, pero sí por lo regular)
- Almacenado en la memoria (consume RAM)
- Calculado al momento de actualizar el reporte (ya sea programado o manual)
¿QUÉ ES UNA MÉTRICA?
Las métricas tienen una naturaleza dinámica y afectan a un subconjunto de datos de una o más tablas. Por lo tanto, el subconjunto de datos puede ser cambiado a través de filtros aplicados en el reporte, luego el cálculo tendrá que ser evaluado de manera dinámica.
Con esto, podemos concluir que las métricas no son pre-calculadas y el cálculo se hará sobre la marcha cuando lo añadamos en el reporte.
Para mostrarlo mejor, usaremos un caso simple de suma de unidades. Como las métricas son usualmente agregaciones, nos servirá bien de ejemplo.
Metricas calculadas.
La agregación puede ser hecha con un número de funciones en DAX, tales como Sum, SumX, Promedio, Calcular y otro montón de funciones de agregación. Ahora veamos la pregunta más importante: «¿Cómo ver el valor de una métrica?»
Como ya dijimos, las métricas son calculadas sobre la marcha, y esto es una de sus principales diferencias conceptuales con respecto a las columnas calculadas, pero siendo que las métricas se calculan al momento, ¿entonces cómo podemos ver el valor? Y la respuesta es poniéndolo en un reporte.
Si arrastramos la métrica de arriba en un reporte de tabla dinámica, obtendremos esto:
Cuando no hay un filtro aplicado en el reporte, esto nos regresaría el gran total de unidades, que en este caso es 249,980,949. Pero si le añadimos un separador al reporte, veremos un resultado diferente:
Ahora el cálculo de la métrica me muestra la suma de unidades para cada importancia.
Si hay un separador de valor para el año, entonces el cálculo será hecho en el subconjunto de datos que corresponde a ese año. Si hay un valor en las filas/columnas que separe datos, el resultado de la métrica tomará eso en cuenta también.
Contexto de Filtro
Con todo esto, podemos decir que las métricas evalúan el valor basado en un subconjunto de datos seleccionado por filtros, separadores o cortando componentes de visuales en el reporte. Este conjunto de datos filtrado, será llamado «Contexto de Filtro».
El contexto de filtro es básicamente una combinación de todos los filtros que afectan el cálculo de una métrica. Aunque hay mucho más que se puede hablar respecto al contexto de filtro, esto debería darnos una buena idea básica que nos servirá para el resto de esta entrada.
Debido a que el cálculo de métricas se realiza sobre la marcha, queda implícito que no hay valores que sean almacenados en la memoria. Por lo tanto, las métricas no consumirán memoria o RAM en lo absoluto; por otro lado, las métricas consumen CPU ya que sus cálculos tienen que ser realizados a la vez que son visualizados. Si queremos cambiar un filtro o un separador, los cálculos deberán ser hechos de nuevo. Dado que el tiempo de respuesta debe ser rápido, este cálculo sucede gracias al CPU.
Si tenemos muchas métricas en nuestro reporte y los cálculos a realizar son complejos, entonces al cambiar filtros o separadores terminaremos con un CPU que trabaja a toda capacidad para calcular los valores, lo cual alentará nuestro equipo.
Así pues, y con base en todo lo que vimos anteriormente, podemos destacar de las métricas que:
- Calculan en base a todos los filtros (filtro de contexto)
- No son almacenados y no son pre-calculados
- Son calculados sobre la marcha cuando lo ponemos en una página de reporte al cambiar el separador, filtro, o damos click en una tabla de columna o algún otro visual a resaltar y afecta el valor de la métrica
- Consume CPU para calcular
¿CUÁNDO DEBERÍA ESCRIBIR UNA COLUMNA CALCULADA O UNA MÉTRICA?
Ahora que ya conocemos los dos tipos de cálculos y sus diferencias clave, viene la pregunta importante: «¿cuál usar?» Para responer a esta pregunta primero debemos preguntarnos qué es lo que queremos calcular. Esto es importante y debemos tomarlo en cuenta cada que queramos crear un nuevo cálculo.
¿Vamos a calcular fila por fila o vamos a hacer una agregación? ¿Va a ser afectado por el criterio de filtro?
Si el cálculo es fila por fila (por ejemplo: ganancia = ventas – costo; o nombre completo = nombre & » » & apellido), entonces la columna calculada nos convendrá más.
Yo mero
Si nuestro cálculo es una agregación o va a ser afectado por el criterio de filtro en el reporte (por ejemplo: suma de ventas = suma(ventas); o ventas del año hasta la fecha = Total(…)), entonces la métrica será la mejor opción.
Yo también
Para poder mostrarlo mejor, veamos algunos ejemplos.
Ejemplo 1: Calcular la edad de los clientes
La edad de los clientes es algo que no va a cambiar en base a filtros, pues solo depende de una cosa, y esta es la fecha de nacimiento del cliente. En este caso, tenemos la fecha de nacimiento como un campo en nuestra tabla de clientes, por lo que este cálculo puede ser simplemente una columna calculada y no una métrica, ya que estamos evaluando fila por fila a cada cliente.
Ejemplo 2: Calcular las ventas del año hasta la fecha
Cálculos de ventas hasta el día de hoy dependen del criterio de filtro en el reporte, pero también es una agregación que se vuelve complicada para calcular la fecha actual para todas las variaciones de campo (ya sea por día, por mes, por cliente, por producto, etc.), así que esto necesita ser una métrica y no una columna calculada.
Cada vez que pongamos esta métrica en un reporte va a calcular basado en el criterio de filtro del reporte:
¿COLUMNA CALCULADA O POWER QUERY?
Otra pregunta interesante. Cuando se trata de calcular fila por fila, entonces Power Query es la mejor opción en la mayoría de casos. Ya que hemos explicado lo que es M o DAX y los escenarios en que conviene utilizar cada uno, las columnas calculadas pueden ser implementadas por Power Query.
En la mayoría de los casos podemos hacer una columna calculada dentro de Power Query también y de hecho, es mucho mejor hacerlo ahí. Esto significa que las métricas son una gema oculta de DAX, ya que el cálculo métrico es dinámico, hecho sobre la marcha y basado en filtros aplicados en el reporte.
La naturaleza dinámica del cálculo métrico lo hacen una función irremplazable de DAX o Power BI. En el ejemplo de arriba vimos cómo el valor «Suma_Unidades» nos muestra por añi, pero si traemos el valor por mes en la tabla, entonces este cálculo evaluará de forma diaria y seguirá funcionando perfectamente bien.
Y si lo hicieramos a nivel trimestral, el cálculo de la fecha hasta el día de hoy evaluará en ese periodo:
Esta naturaleza dinámica de los cálculos métricos en DAX es algo que no podremos encontrar en muchas herramientas, lo que hace a las métricas tan comúnes en DAX.
Ahora que hemos comparado a ambos tipos de cálculos en DAX, podemos resumir sus diferencias con la siguiente tabla:
Cualquier duda nos leemos abajo, o nos vemos en alguno de nuestros cursos.