El 24 de marzo Luke Stanke escribió el siguiente mensaje en Twitter.Picture02Wow! La advertencia lanzada por Luke, más bien sonaba a: DANGER Will Robinson DANGER!!!

Cuando el desafío de la semana 13 fue publicado pude comprobar que la advertencia no fue en vano. El desafío trata de la creación de una vista dinámica del precio de las acciones, que dependiendo del intervalo seleccionado de fechas, presentará diferente nivel de agregación:

  • Meses:Cuando hay más de 20 meses de fechas seleccionadas.
  • Semanas:Cuando hay menos de 20 meses pero más de 15 semanas de fechas seleccionadas.
  • Días:Cuando hay menos de 15 semanas de fechas seleccionadas.

Esto implica manejar períodos dinámicos.

Para aumentar el nivel de desafío, el gráfico solicitado es de tipo candelabro con las siguientes especificaciones.

  • Para el “fondo” del candelabro:Debe formarse con los siguientes valores: 1) El valor más bajo y 2) El valor más alto del precio de la acción del período dinámico.
  • Para el “primer plano” del candelabro:Debe formarse con los siguientes valores:  1) El valor de apertura de la primera fecha del período dinámico y 2) El valor de cierre del último día del período dinámico.
  • Para el color: Debe mostrar cuando el precio de cierre es mayor o menor que el precio de apertura.

Y si eres amantes de los desafíos y decides aceptar el nivel avanzado, deberás además incluir:

  • Utilizar esquinas redondeadas en los candelabros.
  •  Incluir un segundo gráfico que muestre la totalidad de los datos pero que use líneas de referencia para sugerir el rango de datos que se debe mostrar en el gráfico principal.

Luke comenta que este desafío puede ser resuelto utilizando uniendo los datos a sí mismos o con un diagrama de Gantt. Luke nos recomendó la utilización unir los datos a sí mismos. El reto me cautivó y no pude perderme la oportunidad de probar ambas técnicas.

Cuáles son las ideas o conceptos básicos detrás de cada técnica:

  • Unir los datos a sí mismos:El unir los datos nos permite contar con dos copias de los datos, los cual nos da la posibilidad de crear dos gráficas de líneas: 1) La línea de fondo con una copia de los datos y 2) La línea del primer plano con la segunda copia de los datos.
  • Diagrama de Gantt:Tiene la ventaja de solo requiere una copia de los datos, pero la desventaja de que las líneas creadas no tienen esquinas redondeadas.

Este blog esta enfocado a mostrar los pasos que seguí buscando trabajar con solo una copia de los datos y lograr el efecto de esquinas redondeadas en las líneas, utilizando:

  • Un gráfico de líneas para la imagen del primer plano del candelabro y lograr el efecto de esquinas redondeadas en la línea gruesa.
  • Un gráfico de Gantt para la imagen de fondo del candelabro, dado que es una línea delgada y en las líneas delgadas al menos yo, no percibo una diferencia crítica entre esquinas redondeada o no redondeadas y con esto evitar la necesidad de una segunda copia de los datos.

A continuación comparto los pasos que seguí:

Paso 1: Crear parámetros: “Center” y “Range of days”.

El parámetro “Center” será utilizado para seleccionar la fecha que será utilizada como punto central de las fechas a analizar. Se definirá como una fecha y los valores posibles serán cada una de las fechas listadas en la fuente de datos. Valor actual: 2/12/2016.

El parámetro “Range of days” será utilizado para indicar el número de días anteriores y posteriores que se tomarán a partir de la fecha central seleccionada.  Se definirá tipo “integer” con un valor mínimo de 10, un máximo de 2,500 con incrementos de 10 en 10.  Valor actual :1,000 días.

Paso 2: Crear variable “Period” o nivel de agregación.

Period =

IIF({FIXED : COUNTD(DATETRUNC(‘month’, [Date]))} >= 20, “month”,

IIF({FIXED : COUNTD(DATETRUNC(‘week’ , [Date]))} >= 15, “week”, “day”))

Paso 3: Crear variable “Dynamic Date” de acuerdo al nivel de agregación seleccionado.

Dynamic Date =

DATE(

CASE [Period]

WHEN “month” THEN DATETRUNC(“month”, [Date])

WHEN “week”  THEN DATETRUNC(“week”, [Date])

WHEN “day”   THEN [Date]

END)

Paso 4: Crear la variable “Filter”

Tendrá el valor de TRUE para aquellas fechas que cumplen las condiciones de estar entre las fechas seleccionadas de acuerdo con los valores de los parámetros definidos en el paso 1.

