Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.

Reply
Anonymous
Not applicable

Cálculo de kWh basado en datetime y kW

Hola

Quiero calcular kWh.

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

kW.png

Me imagino que tengo que calcular alguna duración de tiempo en horas, pero no sé cómo hacer esto para poder filtrar un ID de tienda y un período de tiempo.

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

Muchas gracias.

1 ACCEPTED SOLUTION

Esto resultó ser mucho más difícil de lo esperado. Power BI se mantuvo sin memoria aunque se está ejecutando con 32 GB. Terminé preordenando los datos en SQL Server (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]

A continuación, 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 produce 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 pequeño (7,8 millones de filas), pero supongo que hay algunos productos cartesianos sucediendo que explotan las necesidades de memoria. Espero que alguien más pueda encontrar una solución más rápida.

View solution in original post

18 REPLIES 18
Syndicate_Admin
Administrator
Administrator

Gracias @lbendlin , utilicé su fórmula para la columna calculada y funciona bien. En mi caso también tuve que calcular de kW a kWh donde las lecturas (etiquetas de tiempo) no están distribuidas uniformemente (1: 1 como en el ejemplo anterior). El problema es que ahora, cuando me gustaría crear una actualización incremental, parece que las columnas calculadas no funcionan con la actualización incremental. ¿Cómo puedo cambiar la columna calculada a una medida? Supongamos que mi tabla también se llama "Telemetría", y tengo dos columnas que son "Marca de tiempo" y "Mapa de electricidad".

¡Agradecería su ayuda!

No veo una razón por la que una columna calculada no funcione con la actualización incremental: ¿tiene algo para reproducir eso?

Proporcione datos de muestra desinfectados que cubran completamente su problema. Si pega los datos en una tabla en su publicación o utiliza uno de los servicios de archivos, será más fácil trabajar con ellos. Por favor, muestre el resultado esperado.

¡Gracias por su rápida respuesta! Cuando activé la actualización incremental, hubo un error después de la actualización en los elementos visuales de que la columna calculada no tenía datos. Cuando eliminé la actualización incremental, funcionó de nuevo. Creo que es muy similar a este caso: Problema de actualización incremental: datos de columna calculados D... - Microsoft Power BI Community
Aquí hay una fracción de mi conjunto de datos: https://www.transfernow.net/dl/20220208JpCf11jW
En mi conjunto de datos completo tengo datos desde 2019 hasta hoy. Lo que me gustaría obtener kWh por día, mes y año.

Analizaré los datos, pero creo que podría ser un malentendido de cómo funciona la actualización incremental. La publicación a la que enlazas parece estar basada en el mismo malentendido.

Cada vez que realice cambios estructurales (metadatos) en un origen de datos de actualización incremental y, a continuación, publique desde Power BI Desktop en el área de trabajo, sucederá lo siguiente:

- Todas las particiones se quitan y se reemplazan por una sola partición basada en la carga (gobernada por la configuración de RangeStart y RangeEnd en Power Query, NO por la configuración de actualización incremental en Power BI)

- Si la actualización programada está habilitada para el conjunto de datos, se activa una nueva actualización. De lo contrario, no sucederá nada hasta que inicie una actualización manual

- tras esta nueva actualización , todas las particiones se vuelven a crear y volver a calcular en función de la configuración de Power BI, NO de la configuración de Power Query.

- Cualquier solicitud de actualización posterior se ejecutará en función de las reglas de actualización incremental que indicó en Power BI.

Este es el proceso básico. Los usuarios avanzados usarán consultas XMLA para actualizar selectivamente particiones individuales y usarán el kit de herramientas ALM para modificar selectivamente los metadatos.

Muy bien, lo intentaré de nuevo con la configuración de actualización incremental, tal vez arruiné algo, este es un tema muy nuevo para mí 😉

Aquí está la columna calculada que calcula la integral. La granularidad de su marca de tiempo es lo suficientemente buena como para que no tenga que preocuparse por el paso del día. El rendimiento sigue siendo malo, así que probaré Power Query a continuación.

