DAX: funciones de fecha

Como la gestión de fechas y sus periodos es una de las grandes potencias de Power BI vamos a ver unas cuantas funciones que nos ayudaran a detallar la información.

Vamos a datos, a la tabla calendario y vamos añadir una nueva columna

Donde ponemos

Año = Calendario[Date].[Año]

El intelisense nos ayuda a escribir todo: al escribir Date, ya podemos elegir Calendario.Date, y al poner este se despliegan distintas opciones que aprovechamos, en este caso el año.

Importante, hay que seleccionar la columna y en Modelado, Resumen predeterminado, indicar NO resumir.

Del mismo modo añadamos columnas para

Día = Calendario[Date].[Día]

Mes = Calendario[Date].[Mes]

Mes numero = Calendario[Date].[NroMes]

Trimestre numero = Calendario[Date].[NroTrimestre]

Trimestre = Calendario[Date].[Trimestre]

Y todas estas columnas que son numeros las marcaremos como No resumir

Nos quedara una tabla con todas estas columnas

Que podremos aprovechar en nuestros informes.

También crearemos columnas con las siguientes funciones que nos dan más información

Día semana = FORMAT(Calendario[Date];”dddd”)

Día semana numero = WEEKDAY(Calendario[Date];2)

Semana numero = WEEKNUM(Calendario[Date];2)

Así tenemos el día de la semana en letras, su número y el número de la semana dentro del año

Ahora vamos a crear una tabla y usar alguno de estos valores: El mes del calendario, y el importe de facturas ventas

Obtenemos una tabla con muy mala pinta, los meses NO están bien ordenados. Esto es así porque Power BI ordena alfabéticamente.

Volvamos a Datos, a nuestra tabla calendario, seleccionemos la columna Mes y Modelado, Ordenar por columna, indiquemos Mes numero

Ahora si volvemos al informe, los meses ya salen bien ordenados

Esta es una opción muy interesante de Power BI, ordenar una columna de datos por el valor de otra columna.,

Vamos a probar lo mismo con los días de la semana. Creamos una nueva tabla con Día semana e importe y obtenemos

Ahora cambiemos la ordenación en Datos, seleccionando la columna Día semana e indiquemos por Día semana numero

La tabla se ha reordenado automáticamente

Para terminar y ya que tenemos el acumulado anual y los meses vamos a crear un gráfico que nos muestre como han crecido las ventas.

En esta misma página, añadimos un gráfico de columnas agrupadas y ponemos

El grafico nos muestra los 12 meses, y tres barras de colores, una para cada año. Y vemos que van ascendiendo pues es el valor acumulado.

Es importante recordar que para todo uso de fecha, hay que referirse siempre a los campos de la tabla Calendario.

Guardemos la página como funciones de fecha

DAX: Funciones de inteligencia de tiempo

Una de las grandes ventajas de Power Bi es que tiene funciones para comparar los datos por periodos de tiempo. Por ejemplo: ventas entre años, lo que llevamos vendido del año, la Tendencia Anual Móvil, etc…

Pero para que esto funcione es necesario disponer de un intervalo continuo de fechas, y lo más normal es que en nuestras tablas de datos no haya ventas todos los días.

Así que aprenderemos como crear una tabla de fechas, un calendario, como relacionarlo con nuestras ventas y como sacar partido de las funciones de inteligencia de tiempo

Tabla Calendario

Vamos a datos, modelado, e indicamos nueva tabla

Dato que tenemos ventas desde el 2013 hasta el 2015, ponemos

Calendario = CALENDAR(“1-1-2013″;”31-12-2015”)

Y esto nos crea una nueva tabla que tiene todas las fechas en ese intervalo

Pero en realidad nuestras ventas son dinámicas, y hoy tenemos estos periodos y mañana podemos tener otros, así que estaría bien tener una tabla dinámica, que coja desde la primera fecha de la que hay ventas, hasta la última fecha en la que hay ventas.

Así que cambiemos la definición de la tabla y pongamos

Calendario = CALENDAR(MIN(‘Facturas Ventas'[Fecha]); MAX(‘Facturas Ventas'[Fecha]))

O sea desde el día mínimo hasta el día máximo

Ahora vemos como el calendario empieza el 5-1-13, el primer día que hay ventas

Y termina el 22-12-15

