Construyendo un calendarion con fechas resaltadas para el Workout Wednesday (2019-44)
Las decisiones fundamentales que hay que tomar son:#WorkoutWednesday2019 Week 44 | Can you build a Sales Calendar with top 3 highlighting? | Enjoy a fun calendar view that quickly shows the top dates | more fun with date calculations and creative formatting | blog: https://t.co/i4q4NHGNzR | viz: https://t.co/TvR7h8HRF0 pic.twitter.com/Ad4BfUnFUT
— Ann Jackson (@AnnUJackson) October 30, 2019
- Con o sin usar una fuente de datos adicional de andamiaje.
- Con o sin hojas transparentes.
Scaffolding – fuente de datos con todas las fechas
El objetivo es mostrar un calendarion con todas las fechas del año seleccionado, haya habido ventas o no (usando Superstore). En Tableau, es difícil mostrar marcas cuando no hay datos: si no ha habido ventas un día, no habrá registro de ese día en los datos y, al representar las marcas de cada día, se creará un hueco.
Una opción para contrarrestar esta “deficiencia” es usar cálculos de tabla que tienden a “densificar” los datos. No obstante, esto tiene una serie de limitaciones:
- Hay que asumir que todos los días del año tendrán, al menos, un año con valores (p.ej., el 1 de Enero no tiene datos en 2016, 2017 o 2018, pero sí en 2019) –lo cual no tiene por qué cumplirse (y, de hecho, no se cumple el 29 de Febrero –aunque sólo se aplique, en este caso, a 2016).
- O, dependiendo de cómo se realice la densificación, que todos los meses tendrán al menos un día con datos en cada semana y al menos un día de la semana con datos en cada mes (cosa que, por ejemplo, no se cumple en Octubre de 2018, dado que ningún viernes presenta ventas).
La alternativa por la que he optado es incluir una fuente de datos adicional, que consta únicamente de una columna: fecha, con todos los días desde el 1 de Enero de 2017 hasta el 31 de Diciembre de 2019. Se puede obtener de diversas formas, yo he optado por un simple modelo de Alteryx con una única herramienta “Generate Rows” y exportando el resultado an un fichero de excel que, una vez en Tableau, he usado para combinarlo con “Superstore”.
La “right join” en Tableau asegura que tengamos todos los días del año para los años seleccionados. Una potencial limitación es, si en vez de trabajar con los datos del modelo de “Superstore” estuviésemos trabajando con datos “reales” que se fueran actualizando “en directo”. En ese caso, o bien nos aseguramos, desde el inicio, que el “armazón” de fechas se extiende hasta un futuro razonable, o bien usaríamos una fuente de datos que se actualizase continuamente (p.ej., en la base de datos probablemente exista una tabla con las fechas del año –en qué período fiscal se incluyen, si son vacaciones o no, etc.).
Obtención del calendario
Una vez combinados el campo de fecha completo con la fuente de datos de superstore, y partiendo de la base de la visualización preparada por AnnUJackson, la estructura inicial es sencilla: basta con usar el mismo campo (“Scaffolded” es como he llamado yo al campo de fecha), simplemente cambiando la parte de la fecha que queremos mostrar:- Trimestre en las filas y
- Mes y día de la semana en las columnas.
En este punto, los meses aparecen como columnas, mientras que en la visualización original aparecen agrupados de tres en tres en función de los trimestres. La forma más sencilla, creo, de obtener esta separación es mediante un campo calculado (se podría hacer con un cálculo de tabla (p.ej. “index”) pero sería tedioso de 1. poner a punto, 2. mantener a medida que introduzcamos más dimensiones en la vista).
Dado que, tras examinar la visualización original, vamos a necesitar la fecha real en algún punto más adelante, prefiero traerlo ya a la vista para ir solventando cualquier posible complicación. Esto hace que se subdividian las marcas en función del número de días presentes. Así, por ejemplo, los lunes de Enero de 2019 se dividen en cuatro marcas (hay cuatro lunes con ventas en Enero, pero sólo un viernes).
Para poder mostrar las “descripciones emergentes” en unas marcas sí (días con ventas), y en otras no (días sin ventas) voy a optar por un eje doble con dos medidas irrelevantes (Min(0)). Pero no quiero haya ningún tipo de relación entre las marcas, así que duplico el campo de “día de la semana”. A continuación, añado la semana para que empiece a tomar forma la visualización:
Añadiendo el color
Los requerimientos son: en gris todas las marcas, excepto aquellas que sean las “top 3 en ventas” en función de un parámetro que permite cambiar entre “días”, “semanas” y “meses”. Lo he modificado levemente añadiendo un segundo parámetro que permite variar el número de períodos seleccionados.
Creo que una de las formas más sencillas de obtener este “color” es usando “sets”. He creado tres sets siguiendo la misma lógica, variando únicamente el período:
El color se asigna con una combinación de campos calculados, para excluir días sin ventas (por ejemplo, la semana con más ventas puede tener un día sin ventas y, en ese caso, ese día debe permancer con el mismo color base, sin resaltado, conforme a los requerimientos originales).
Tras duplicar el “Min(0)” ya estamos a punto para convertir la vista en “un calendario”.
El paso para cambiar a la vista de calendario consiste de dos componentes: transferir la “semana” de la fila al detalle, y sustituir esa “semana” en la fila por un “índice de semana”. Básicamente, qué semana es esta dentro de cada mes. Se puede calcular con LoD o, en mi caso, con un cálculo de tabla:
Una vez realizada la sustitución y seleccionado el eje doble, basta con eliminar los “nulls” de la vista para tener la estructura lista:
Basta ya simplemente con ajustar el formato de las líneas de separación, los bandeados y ocultar las cabeceras para tener la estructura definitiva:
Para las etiquetas con distintos colores he optado por dos campos calculados que, a su vez, dependen del color y de la presencia/ausencia de datos.
Combinandolo todo, obtenemos la visualización requerida.