kWh = 
var ts = 'data (1)'[Timestamp]
var pts = CALCULATE(max('data (1)'[Timestamp]),'data (1)'[Timestamp]< ode="">

Me estoy quedando sin memoria mientras realizo esta columna calculada. Agregué ahora un Índice (Fila) y lo probé con su fórmula publicada desde arriba (ligeramente adaptada) y esto funciona muy bien.

kWh =
var i = 'data (1)'[Row]
var t = 'data (1)'[Timestamp]
var f = filter('data (1),'data (1)'[Row]=i-1)
var pt = SELECTCOLUMNS(f,"pt",'data (1)'[Timestamp])
var pv = SELECTCOLUMNS(f,"pv",'data (1)'[kW])
return(divide('data (1)'[kW]+pv,120)*DATEDIFF(pt,t,MINUTE))

Sus datos tienen una granularidad inferior al minuto. Sería cauteloso sobre el uso de DATEDIFF.

@chthomama Aquí hay una buena solución que es precisa y eficiente:

Agregar columna de índice en Power Query.

Añadir columna calculada:

kWh = 
var idx= 'data'[Index]-1
var pts = COALESCE(CALCULATE(max('data'[Timestamp]),All('data'),'data'[Index]=idx),'data'[Timestamp])
var ptsw = CALCULATE(sum('data'[kW]),All('data'),'data'[Index]=idx)
return ('data'[kW]+ptsw)*12*('data'[Timestamp]-pts)

lbendlin_0-1644339487590.png

ver adjunto.

@lbendlin ¡Esto funciona muy bien! ¡Muchas gracias por tu ayuda!

lbendlin
Super User
Super User

Suena como un típico cálculo integral. Multiplicar el promedio de dos puntos de datos adyacentes por la duración entre ellos, que le dará la cantidad de energía consumida durante ese período. A continuación, aártelo hasta el nivel por hora. Se vuelve un poco difuso porque es posible que no sea capaz de 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 quejarse.

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

Fantástico @lbendlin





Did I answer your question? Mark my post as a solution!

Proud to be a Super User!




Anonymous
Not applicable

Hola @lbendlin

Me gustaría mucho que me ayudara con la implementación. Parece que las habilidades necesarias están un poco sobre mi cabeza.

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

Cualquiera de los dos está bien, pero si usted ya tiene el pbix comenzó entonces eso sería mejor.

Anonymous
Not applicable

Gran.

Tiene el archivo pbix aquí.

Avísame si necesitas saber algo más. Gracias de antemano!

¿Qué tipo de granularidad necesita? ¿Es suficiente calcular el kWh por día, o lo necesita más detallado? Su tabla de calendario sólo tiene nivel de día, así que supongo que eso es lo que vamos a buscar?

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")
)

Aquí hay un primer enfoque aproximado usando una medida. Mientras que técnicamente funciona tiene muy mal rendimiento.

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 en esto un poco más creo que una medida no es realmente necesaria - una columna calculada debe hacer también. Y también podría ayudar con el rendimiento. ¿Cuál es su nivel de granularidad definitivo: es suficiente AssetID + PointName? En caso afirmativo, ¿puede producir una nueva versión del pbix que ordene la tabla de telemetría por AssetID, PointName y Timetag y agregar una columna de índice después de eso?

Esto resultó ser mucho más difícil de lo esperado. Power BI se mantuvo sin memoria aunque se está ejecutando con 32 GB. Terminé preordenando los datos en SQL Server (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]

A continuación, 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 produce 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 pequeño (7,8 millones de filas), pero supongo que hay algunos productos cartesianos sucediendo que explotan las necesidades de memoria. Espero que alguien más pueda encontrar una solución más rápida.

Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.

April Fabric Community Update

Fabric Community Update - April 2024

Find out what's new and trending in the Fabric Community.