Pero en realidad lo que nos interesa es desde el 1-1 del primer año que hay ventas, hasta el 31-12 del último año que hay ventas, para así poder comparar periodos completos, años, trimestres, etc…

Para ello aprovecharemos la función DATE que permite indicar un año, un mes y un día, y a partir de esos tres parámetros construye una fecha

Sustituyamos pues nuestra definición de la tabla por

Calendario = CALENDAR(DATE(YEAR(MIN(‘Facturas Ventas'[Fecha]));1;1); DATE(YEAR(MAX(‘Facturas Ventas'[Fecha]));12;31))

Ahora sí, tenemos del 1-1-13 al 31-12-15

Y lo veremos más claro si le damos formato fecha con dd-mm-yyyy

Nos queda un último paso importante, vincular la fecha de nuestras ventas con este calendario. Para ello vamos a Relaciones

Y arrastramos la Fecha de Facturas ventas a la Date de Calendario. Power Bi establece una relación y nos la muestra.

Esta es una de las grandes ventajas de Power BI, podemos relacionar datos de distintas tablas y luego usarlas en nuestros informes.

Para empezar a aprovechar las funciones de inteligencia de tiempo, vamos a crear una medida que nos permita comprar las ventas de un periodo con las ventas del mismo período del año anterior.

Volvemos a Datos, seleccionamos la tabla facturas ventas, modelado y creamos una nueva medida

Importe Anterior = CALCULATE([Importe];SAMEPERIODLASTYEAR(Calendario[Date]))

Y le ponemos formato con separador de miles y dos decimales.

Hemos usado la función CALCULATE, que tiene varios parámetros. El primero es una expresión, en este caso hemos usado una medida que ya tenemos definida, el Importe. Igualmente hubiésemos podido poner SUM(NETO), pero esa es la ventaja de definir la medida, nos olvidamos de arrastrar su fórmula. Y los siguientes parámetros son filtros, en este caso usamos la función SAMEPERIODLASTYEAR donde le indicamos que busque la fecha en el Calendario, NO en Facturas ventas, dado que necesita un intervalo continuo de fechas.

Para verificarlo, creamos una nueva página, ponemos una tabla con los campos Date, del Calendario, e Importe e Importe anterior de facturas ventas.

Veremos que al poner date se nos desglosa en Año, trimestre, mes y día. Quitemos el mes y el día, quedando

Si observamos bien la tabla veremos que a partir del 2014, en la columna importe anterior aparecen las ventas del mismo trimestre del año anterior

Vemos que en el tercer trimestre de 2015 no hay ventas, pero si nos muestra a su derecha las el tercer trimestre de 2014

Por supuesto si activamos los meses, pasara lo mismo.

Y si queremos saber el incremento de un periodo respecto a otro, basta con crear una medida que relacione las dos que ya tenemos

% Importe s/Anterior = [Importe]/[Importe Anterior]

A la que podemos poner formato porcentaje, y añadirla a nuestra tabla

Obteniendo así el aumento de un trimestre respecto a al mismo del año anterior.

Otra función muy útil es la YearToDate, que nos permite saber valores acumulados hasta una fecha

Creemos una nueva medida y ponemos

Importe Acumulado = TOTALYTD([Importe];Calendario[Date])

Con formato separador de miles y dos decimales, y la añadimos a la tabla

Vemos que el 2013 empieza a sumar, y cada trimestre es la suma de sí mismo con el anterior. Y que al cambiar de año, empieza a sumar de nuevo.

Le propongo crear una tabla que nos muestre los meses, y tres columnas con los años que tenemos datos, y los acumulados de los meses, así cuando miremos un mes, no vemos sus ventas, sino lo que llevamos de acumulado y es más fácil saber si vamos bien o mal, pues eso compensa si un mes hay más o menos ventas que los anteriores.

En la misma página podemos hacer más pequeña la fuente, y más estrecha la tabla para dejar espacio debajo

Y añadimos una Matriz, con en Valores, el importe acumulado, en filas el mes, en columnas el año

Y obtenemos una tabla con las ventas acumuladas mes a mes.

Guardemos la pagina como Inteligencia de tiempo

DAX: Funciones X

Hay un grupo de funciones que son similares a las básicas pero mucho más potentes.

Por ejemplo a la función SUM hay una correspondiente SUMX

SUM, solo se puede aplicar sobre un campo o columna: no sobre una medida.

