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.
Tengo grandes conjuntos de datos de aproximadamente 1 minuto de lecturas acumulativas de medidores de energía de varios medidores en varios hogares, y dentro de Power BI necesito calcular el intervalo para cada medidor entre cada paso de tiempo para poder mostrar el consumo de energía.
Soy relativamente nuevo en DAX y realmente estoy luchando para que esto funcione. He intentado seguir el ejemplo de este hilo, pero tengo problemas con la función EARLIER. Tampoco puedo hacer que esto funcione con los datos de ejemplo proporcionados dentro de ese subproceso, así que me pregunto si esta solución ya no es compatible con la versión actual de Power BI.
A continuación se muestra un ejemplo de los datos una vez importados y limpiados. Verá que hay cuatro columnas de lecturas acumulativas del medidor (amarillo resaltado), las marcas de tiempo (naranja resaltado) y las diferentes identificaciones de la casa (resaltadas en rojo).
¿Alguien puede ayudarme con esto? ¡Me está volviendo loco!
Solved! Go to Solution.
He actualizado su archivo pbix de muestra (ver archivo adjunto), compruebe si eso es lo que desea.
1. Cree una columna calculada como la siguiente para obtener la fecha (hora) anterior
Pre DateTime (Hour) =
CALCULATE (
MAX ( 'Trial Import'[DateTime (Hour)] ),
FILTER (
'Trial Import',
'Trial Import'[Home ID] = EARLIER ( 'Trial Import'[Home ID] )
&& 'Trial Import'[DateTime (Hour)] < EARLIER ( 'Trial Import'[DateTime (Hour)] )
)
)
2. Crear las medidas como se muestra a continuación para obtener el intervalo de agua caliente, regulada y renovable
Hot Water Interval =
VAR _prehour =
SELECTEDVALUE ( 'Trial Import'[Pre DateTime (Hour)] )
VAR _htusage =
SUM ( 'Trial Import'[Hot Water Usage] )
VAR _prehtusage =
SUMX (
FILTER (
ALLSELECTED ( 'Trial Import' ),
'Trial Import'[DateTime (Hour)] = _prehour
),
'Trial Import'[Hot Water Usage]
)
RETURN
IF ( ISBLANK ( _prehtusage ), BLANK (), _htusage - _prehtusage )
Regulated Interval =
VAR _prehour =
SELECTEDVALUE ( 'Trial Import'[Pre DateTime (Hour)] )
VAR _regusage =
SUM ( 'Trial Import'[Regulated Energy Used] )
VAR _preregusage =
SUMX (
FILTER (
ALLSELECTED ( 'Trial Import' ),
'Trial Import'[DateTime (Hour)] = _prehour
),
'Trial Import'[Regulated Energy Used]
)
RETURN
IF ( ISBLANK ( _preregusage ), BLANK (), _regusage - _preregusage )
Renewable Interval =
VAR _prehour =
SELECTEDVALUE ( 'Trial Import'[Pre DateTime (Hour)] )
VAR _reusage =
SUM ( 'Trial Import'[Unregulated Energy Used] )
VAR _prerenusage =
SUMX (
FILTER (
ALLSELECTED ( 'Trial Import' ),
'Trial Import'[DateTime (Hour)] = _prehour
),
'Trial Import'[Unregulated Energy Used]
)
RETURN
IF ( ISBLANK ( _prerenusage ), BLANK (), _reusage - _prerenusage )
Saludos
@johnlloyd45 hay muchas maneras de hacer esto y la única preocupación que tendré es el rendimiento. ¿Qué tan grande es su conjunto de datos?
El conjunto de datos eventualmente será para alrededor de 300 hogares, con una lectura de medidor cada 10 a 15 minutos, y crecerá indefinidamente. Siempre puedo limitar el tamaño del conjunto de datos archivando lecturas anteriores y manteniendo solo los últimos 12 meses más o menos de datos en Power BI. Una vez que lo tenga funcionando, también buscaría alejarme de Power BI Desktop y mover la versión hospedada en la nube, que supongo que se ocuparía mucho mejor de la gran escala.
@johnlloyd45 está recibiendo algún error? ¿Qué expresión usaste? Será más fácil si pega los datos en el formato de tabla y comparte la salida esperada.
Más información sobre el formato condicional en Microsoft Reactor
Mi última entrada de blog El poder de usar grupos de cálculo con relaciones inactivas (Parte 1) (perytus.com) Yo lo haría ❤ Elogios si mi solución ayudó. 👉 Si puede dedicar tiempo a publicar la pregunta, también puede hacer esfuerzos para felicitar a quien ayudó a resolver su problema. ¡Es una muestra de agradecimiento!
⚡ Visítenos en https://perytus.com, su ventanilla única para proyectos/formación/consultoría relacionados con Power BI.
Claro. Puede descargar un archivo de Power BI de ejemplo con una selección de los datos y tablas aquí.
https://www.dropbox.com/s/jkoweuvuw3n6649/Cumulative%20Meter%20Reading%20Example.pbix?dl=0
He probado numerosos ejemplos de publicaciones en este foro, pero no he logrado tener éxito.
En este archivo he filtrado por un solo ID de casa y he agregado los datos en valores de lectura de medidores diarios en una tabla y valores de lectura de medidores por hora en otra tabla. De esto se puede ver que las lecturas son acumulativas y, por lo tanto, no representan el consumo de energía para cada día o período por hora. A continuación se muestra un ejemplo de la tabla horaria:
Identificación de la casa | DateTime (Hora) | Uso de agua caliente | Energía regulada utilizada | Energía no regulada utilizada |
188994 | 09/05/2021 14:00 | 33972 | 4024.567 | 4377.91 |
188994 | 09/05/2021 15:00 | 33972 | 4024.834 | 4378.033 |
188994 | 09/05/2021 16:00 | 33972 | 4025.099 | 4378.158 |
188994 | 09/05/2021 17:00 | 33972 | 4025.366 | 4378.281 |
188994 | 09/05/2021 18:00 | 33972 | 4025.631 | 4378.407 |
188994 | 09/05/2021 19:00 | 33972 | 4025.898 | 4378.531 |
188994 | 09/05/2021 20:00 | 33972 | 4026.697 | 4378.651 |
Estoy buscando agregar algunas columnas calcualizadas para cada uno de los cuatro metros, que es la diferencia entre la lectura en cada momento y la lectura en el momento anterior: las columnas rojas a continuación.
Identificación de la casa | DateTime (Hora) | Uso de agua caliente | Intervalo de agua caliente | Energía regulada utilizada | Intervalo regulado | Energía no regulada utilizada | Intervalo renovable |
188994 | 09/05/2021 14:00 | 33972 | 0 | 4024.567 | 0 | 4377.91 | 0 |
188994 | 09/05/2021 15:00 | 33972 | 0 | 4024.834 | 0.267 | 4378.033 | 0.123 |
188994 | 09/05/2021 16:00 | 33972 | 0 | 4025.099 | 0.265 | 4378.158 | 0.125 |
188994 | 09/05/2021 17:00 | 33972 | 0 | 4025.366 | 0.267 | 4378.281 | 0.123 |
188994 | 09/05/2021 18:00 | 33972 | 0 | 4025.631 | 0.265 | 4378.407 | 0.126 |
188994 | 09/05/2021 19:00 | 33972 | 0 | 4025.898 | 0.267 | 4378.531 | 0.124 |
188994 | 09/05/2021 20:00 | 33972 | 0 | 4026.697 | 0.799 | 4378.651 | 0.12 |
188994 | 09/05/2021 21:00 | 33972 | 0 | 4026.994 | 0.297 | 4378.776 | 0.125 |
188994 | 09/05/2021 22:00 | 33972 | 0 | 4027.262 | 0.268 | 4378.903 | 0.127 |
188994 | 09/05/2021 23:00 | 33972 | 0 | 4027.526 | 0.264 | 4379.021 | 0.118 |
188994 | 10/05/2021 00:00 | 33972 | 0 | 4027.791 | 0.265 | 4379.144 | 0.123 |
188994 | 10/05/2021 01:00 | 33972 | 0 | 4028.579 | 0.788 | 4379.268 | 0.124 |
188994 | 10/05/2021 02:00 | 33972 | 0 | 4031.882 | 3.303 | 4379.388 | 0.12 |
188994 | 10/05/2021 03:00 | 33972 | 0 | 4032.55 | 0.668 | 4379.506 | 0.118 |
He actualizado su archivo pbix de muestra (ver archivo adjunto), compruebe si eso es lo que desea.
1. Cree una columna calculada como la siguiente para obtener la fecha (hora) anterior
Pre DateTime (Hour) =
CALCULATE (
MAX ( 'Trial Import'[DateTime (Hour)] ),
FILTER (
'Trial Import',
'Trial Import'[Home ID] = EARLIER ( 'Trial Import'[Home ID] )
&& 'Trial Import'[DateTime (Hour)] < EARLIER ( 'Trial Import'[DateTime (Hour)] )
)
)
2. Crear las medidas como se muestra a continuación para obtener el intervalo de agua caliente, regulada y renovable
Hot Water Interval =
VAR _prehour =
SELECTEDVALUE ( 'Trial Import'[Pre DateTime (Hour)] )
VAR _htusage =
SUM ( 'Trial Import'[Hot Water Usage] )
VAR _prehtusage =
SUMX (
FILTER (
ALLSELECTED ( 'Trial Import' ),
'Trial Import'[DateTime (Hour)] = _prehour
),
'Trial Import'[Hot Water Usage]
)
RETURN
IF ( ISBLANK ( _prehtusage ), BLANK (), _htusage - _prehtusage )
Regulated Interval =
VAR _prehour =
SELECTEDVALUE ( 'Trial Import'[Pre DateTime (Hour)] )
VAR _regusage =
SUM ( 'Trial Import'[Regulated Energy Used] )
VAR _preregusage =
SUMX (
FILTER (
ALLSELECTED ( 'Trial Import' ),
'Trial Import'[DateTime (Hour)] = _prehour
),
'Trial Import'[Regulated Energy Used]
)
RETURN
IF ( ISBLANK ( _preregusage ), BLANK (), _regusage - _preregusage )
Renewable Interval =
VAR _prehour =
SELECTEDVALUE ( 'Trial Import'[Pre DateTime (Hour)] )
VAR _reusage =
SUM ( 'Trial Import'[Unregulated Energy Used] )
VAR _prerenusage =
SUMX (
FILTER (
ALLSELECTED ( 'Trial Import' ),
'Trial Import'[DateTime (Hour)] = _prehour
),
'Trial Import'[Unregulated Energy Used]
)
RETURN
IF ( ISBLANK ( _prerenusage ), BLANK (), _reusage - _prerenusage )
Saludos
Hola @yingyinr,en lugar de calcular los intervalos como medidas, ¿sería posible hacerlos como columnas calculadas para poder usar la agregación para ver los datos en diferentes intervalos de tiempo?
Puede crear las columnas calculadas como se muestra a continuación para obtenerlas, encuentre los detalles en el archivo adjunto.
Column_Hot Water Interval =
VAR _prehour = 'Trial Import'[Pre DateTime (Hour)]
VAR _prehtgusage =
CALCULATE (
SUM ( 'Trial Import'[Hot Water Usage] ),
FILTER (
'Trial Import',
'Trial Import'[Home ID] = EARLIER ( 'Trial Import'[Home ID] )
&& 'Trial Import'[DateTime (Hour)] = _prehour
)
)
VAR _curhtgusage =
CALCULATE (
SUM ( 'Trial Import'[Hot Water Usage] ),
FILTER (
'Trial Import',
'Trial Import'[Home ID] = EARLIER ( 'Trial Import'[Home ID] )
&& 'Trial Import'[DateTime (Hour)] = EARLIER ( 'Trial Import'[DateTime (Hour)] )
)
)
RETURN
IF ( ISBLANK ( _prehtgusage ), BLANK (), _curhtgusage - _prehtgusage )
Column_Regulated Interval =
VAR _prehour = 'Trial Import'[Pre DateTime (Hour)]
VAR _preregusage =
CALCULATE (
SUM ( 'Trial Import'[Regulated Energy Used] ),
FILTER (
'Trial Import',
'Trial Import'[Home ID] = EARLIER ( 'Trial Import'[Home ID] )
&& 'Trial Import'[DateTime (Hour)] = _prehour
)
)
VAR _curregusage =
CALCULATE (
SUM ( 'Trial Import'[Regulated Energy Used] ),
FILTER (
'Trial Import',
'Trial Import'[Home ID] = EARLIER ( 'Trial Import'[Home ID] )
&& 'Trial Import'[DateTime (Hour)] = EARLIER ( 'Trial Import'[DateTime (Hour)] )
)
)
RETURN
IF ( ISBLANK ( _preregusage ), BLANK (), _curregusage - _preregusage )
Column_Renewable Interval =
VAR _prehour = 'Trial Import'[Pre DateTime (Hour)]
VAR _prerenusage =
CALCULATE (
SUM ( 'Trial Import'[Unregulated Energy Used] ),
FILTER (
'Trial Import',
'Trial Import'[Home ID] = EARLIER ( 'Trial Import'[Home ID] )
&& 'Trial Import'[DateTime (Hour)] = _prehour
)
)
VAR _currenusage =
CALCULATE (
SUM ( 'Trial Import'[Unregulated Energy Used] ),
FILTER (
'Trial Import',
'Trial Import'[Home ID] = EARLIER ( 'Trial Import'[Home ID] )
&& 'Trial Import'[DateTime (Hour)] = EARLIER ( 'Trial Import'[DateTime (Hour)] )
)
)
RETURN
IF ( ISBLANK ( _prerenusage ), BLANK (), _currenusage - _prerenusage )
Saludos
Gracias @yingyinr,que parece haber hecho exactamente lo que quería, sin duda para los datos por hora. Pasaré algún tiempo entendiendo lo que has hecho y viendo si también puedo hacer que funcione para agregaciones, como totales diarios, mensuales, anuales, etc.
¡Eres una leyenda!
@johnlloyd45 si desea una columna calculada (en lugar de medir), eso significa que no está afectada por el contexto del filtro. Si ese es el caso y si lo obtiene de un RDBMS (por ejemplo, MS SQL), sería mucho más eficiente hacerlo en el lado del servidor que con DAX (no es que DAX no pueda encargarse de ello, pero el rendimiento será una preocupación).
Desafortunadamente, los datos entrantes provienen de archivos CSV diarios colocados en un sitio FTP, por lo que no tengo la opción de hacer la calcualtion antes de importarlos a Power BI. Estoy feliz de hacer el calc ya sea con una Medida o una Columna... Solo necesito encontrar una manera de hacerlo. Puedo mitigar los problemas de rendimiento más adelante si es necesario.
¿Este parece ser un problema similar, aunque un poco más simple porque no tiene la complejidad adicional de las casas múltiples en el mismo conjunto de datos?
Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City
Check out the April 2024 Power BI update to learn about new features.
User | Count |
---|---|
1 | |
1 | |
1 | |
1 | |
1 |
User | Count |
---|---|
2 | |
2 | |
1 | |
1 | |
1 |