Filter =

[Date] >= [Center] – CEILING([Range of days] / 2) AND

[Date] <= [Center] + CEILING([Range of days] / 2)

Paso 5: Crear las variables para el fondo del candelabro.

La línea del fondo del candelabro debe formarse considerando los siguientes valores: 1) El valor más bajo y 2) El valor más alto del precio de la acción del período dinámico.

Start of Background Candlestick =

MIN([Low])

Size of Background Candlestick =

MAX([High]) – MIN([Low])

End of Background Candlestick =

MAX([High])

Paso 6: Crear las variables para el primer plano del candelabro.

La línea del primer plano del candelabro debe formarse considerando los siguientes valores:  1) El valor de apertura de la primera fecha del período dinámico y 2) El valor de cierre del último día del período dinámico.

Start of Foreground Candlestick =

{FIXED [Dynamic Date] : MIN(IIF([Date] =

{FIXED [Dynamic Date] : MIN([Date])}, [Open], NULL))}

End of Foreground Candlestick =

{FIXED [Dynamic Date] : MAX(IIF([Date] =

{FIXED [Dynamic Date] : MAX([Date])}, [Close], NULL))}

Paso 7: Crear la variable “Color”.

Color =

AVG([End of Foreground Candlestick]) >=

AVG([Start of Foreground Candlestick])

Paso 8: Crear las etiquetas en los tooltips para indicar día inicial y final en cada “mark”.

El primer y el último período graficado son ajustados con las fechas mínimas y máximas seleccionadas en los parámetros del paso 1.

Start of Dynamic Date =

MAX({FIXED : MIN([Date])}, [Dynamic Date])

End of Dynamic Date =

MIN({FIXED : MAX([Date])},

DATE(

CASE [Period]

WHEN “month” THEN DATEADD(“month”, 1, [Dynamic Date]) – 1

WHEN “week”  THEN DATEADD(“week”, 1, [Dynamic Date]) – 1

WHEN “day”   THEN [Date]

END))

Paso 9: Crear la gráfica con eje doble sincronizado.

Recordemos que utilizaremos un gráfico de Gantt para la imagen de fondo del candelabro y un gráfico de líneas para la imagen del primer plano del candelabro, para dar el efecto de esquinas redondeadas.

Mover a los estantes de:

Filter ⬅

Filter: True y convertirlo en filtro de contexto y con el click derecho seleccionar la opción de  “Add to Context”

“Measure Names” y seleccionar “Start of Foreground Candlestick” y “End of Foreground Candlestick”

Columns ⬅   “Dynamic Date” utilizar “Exact Date” y “Continuous”

Rows ⬅   “Start of Background Candlestick”

Detail ⬅   Dynamic Date

Para la gráfica de Gantt agregar la variable “Size of Background Candlestick” al estante de “Size”

Para la gráfica de Líneas agregar la variable “Color” al estante de Color y la variable “Measure Names” al estante de “Path”

La gráfica de Gantt se utiliza color gris y en la gráfica de líneas se utiliza el color rojo para “False” y el color negro para “True”

Agregar los campos indicados en la siguiente imagen al estante de “Tooltips”

Picture04

Para el nivel avanzado se debe crear adicionalmente un segundo gráfico que muestre la totalidad de los datos pero que use líneas de referencia para sugerir el rango de datos que se debe mostrar en el gráfico principal.

Paso 10: Calcular las líneas de referencia para el segundo gráfico, en caso de que usted haya aceptado el desafío a nivel avanzado.

Reference Line 1 =

DATE(DATETRUNC(“month”, [Center] – CEILING([Range of days] / 2)) – 15)

Reference Line 2 =

DATE(DATETRUNC(“month”, [Center] + CEILING([Range of days] / 2)) + 15)

Paso 11: Construir el gráfico secundario, siguiendo una lógica similar al gráfico principal .

Para el nivel avanzado se debe crear adicionalmente un segundo gráfico que muestre la totalidad de los datos (sin utilizar filtro en los datos) que incluya el uso de líneas de referencia para sugerir el rango de datos que se debe mostrar en el gráfico principal.

Picture03

¡Listo!  

Link a Tableau Public Picture01Gracias Luke por compartirnos este increíble reto, lleno de múltiples desafíos. Gran diversión!

Si tiene alguna pregunta sobre el blog, no dudes en ponerte en contacto conmigo en Twitter (@rosariogaunag)

¡Saludos!

Rosario Gauna

 

Advertisements