SUMX tiene dos parámetros:

  • La tabla sobre la que se aplica, que puede ser incluso un subconjunto de una tabla, como veremos
  • Y la expresión a calcular, donde podemos usar cualquier operación matemática valida

Supongamos que en nuestra tabla de datos, no nos dieran el Neto, sino el precio de venta de cada línea.

Para calcular el Neto, deberíamos multiplicar el Precio * Unidades, y así tendríamos una nueva columna con el Neto.

Pero esto implica añadir una nueva columna, que se calcula sobre todas las filas de la tabla. Y si la tabla es muy grande…pues será muy lento.

Para ello sería mejor crear una medida que calculara la Suma de Precio * Unidades: eso es lo que hace SUMX

Dado que en nuestra tabla NO tenemos el precio, vamos a añadir una nueva columna que lo calcule, como NETO / UNIDADES.

Esto es una división, y que pasaría si UNIDADES es 0, nos daría un error. Así que usaremos la función DIVIDE que permite solucionar esto.

NOTA: en este ejercicio hacemos esto para poder tener el precio y luego calcular el neto. Aunque en realidad no nos hace falta dado que el Neto ya existe.

Creemos una nueva columna y ponemos

Precio = DIVIDE(‘Facturas ventas'[Neto];’Facturas ventas'[Unidades];0)

En la lista de campos aparece el Precio

Para calcular el importe, creamos una nueva medida y ponemos

Importe sumado = SUMX(‘Facturas ventas’;’Facturas ventas'[Precio]*’Facturas ventas'[Unidades])

En una nueva página, creamos una tabla y ponemos: Representante, Neto, Importe e Importe sumado

Las tres columnas tienen que dar los mismos valores pero los usaremos de modo distinto.

Como decíamos, las funciones X permiten indicar una tabla o un subconjunto de la misma.

Supongamos que queremos tener el Importe de las ventas del 2013 para poder compararlo con los otros años, o sea ventas 2014/ventas 2013, ventas 2015/ventas2013

Creemos una nueva medida y ponemos

