Resolver un problema de tiempo complejo en Power BI

Share on facebook
Share on twitter
Share on linkedin
Share on telegram
Share on whatsapp

Contenidos

Nivel: intermedio

La semana pasada estaba impartiendo capacitación a un cliente en Sydney y los integrantes tenían un obstáculo interesante en el que debían poder informar en una ventana de tiempo continua. Piense en ello un poco como las ventas continuas de 12 meses, o las ventas semanales promedio durante un período continuo de 4 semanas, pero en su lugar, este problema utiliza una ventana de tiempo variable de solo unas pocas horas. He decidido demostrar cómo solucionar este problema usando mis propios datos de electricidad solar y generar un consumo promedio móvil de 3 kWh por hora.

Este es un obstáculo interesante por algunas razones que explicaré a continuación.

Divide tu fecha y hora

Lo primero que debe prestar atención es que, siempre que sea factible, debe dividir las columnas de fecha y hora en columnas de fecha y hora separadas. El motivo por la que esta es una práctica recomendada se debe a la forma en que Power BI (The Vertipaq Engine) comprime los datos. Cuantos más valores únicos en una columna determinada, peor se comprimirán los datos. Por eso, se deduce que 2 columnas, una para la fecha y otra para la hora, se comprimirán mejor que 1 columna que contenga DateTime. Como punto lateral, además debe borrar la precisión innecesaria de sus columnas de tiempo siempre que sea factible. Si no necesita segundos, trunque los segundos y cargue los minutos. Si no necesita minutos, simplemente cargue la hora, y así sucesivamente. En resumen, no cargue la precisión que no necesita en sus informes; como consecuencia, el rendimiento de su reporte mejorará.

Ventana móvil de 3 horas

Una consecuencia de dividir una columna DateTime en 2 columnas es que es un poco más difícil escribir un cálculo continuo de 3 horas. No puedo simplemente tomar la fecha y hora actual y posteriormente retroceder en el tiempo y tomar los puntos de datos que componen las 3 horas anteriores debido a que los filtros para la fecha y la hora se aplican de forma independiente. Esto se puede ver claramente a continuación en mi medida de trabajo en progreso que se muestra a continuación.

imagen

Tenga en cuenta que cuando cambia el día, mi medición de ventana de 3 horas (WIP) se restablece y no carga correctamente los datos de la última hora del día anterior. Aunque este es un obstáculo complicado, en realidad es bastante sencillo de solucionar siempre que divida el problema en pedazos y resuelva cada parte del problema de una en una.

Mírame solucionar este problema yo mismo

Una cosa que me gusta enseñarle a la gente es el procedimiento de cómo solucionar un obstáculo. Cada problema es distinto y, por eso, cada solución es distinto. Cuando comienzo el procedimiento, regularmente no sé exactamente cómo se verá el resultado final. Todo lo que hago es solucionar el problema, paso a paso, hasta que tengo una solución que funcione. Si ve mi video a continuación, verá cómo resolví este problema en particular, pero lo más importante es que verá el enfoque que utilicé y, con suerte, podrá adoptar este enfoque usted mismo para solucionar sus propios problemas.

Mi medida final

Para que conste, aquí está la medida final que terminé escribiendo. Recuerde que el punto clave es «Cómo» escribí la medida, no la medida en sí.

Rolling 3 hour average = 
    VAR ToTimeID = SELECTEDVALUE('Time'[TimeID])
    VAR FromTimeID = ToTimeID - 11
    VAR TodaysValue = 
          CALCULATE(
              [Total kWh],
               FILTER(ALL('Time'),'Time'[TimeID] >= FromTimeID && 'Time'[TimeID] <=ToTimeID)
          )
    VAR TodaysDate = SELECTEDVALUE('Calendar'[Date]) 
    VAR YesterdaysDate = TodaysDate - 1
    VAR ToTimeIDYesterday = 96
    VAR PeriodsNeededFromYesterday = IF(ToTimeID < 12, 12-ToTimeID) 
    VAR FromTimeIDYesterday = 96 - PeriodsNeededFromYesterday + 1 
    VAR YesterdaysValue = 
            CALCULATE(
                      [Total kWh],
                      FILTER(
                             ALL('Time'),
                             'Time'[TimeID] >= FromTimeIDYesterday && 'Time'[TimeID] <= ToTimeIDYesterday
                      ),
                      ALL('Calendar'[Date]),'Calendar'[Date] = YesterdaysDate
           )
    RETURN YesterdaysValue + TodaysValue

Además he cargado mi workbook de muestra aquí si desea echar un vistazo.

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.