Aquellos profesionales que trabajan en temas relacionados con la gestión analítica de los datos de una empresa, conocen que existen multitud de análisis interesantes que dependen íntegramente de la dimensión temporal del modelo de datos. Sin una dimensión temporal cuyos metadatos se adapten a las características de la empresa en cuestión, nos resultará difícil captar aquellos elementos que marcan la diferencia y constituyen el verdadero valor añadido proporcionado por las herramientas de inteligencia de negocios en la toma de decisiones empresariales.
En algunos negocios, es especialmente importante la incidencia de los días festivos. Si por ejemplo estamos analizando las ventas de un restaurante, las llamadas entrantes en un call center o las estadísticas de una página web, probablemente encontraremos diferencias significativas en los datos en función de si el día es festivo o no. En este artículo vamos a ver cómo podemos extraer esta información en tiempo real desde API’s en línea y añadirla a nuestra dimensión temporal.
Este es uno de los puntos fuertes de M (Power Query) frente a DAX a la hora de generar una dimensión temporal, ya que la información de los días festivos solo nos será útil si podemos mantenerla al día cada vez que actualicemos nuestra consulta.
La alternativa Web.Page()
En primer lugar, vamos a ver cómo podemos importar esta información desde una web con la función de M Web.Page()
. Vamos a utilizar para este ejemplo la página web http://www.diafestivo.es/ que nos proporciona datos sobre los días festivos nacionales y regionales de España. Para ello, empezamos por importar la información seleccionando Web como origen de datos en el editor de consultas de Power BI.
Como podemos ver, la raíz de la página contiene los días festivos separados en dos tablas, por lo que una vez introducida la URL cargaremos dichas tablas en el editor de consultas:
Cuando tengamos las dos consultas en el editor, simplemente tendremos que realizar una serie de transformaciones que preparen la información para ser combinada con nuestra dimensión temporal. Estas transformaciones dependen de la estructura de los datos presente en el origen que utilicemos, por lo que no nos detendremos demasiado en explicar con todo detalle las que vamos a realizar en este artículo. Una vez aprendamos como funciona podremos importar información de todo tipo desde orígenes online, y realizar las transformaciones necesarias en cada caso. Vamos a utilizar solamente el editor de consultas y no necesitaremos escribir ni una línea de código M.
El primer paso es anexar las 2 consultas cargadas, para tener toda la información en una única tabla. Para ello, teniendo seleccionada la tabla 0, pinchamos en anexar consultas y elegimos la tabla 1 como la consulta a anexar:
Una vez anexadas, podemos ver en la siguiente imagen que hay valores que no queremos en nuestra consulta y los filtraremos desde el despegable que tenemos en la cabecera de cada campo.
Es importante entender que cuando filtramos y dejamos fuera valores de una columna desde el editor, esencialmente estamos haciendo lo mismo que si los elimináramos. Dichos valores no se cargarán al modelo de datos, lo que nos proporcionará una reducción en el tiempo de carga a la vez que dejaremos la consulta con un menor número de registros contra los que procesar los cálculos que realicemos.
Posteriormente, cambiamos los nombres de las columnas;
Y anulamos la dinamización de aquellas que contienen las fechas.
Ya solo nos queda crear una columna que combine la columna que contiene el año con la que contiene el resto de la fecha.
Finalmente, podemos eliminar las columnas Atributo y Valor, definir el tipo de dato Fecha para la columna recién creada y borrar los errores que se producen por no existir fecha definida en algunas líneas en el origen de datos. Ya tenemos todo listo para combinar nuestra dimensión temporal con la consulta de los días festivos.
Expandimos la columna que contiene el nombre del festivo.
Y tenemos nuestra dimensión temporal completada con los días festivos.
Ahora podemos añadir una columna condicional que nos indique si el día es festivo o no, de manera que podamos filtrar y segmentar los datos fácilmente en nuestras visualizaciones.
La alternativa Xml.Tables()
El método descrito anteriormente para importar los datos con la función Web.Page()
tiene el inconveniente de que, aunque los datos se actualizan perfectamente en Power BI Desktop, para que la consulta sea actualizable en Power BI Service necesitaríamos una configuración de puerta de enlace. Como existen multitud de modelos de datos que funcionan sin puerta de enlace, vamos a ver otro método con el que podemos incorporar a nuestra dimensión temporal la información relativa a los días festivos y actualizarla sin que tengamos que estar trabajando bajo puerta de enlace.
Hay que clarificar que la función Xml.Tables()
puede tomar como primer parámetro (el contenido) funciones como Web.Contents()
que si nos permitiría que actualicemos los datos en Power BI Service, pero si por ejemplo usamos la función File.Contents()
como primer parámetro, la consulta no sería actualizable sin una configuración de puerta de enlace, igual que con cualquier otro archivo local. Para saber más sobre los orígenes de datos que son o no actualizables en Power BI, podemos recurrir a esta documentación oficial de Microsoft.
Existen en internet multitud de servicios que nos ofrecen datos de calendario en formato XML, algunos de ellos mediante subscripciones de pago. Nosotros vamos a utilizar como origen de datos la web gratuita WebCal.fi, que es perfectamente válida para este ejemplo.
En las opciones que salen a la izquierda pinchamos en Calendarios/otros formatos y elegimos las opciones que nos interesan.
Si pegamos la URL proporcionada en nuestro navegador se nos descargará un archivo XML que tendrá esta pinta;
Ahora lo que vamos a hacer es importar esa información en el editor de consultas de Power BI como hicimos en el apartado anterior de este artículo, utilizando la opción Web como origen de datos.
Nos quedamos con las 2 primeras columnas, que es todo lo que necesitamos y les cambiamos el nombre.
Si hemos creado parámetros en el editor de consultas para el año inicial y el año final, podemos hacer nuestra consulta paramétrica; de forma que podamos extraer, del origen de datos, la información relativa al rango de años que nos interese en cada momento. Para ello, nos vamos al primer paso de nuestra consulta (Origen), pinchamos en avanzado y dividimos la URL en subconjuntos fijos y en referencias a nuestros parámetros del año inicial y final (yo los he definido como AñoInicial
y AñoFinal
) de la siguiente forma;
Posteriormente, en el editor avanzado cambiamos «2016» por la referencia Text.From(AñoInicial)
y «2017» por Text.From(AñoFinal)
y ya hemos convertido nuestra consulta en paramétrica.
Ahora si por ejemplo en nuestros parámetros definimos AñoInicial
como 2016 y añoFinal
como 2018, nuestra consulta responderá correctamente y nos mostrará los días festivos existentes entre el rango de años señalado.
Ya solo nos quedaría combinar esta nueva consulta con nuestra dimensión temporal y si nos interesa, crear un campo condicional que nos indique si el día es festivo o no, exactamente tal y como hicimos en el apartado anterior de este artículo. De este modo tendremos todo listo para filtrar y segmentar nuestros datos usando la información adicional incorporada en la dimensión temporal de nuestro modelo.
Deja un comentario