Importe 2013 = sumx(FILTER(‘Facturas ventas’;’Facturas ventas'[Ejercicio]=2013);’Facturas ventas'[Neto])

Donde el primer parámetro es un subconjunto de la tabla Facturas ventas usando la función FILTER

Filtramos la tabla Facturas ventas por el Ejercicio 2013

Si ponemos este Importe 2013 en la tabla tenemos

Guardamos la página como Funciones X

DAX: funciones básicas

El lenguaje de funciones que usaremos en Power Bi se llama DAX.

Vamos a ir realizando ejercicios paso a paso para conocer distintas de ellas que considero nos pueden ser más útiles

Las funciones se usan al crear lo que en Power BI se llaman Medidas: definiciones de cálculos que usaremos para representar valores.

Hemos visto en nuestros ejemplos que al poner el Neto automáticamente se aplica una Suma, pues en la página de datos, en resumen predeterminado está indicado así

Pero no siempre nos interesara que se aplique esta suma, y además no queremos tener que ir repitiendo la suma en todas las definiciones.

Para ello vamos a crear una primera medida muy sencilla: la suma del neto.

Pulsamos en Modelado, Nueva medida

Y en la barra de fórmulas se nos pregunta por la fórmula de la medida. Pongamos

Importe = SUM(‘Facturas ventas'[Neto])

Y démosle formato con separador de miles y dos decimales

Vemos que en la lista de campos aparece un nuevo concepto: el Importe, con un símbolo de calculadora, que nos indicó que es un cálculo, una función.

Ahora creamos una nueva página y ponemos una tabla, donde añadimos los campos Artículo, Neto e Importe.

Si observamos la tabla las columnas Neto e Importe dan los mismos valores, pues sabemos que el Neto se visualiza como su Suma.

Queremos tener también un cálculo que nos diga el precio medio de venta de los artículos, para ello definimos una nueva medida y ponemos la fórmula

Precio medio = SUM(‘Facturas ventas'[Neto])/SUM(‘Facturas ventas'[Unidades])

Y le damos formato con separador de miles y dos decimales.

Ahora añadimos el precio medio a la tabla, y también el neto otra vez. Pero en este neto, desplegamos con el botón de la derecha y cambiamos a Media

Si vemos la tabla veremos que son dos columnas con importes distintos: una cosa es el precio medio de venta de los artículos, y otra cosa la media de importes de venta

Otros cálculos que nos pueden interesar son saber cuántas líneas de facturas hay, y cuantas facturas hay

Para ello creamos las medidas

Cantidad líneas = COUNT(‘Facturas ventas'[Nº factura])

Cantidad facturas = DISTINCTCOUNT(‘Facturas ventas'[Nº factura])

La función COUNT cuenta valores numéricos, el número de factura)

Y la función DISTINCTCOUNT cuenta valores distintos según el contexto, en este caso el artículo

Añadamos estas columnas a nuestra tabla

Tenemos pues 2099 líneas y 120 facturas

Si vamos a datos, al pie de página podemos ver la cantidad de líneas

Tiene que coincidir con nuestra tabla

Si quitamos el campo articulo y ponemos el campo representante

La tabla cambia, tiene menos líneas, una por representante, pero los totales deben ser los mismos

Guardemos la página como Funciones básicas

 

 

 

Matriz de datos

Otra forma de representar la información es con una Matriz de datos: que tiene filas y columnas

Por ejemplo para ver las ventas por artículo, año a año

Creemos una nueva página y usemos el visualizador Matriz

En Valores ponemos el Neto, en filas el Articulo y en Columnas el Ejercicio

Tenemos una tabla donde las filas son los artículos, las columnas los años, y las intersecciones de filas y columnas la Suma del Neto

Si debajo de Ejercicio ponemos el Trimestre

Tendremos una Matriz mas detallada, ventas por cada año, desglosadas por trimestre, con el total del año y el total general

Guardemos la hoja como Matriz

Tablas de datos

Otra manera de representar los datos es con tablas, como hemos hecho siempre en Excel.

Vamos a crear una nueva página y añadimos el visualizador tabla

Y agreguemos los campos Articulo y Neto

Obtenemos una tabla con ambos valores

Y un total de ventas al pie.

¿ Pero en realidad, que está representando el campo Neto ?

Si pulsamos con el botón de la derecha veremos que está aplicando una suma

Hay varias opciones interesantes en las tablas

Aumentar el tamaño de la fuente

Para ello vamos a Formato, General y desplazamos la rueda del tamaño: en este caso lo he dejado a 16

Ahora es mucho más legible

También podemos ordenar la tabla por sus campos, haciendo clic en el triángulo que se muestre al lado del nombre de cada columna.

Si pulsamos sobre el triángulo de Neto, tendremos los datos ordenados por importe

Y también podemos aplicar formato condicional, para ello en el campo neto, pulsamos con el botón de la derecha, escogemos formato condicional e indicamos el tipo de formato a aplicar

Al aceptar los campos tienen formato según su importe

En una tabla podemos añadir más campos, por ejemplo pongamos otra vez el Neto, encima pulsemos con el botón derecho y marquemos Mínimo

En la tabla aparece un nuevo campo que es el valor mínimo de venta

Para practicar añadiremos le Máximo, la Media, el Recuento y el Recuento distinto

Observe que el recuento y el recuento distinto dan valores diferentes

Y ajustemos el ancho de las columnas para que quepa bien en la pantalla

Por supuesto podemos aplicar formato condicional a las columnas que nos interese y añadir segmentadores para analizar la información.

Guardemos la página como Tabla

Mapa coroplético

Vamos a ver otros tipos de mapas: los coroplético

Creamos una nueva página, y ponemos el visualizador

En Ubicación ponemos la provincia, y en Saturación de color, el Neto

Y obtenemos un mapa como el de la muestra

Tenemos el mismo problema, Zaragoza, se muestra en México

Y si aumentamos la parte de España

Vemos que las provincias con más ventas tienen un color, una saturación más intensa

Por supuesto si nos paramos encima de una provincia se nos muestra su información

Aunque vemos que la localización de los límites de la provincia no es muy exacta: para Barcelona, muestra toda Catalunya.

Lamentablemente si sustituimos Provincia por nuestro campo calculado Provincia País, el mapa no nos muestra nada.

Este es un tema que aún no está resuelto en Bing

Guardamos la página como Coroplético

Mapas

Una característica muy interesante del Power BI es poder representar la información sobre mapas, para ver la distribución geográfica de nuestros datos.

Los mapas se basan en las búsquedas de Bing, por lo tanto, como veremos, a veces hay que ayudarle un poco.

Creemos una nueva página y pongamos el visualizador Mapas

En Ubicación ponemos la Provincia, y en Tamaño, el Neto.

Automáticamente nos aparece un Mapa (si tenemos conexión a Internet) con las ventas por provincia.

Podemos desplazarnos por el mapa, o con la rueda de ratón, hacer Zoom.

Vemos que en cada provincia el círculo es de tamaño distinto en función del importe de las ventas.

Como podemos observar hay ventas en una provincia de México, cuando sabemos que todas nuestras ventas son en España.

Nos ponemos encima del círculo verde para ver su información

Y nos dice que es Zaragoza, esto es debido a que en México también hay una provincia llamada Zaragoza, así que tendremos que ayudar al Bing para decirle que busque Zaragoza, España.

Para ello vamos a crear una columna calculada que agrupe, que encadene la Provincia, con el país.

Vamos a Datos

Pulsamos en Modelado, Nueva columna

Y escribimos el nombre de la columna y la formula

Provincia País = ‘Facturas ventas'[Provincia] & “, ” & ‘Facturas ventas'[País]

Estamos encadenando, concatenando la provincia, una coma y un espacio y el país.

Así a la derecha de la tabla de datos aparece la nueva columna con la información.

Ahora solo falta indicarle la categoría de datos para que BIG lo encuentre.

Seleccionamos nuestra nueva columna, e indicamos en Modelado, Categoría de Datos: Lugar

Regresemos al mapa, quitamos la Provincia y en su lugar ponemos el nuevo campo Provincia País

Ahora si hemos obtenido un mapa con las ubicaciones correctas

Si queremos podemos usar la leyenda para mostrar más información. En nuestro caso ponemos el Ejercicio en Leyenda, y los círculos toman tres colores, para representar el importe de cada Ejercicio.

Por supuesto si nos ponemos sobre un sector del círculo, nos da información del lugar, importe y ejercicio

Podríamos poner la Familia en lugar del Ejercicio, y si en la parte superior del grafico seleccionamos una familia, se destaca su segmento en cada círculo.

Recordemos que podemos aumentar la información de datos con la opción Información sobre herramientas.

En nuestro caso se muestran los círculos pero no sabemos exactamente a qué % pertenecen, ni aunque nos paremos sobre un segmento.

Para poner el %, arrastramos Neto a Información sobre Herramientas. Y con el botón derecho seleccionamos Cálculo rápido, e indicamos % del total general

Al aceptar tenemos un nuevo concepto %TG Neto, que se muestra al ponernos sobre un segmento

Guardemos nuestro informe como Mapa

 

 

Gráfico de doble escala

A veces queremos representar visualmente valores que son muy dispares entre sí, por ejemplo los importes y las unidades vendidas.

Para ello podemos usar un gráfico de doble escala.

Creamos una página nueva, y pulsamos en el visualizador grafico de columnas agrupadas y de líneas

En Eje compartido, ponemos los Artículos. En valores de columnas el Neto, y en valores de líneas, las unidades

Obtenemos un gráfico que nos muestra importes y unidades, pero con dos ejes verticales, a la izquierda para importes, y a la derecha para unidades

Por desgracia, de momento, solo podemos aplicar series de columnas, Así si ponemos el Ejercicio en series de columnas, veremos unas barras con cada año, pero NO hay líneas para cada año.

Guardamos la página como Doble escala

Gráficos circulares

Vamos a ver los gráficos circulares y una característica muy interesante que tienen al relacionar varios entre sí.

Empecemos con una página de informe en blanco, y pulsamos en la visualización grafico circular

En Leyenda ponemos el representante, y en Valores el neto, y obtenemos un gráfico de ventas por representante, donde cada segmento indica el valor de las ventas de cada representante respecto al total

Si nos paramos sobre un segmento nos indica el importe y el %

Si queremos, mediante la opción de formato, podemos visualizar además del nombre, el importe

Ahora vamos a añadir otro grafico circular, para ello hacemos clic a fuera del gráfico, en una parte vacía del lienzo, y pulsamos la visualización Grafico circular

En Leyenda ponemos Familia, y en Valores el Neto.

Tenemos un gráfico de ventas por familia

Ahora vemos la integración entre los dos gráficos: si pulsamos sobre el sector en negro de Bicicletas de paseo, automáticamente en el gráfico de representantes se destaca las ventas de esta familia, respecto al total de ventas del representante

 

Esta es una característica muy interesante que nos permite analizar la información de dos gráficos que están vinculados entre sí.

Guardemos la página como Círculos