4 formas de crear una colunma condicional en Power BI (DAX y Power Query)
Hoy tal y como lo dice el título vamos a ver 4 formas de crear una columna condicional en Power BI. La primera de ellas la haremos utilizando DAX, y las otras 3, utilizando Power Query y M languange.
Para estos ejemplos, voy a utilizar el dataset de Kaggle llamado World of pokemons, al que puedes acceder en este enlace. Para que se den una idea tiene esta pinta:
DAX
Este primer método es bastante sencillo. Para lograr nuestro cometido vamos a seleccionar la tabla deseada. Esto nos habilitará una pestaña extra en el menú, llamada: Table tools (aparecerá al final).
Allí seleccionamos New column, lo que nos habilitará la barra de fórmulas DAX, donde pondremos nuestra condición.
Supongamos que quiero saber qué pokemon tiene un puntaje considerable, y cuales son más débiles. Para esto, nos basamos en la media de puntaje.
Entonces, vamos a establecer una condición en donde, si está por encima de la media, me diga “aceptable”, y si está por debajo, me lo categorice como “débil”.
La fórmula en DAX sería la siguiente:
categorizacion = IF(‘pokemons dataset’[Total]>AVERAGE(‘pokemons dataset’[Total]),”Aceptable”,”Debil”)
Y nos queda así:
A nuestra derecha, vemos que dentro de nuestra tabla, nos aparece una nueva columna. Como pueden ver, tiene un ícono particular que es una columna con un Fx, lo que justamente señala, que es una columna calculada con una fórmula.
Por ésta razón, a estas columnas realizadas con DAX se las conoce como columnas calculadas o calculated column.
Si vamos a la vista Data o de datos, en nuestro menú izquierdo, podemos ver cómo quedó nuestra tabla con la nueva columna (aparece al final).
Sin embargo, una desventaja de éste tipo de columnas, es que no aparecen en nuestra sección de Transformación de datos, o lo que se conoce como Power Query. Por lo que si queremos realizar algún tipo de manipulación desde acá, no vamos a encontrarla.
Power Query — Conditional Column
La segunda forma que vamos a ver, es justamente desde Power Query, para salvar la desventaja anterior, al cual accedemos con un clic derecho sobre nuestra tabla > Edit query
Una vez en el editor, vamos a la pestaña Add Column, y seleccionamos la opción Conditional Column
Se nos abrirá una ventana donde pondremos el nombre de nuestra columna, seguido de los detalles de la condición; estos son:
- El nombre de la columna a evaluar
- El tipo de condición. Acá ponemos si buscamos comparar igualdad, ubicación entre un rango, etc
- El valor con el cual comparar. Acá puede ser arbitrario, o seleccionar una columna existente para comparar su valor.
- Lo que debe devolver en caso de cumplir dicha condición
Luego, se puede agregar una cláusula adicional, es decir, una segunda pregunta condicional, generando lo que se conoce como condicional anidado (o nested conditional); y finalmente, podemos detallar el valor a devolver en caso de que ninguna condición se cumpla.
Para nuestro ejemplo, quiero saber si un pokemon puede volar, por lo que tengo que consultar si su tipo primario es volador.
Pero como también puede vuele debido a que su tipo secundario lo sea, tengo que agregar una segunda condición preguntando si éste lo es.
En caso de lograr alguna coincidencia, voy a devolver: SI. Caso contrario, devolverá NO
Como podemos ver, no nos trajo ninguna columna coincidente. Esto se debe a que el valor utilizado en la comparación es Case Sensitive, es decir, sencible a las mayúsculas.
Por este motivo, y porque en nuestra base de datos los tipos están detallados en mayúsculas, tengo que corregir mi condición.
¿Cómo lo hago? Simple, fíjense en la imagen anterior, a la derecha se nos agregó el paso “Added Conditional Column”. Si hago doble clic ahí, se nos abrirá nuevamente la ventana anterior.
Cambiamos Flying por FLYING, ¡y listo!
Si filtramos por los de valor “SI”, puedo confirmar que son aquellos que tengan el tipo “FLYING”, ya sea como primario o secundario.
Power Query — Custom Column (M language)
Ahora vamos a ver cómo lograr lo mismo, pero utilizando lo que se conoce como lenguaje M o M language.
Este es lenguaje utilizado para las instrucciones declaradas desde Power Query, ya que allí DAX no se puede utilizar.
Esto lo haremos mediante el uso de una Custom Column.
Como su nombre lo indica, acá podremos hacer mucho más que un simple condicional. Pero bueno, ahora solo estamos viendo eso.
Para crear una columna personalizada vamos de nuevo a la pestaña Add Column pero ahora seleccionamos Custom Column
Se nos abrirá otra ventana pero con muchas menos opciones, pues aquí solo ponemos el nombre de la nueva columna, y luego empezamos a escribir nuestras instrucciones en el cuadro central.
A la derecha tenemos las columnas de nuestra tabla, por si las queremos utilizar dentro de una instrucción, lo que será posible con hacer doble clic en la deseada.
Como pueden comprobar, acá tampoco aparecerán las columnas calculadas, ya que éstas son creadas en DAX(Recuerden a Saruman)
La condición ahora va a ser categorizar a los pokemons según el afecto que les tengo. En mi caso, elegí darle mucho afecto a los 3 pokemon iniciales de la primera saga, es decir Bulbasaur, Squirtle y Charmander.
Para hacer la cosa un poco más interesante, también puse otra condición que indica que si el pokemon es Pikachu, el afecto es muchisimo.
Si no es ninguno de esos 4, el afecto es normal
La instrucción en M es la siguiente:
if [Name] = “Bulbasaur” or [Name] = “Squirtle”or [Name] = “Charmander” then “Mucho” else if [Name] = “Pikachu” then “Muchisimo” else “Normal”
Y la ventana nos quedaría así:
Es importante que abajo nos aparezca el tilde verde, ya que indica que al menos no hemos realizado ningún error de sintaxis. Es decir, lo que escribimos tiene logica a nivel del lenguaje (de ahí a que funcione, es otra cosa)
Al aceptar nos genera la nueva columna, y como podemos ver abajo, nos puso las 3 categorías que declaramos para afecto:
Power Query — Advanced Editor
Esta técnica es ya más avanzada, y no creo que la usen para un simple condicional, a menos que creen tablas de cero mediante un Query.
Sin embargo, lo último que nos resta aprender es cómo generar una columna condicional desde el Editor Avanzado o Advanced Editor, que quienes para los que no saben, es toda nuestra tabla (junto con los cambios que fuimos realizándole), vista a nivel código.
Para entrar a esta opción, esta vez vamos a la pestaña Home > Advanced Editor
Se nos va a abrir una ventana con mucho código en lenguaje M.
Es secuencial, por lo que una sentencia posterior, va a referirse (y necesitar) de la anterior.
A tener en cuenta:
- Tiene dos partes: let donde se declaran todas las instrucciones; e in, donde se detalla la salida final (cómo queremos que se vea la tabla).
- Todas las sentencias en let terminan con una coma. Excepto la última antes del in.
- Las instrucciones se suelen almacenar en variables de estado, a quienes luego veremos en el visualizador de pasos.
- Las variables se declaran con # y un nombre entre “”
- Las instrucciones se aplican generalmente al estado anterior. Hacemos referencia a él, utilizando el nombre de variable dado (con # y “”)
- En la parte de in debe ir el último estado declarado.
- Los strings o textos van entre “”.
Una vez dicho esto, lo que queremos lograr ahora es saber qué pokemon es poderoso. Siendo un pokemon poderoso, aquellos que superen o igualen los 600 pts de poder (elegí 600 por ser la moda).
De esta forma, si cumple aparecerá la leyenda esPoderoso, y si no lo hace, será normal.
Nuestro código es el siguiente. En let ponemos:
#”Added Custom a Mano” = Table.AddColumn(#”Added Custom”,”esPoderoso”,each if [Total]>= 600 then “esPoderoso” else “normal”)
y en in:
#”Added Custom a Mano”
Finalmente nos quedará asi:
NOTAS:
- Si la columna a agregar será el último paso, recuerden agregar una coma a la instrucción anterior a ella. Sino, nuestra instrucción debe terminar en coma.
- Acá también debemos asegurarnos que la sintaxis es correcta.
La instrucción de agregar columna es Table.Addcolumn y como pueden ver, al igual que Excel o cualquier editor de código decente, nos ayuda con los parámetros que espera:
- Table será nuestro estado anterior
- El nombre de nuestra columna irá entre “”
- La instrucción se detalla como vimos anteriormente, pero anteponiendo la palabra each que indica que se realizará esa consulta en cada una de las filas.
Al aceptar, podemos ver nuestra nueva columna esPoderoso
Y se nos agregó un paso con el nombre que le dimos en el editor de código:
Finalmente, para que todo esto tenga efecto real, debemos aplicar los cambios.
A continuación veremos dos visualizaciones con todos los condicionales aplicados.
Acá vemos una tabla filtrada para ver los voladores y poderosos. Obviamente si es poderoso, será aceptable.
En esta otra, solo vemos aquellos a los que le tenemos afecto. Podemos ver que son todos débiles (aunque nosotros sabemos que no ❤ )
Estas fueron distintas formas de agregar columnas basadas en un condicional. Obviamente, recomiendo las primeras dos ya que son más prácticas. Teniendo en cuenta que con al hacerlas DAX no vamos a disponer de ellas en Power Query.