Cálculo de kWh basado en fecha y hora y kW

Un usuario Pregunto ✅

Anónimo

Hola

Quiero calcular kWh.

Tengo una tabla con marcas de tiempo y kW correspondientes, y quiero convertirla a kWh.

kW.png

Puedo imaginar que tengo que calcular la duración del tiempo en horas, pero No sé cómo hacer esto para poder filtrar por un ID de tienda y un período de tiempo.

¿Alguien tiene una idea de cómo hacer esto?

Muchísimas gracias.

lbendlin

En respuesta a lbendlin

Esto resultó ser mucho más desafiante de lo esperado. Power BI siguió quedándose sin memoria a pesar de que se ejecuta en 32 GB. Terminé preclasificando los datos en el servidor SQL (y agregando la fila de índice allí)

SELECT 
 ROW_NUMBER() OVER(ORDER BY [Telemetry AssetID ] 
 ,[Telemetry PointName ] 
 ,[Telemetry Timetag ] asc) Row,

       [Telemetry SiteID ] [SiteID]
      ,[Telemetry AssetID ] [AssetID]
      ,[Telemetry PointName ] [PointName]
      ,[Telemetry Timetag ] [Timetag]
      ,[Telemetry Units ] [Units]
      ,[Telemetry ELECTRICITY_MAP ] [ELECTRICITY_MAP]
      ,[Telemetry StoreID ] [StoreID]
      ,[Telemetry date_key ] [date_key]
  FROM [Telemetry]

Luego, la columna calculada se puede escribir como tal: (se muestra en dos variaciones)

kWh = 
var i = Telemetry[Row]
var t = Telemetry[Timetag]
var ap = Telemetry[AssetID] & Telemetry[PointName]
var f = filter(Telemetry,Telemetry[Row]=i-1)
var pt = SELECTCOLUMNS(f,"pt",Telemetry[Timetag])
var pv = SELECTCOLUMNS(f,"pv",Telemetry[ELECTRICITY_MAP])
var pap= SELECTCOLUMNS(f,"pap",Telemetry[AssetID] & Telemetry[PointName])
//var pt = maxx(f,Telemetry[Timetag])
//var pv = maxx(f,Telemetry[ELECTRICITY_MAP])
//var pap = maxx(f,Telemetry[AssetID] & Telemetry[PointName])
return if (ap=pap,divide(Telemetry[ELECTRICITY_MAP]+pv,120)*DATEDIFF(pt,t,MINUTE),0)

y el cálculo arroja el resultado esperado.

lbendlin_0-1602286871256.png

Gracias por el desafío. Todavía estoy desconcertado de que Power BI tenga problemas con un conjunto de datos aparentemente tan pequeño (7,8 millones de filas), pero supongo que están ocurriendo algunos productos cartesianos que explotan las necesidades de memoria. Espero que alguien más pueda encontrar una solución más rápida.

lbendlin

Suena como un cálculo integral típico. Multiplique el promedio de dos puntos de datos adyacentes por la duración entre ellos, eso le dará la cantidad de energía consumida durante ese período. Luego agréguelo hasta el nivel por hora. Se vuelve un poco confuso porque es posible que no pueda garantizar que una medición esté disponible exactamente en la parte superior de la hora, pero la granularidad de sus datos parece lo suficientemente buena como para manipularla.

Si desea ayuda con la implementación, proporcione los datos de muestra en un formato utilizable.

daviejoe

En respuesta a lbendlin

Fantástico @lbendlin

Anónimo

En respuesta a lbendlin

Hola @lbendlin

Me gustaría mucho que me ayudaran con la implementación. Parece que las habilidades necesarias están un poco por encima de mi cabeza.

¿Cómo le gustaría el formato de una muestra de datos? ¿CSV o un archivo .pbix?

lbendlin

En respuesta a Anónimo

Cualquiera de los dos está bien, pero si ya tiene el pbix iniciado, sería mejor.

Anónimo

En respuesta a lbendlin

Estupendo.

Tienes el archivo pbix aquí.

Avísame si necesitas saber algo más. ¡Gracias por adelantado!

lbendlin

En respuesta a Anónimo

¿Qué tipo de granularidad necesitas? ¿Es suficiente calcular los kWh por día, o lo necesitas más detallado? Su tabla de calendario solo tiene nivel de día, así que supongo que eso es lo que buscamos.

Por cierto, CALENDARAUTO() ya se encarga de las fechas MIN/MAX. Puede simplificar el DAX.

Calendar = 
ADDCOLUMNS (
    CALENDARAUTO( ),
    "Year", FORMAT( [DATE],"yyyy"),
    "Month", FORMAT ( [DATE], "MMM" ),
    "Month Number", FORMAT( [DATE], "M" ),
    "Weekday", FORMAT ( [DATE], "DDDD" ),
    "Weekday Number", WEEKDAY( [DATE], 2 ),
    "Quarter", "Q" & TRUNC ( ( MONTH ( [DATE] ) - 1 ) / 3 ) + 1,
    "Week Number", WEEKNUM([DATE],2),
    "Month Year", FORMAT([DATE],"MMM yy"),
    "Month Year Number", FORMAT( [DATE],"yyyy")+FORMAT( [DATE], "M" ),
    "date_key", FORMAT([DATE],"dd-mm-yyyy")
)

lbendlin

En respuesta a lbendlin

Aquí hay un primer enfoque aproximado usando una medida. Si bien técnicamente funciona, tiene un rendimiento realmente malo.

kWh = 
var tt = selectedvalue(Telemetry[Timetag])
var curr = CALCULATE(sum(Telemetry[ELECTRICITY_MAP]),allselected(Telemetry),Telemetry[Timetag]=tt)
var ttprev = CALCULATE(max(Telemetry[Timetag]),allselected(Telemetry),Telemetry[Timetag]<tt)
var prev = CALCULATE(sum(Telemetry[ELECTRICITY_MAP]),allselected(Telemetry),Telemetry[Timetag]=ttprev)
return divide(curr+prev,120)*DATEDIFF(ttprev,tt,MINUTE)

Pensando un poco más en esto, creo que realmente no se necesita una medida; una columna calculada también debería funcionar. Y también podría ayudar con el rendimiento. ¿Cuál es su nivel de granularidad máximo? ¿Es AssetID + PointName suficiente? En caso afirmativo, ¿puede producir una nueva versión del pbix que ordene la tabla de telemetría por AssetID, PointName y Timetag, y agregue una columna de índice después de eso?

lbendlin

En respuesta a lbendlin

Esto resultó ser mucho más desafiante de lo esperado. Power BI siguió quedándose sin memoria a pesar de que se ejecuta en 32 GB. Terminé preclasificando los datos en el servidor SQL (y agregando la fila de índice allí)

SELECT 
 ROW_NUMBER() OVER(ORDER BY [Telemetry AssetID ] 
 ,[Telemetry PointName ] 
 ,[Telemetry Timetag ] asc) Row,

       [Telemetry SiteID ] [SiteID]
      ,[Telemetry AssetID ] [AssetID]
      ,[Telemetry PointName ] [PointName]
      ,[Telemetry Timetag ] [Timetag]
      ,[Telemetry Units ] [Units]
      ,[Telemetry ELECTRICITY_MAP ] [ELECTRICITY_MAP]
      ,[Telemetry StoreID ] [StoreID]
      ,[Telemetry date_key ] [date_key]
  FROM [Telemetry]

Luego, la columna calculada se puede escribir como tal: (se muestra en dos variaciones)

kWh = 
var i = Telemetry[Row]
var t = Telemetry[Timetag]
var ap = Telemetry[AssetID] & Telemetry[PointName]
var f = filter(Telemetry,Telemetry[Row]=i-1)
var pt = SELECTCOLUMNS(f,"pt",Telemetry[Timetag])
var pv = SELECTCOLUMNS(f,"pv",Telemetry[ELECTRICITY_MAP])
var pap= SELECTCOLUMNS(f,"pap",Telemetry[AssetID] & Telemetry[PointName])
//var pt = maxx(f,Telemetry[Timetag])
//var pv = maxx(f,Telemetry[ELECTRICITY_MAP])
//var pap = maxx(f,Telemetry[AssetID] & Telemetry[PointName])
return if (ap=pap,divide(Telemetry[ELECTRICITY_MAP]+pv,120)*DATEDIFF(pt,t,MINUTE),0)

y el cálculo arroja el resultado esperado.

lbendlin_0-1602286871256.png

Gracias por el desafío. Todavía estoy desconcertado de que Power BI tenga problemas con un conjunto de datos aparentemente tan pequeño (7,8 millones de filas), pero supongo que están ocurriendo algunos productos cartesianos que explotan las necesidades de memoria. Espero que alguien más pueda encontrar una solución más rápida.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *