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.
hola
Soy bastante nuevo en el uso de PowerBI, pero me parece realmente útil en mi papel en una autoridad local con respecto a la realización de encuestas de viajes.
Me pregunto si hay alguna manera en PowerBI de calcular las emisiones de CO2 para un viaje en el que algunos de los elementos en el cálculo estarían determinados por el modo de transporte utilizado.
Tengo una tabla con los detalles de los viajes desglosados en etapas para permitir que las personas que hacen uso de diferentes modos de transporte en el transcurso de su viaje de la siguiente manera:
También tengo un cuadro que contiene la información sobre las velocidades medias y las emisiones medias de CO2 por kilómetro de la siguiente manera:
El CO2 se calcula mediante:
1. Multiplicar el tiempo necesario por la velocidad media para el modo utilizado (por ejemplo, 25*26,5) y dividir por 60 (para permitir la conversión de minutos a horas) para dar la distancia recorrida (expresada en kilómetros).
2) multiplicar la distancia recorrida por el correspondiente "Factor CO2". Esto dará kilogramos de CO2 por cada modo recorrido.
Lo que me gustaría poder hacer es calcular automáticamente la cantidad de CO2 relevante para cada fila donde la velocidad media y el factor CO2 cambiarán dependiendo del modo de transporte utilizado.
¿Alguien sabe si es posible ejecutar un cálculo como este en PowerBI y si es así cómo tendría que ser escrito para tener en cuenta los diferentes multiplicadores a utilizar?
Muchas gracias de antemano,
Andy
Solved! Go to Solution.
No @thomsona ,
Honestamente, no dejaría los datos como están. Se ve muy desordenado y tendrás algún tipo de cálculo monstous como este para obtener el CO2 total:
Column =
VAR avgSpeed1 = MAXX ( FILTER ( Factors, Factors[Mode ] = Data[Mode 1] ), Factors[Factor] )
VAR CO2_1 =
MAXX (
FILTER ( Factors, Factors[CO2 Factors. ] = Data[Mode 1] ),
Factors[Factor 2]
)
VAR res1 = Data[Time 1] * ( avgSpeed1 / 60 ) * CO2_1
VAR avgSpeed2 = MAXX ( FILTER ( Factors, Factors[Mode ] = Data[Mode 2] ), Factors[Factor] )
VAR CO2_2 =
MAXX (
FILTER ( Factors, Factors[CO2 Factors. ] = Data[Mode 2] ),
Factors[Factor 2]
)
VAR res2 = Data[Time 2] * ( avgSpeed2 / 60 ) * CO2_2
VAR avgSpeed3 = MAXX ( FILTER ( Factors, Factors[Mode ] = Data[Mode 3] ), Factors[Factor] )
VAR CO2_3 =
MAXX (
FILTER ( Factors, Factors[CO2 Factors. ] = Data[Mode 3] ),
Factors[Factor 2]
)
VAR res3 = Data[Time 3] * ( avgSpeed3 / 60 ) * CO2_3
VAR avgSpeed4 = MAXX ( FILTER ( Factors, Factors[Mode ] = Data[Mode 4] ), Factors[Factor] )
VAR CO2_4 =
MAXX (
FILTER ( Factors, Factors[CO2 Factors. ] = Data[Mode 4] ),
Factors[Factor 2]
)
VAR res4 = Data[Time 4] * ( avgSpeed3 / 60 ) * CO2_3
RETURN
COALESCE ( res1 + res2 + res3 + res4, 0 )
Cambiaría los datos de Power Query para que tuvieran un aspecto similar al siguiente:
Después puede tener fácilmente la misma matriz si es necesario
La medida tendría este aspecto:
CO2 =
VAR currTime = MAX ( '_Data'[Time] )
VAR currMode = MAX ( _Data[Mode] )
VAR currAvgSpeed = MAXX ( FILTER ( ModeFactor, ModeFactor[Mode] = currMode ), ModeFactor[AvgSpeed])
VAR currCO2 = MAXX ( FILTER ( CO2Factor, CO2Factor[Mode] = currMode ), CO2Factor[CO2] )
RETURN
currTime * ( currAvgSpeed / 60 ) * currCO2
Si esta publicación ayuda, entonces por favor considere Aceptarlo como la solución ✔️para ayudar a los otros miembros a encontrarlo más rápidamente.
hola
¿Puede compartir la consulta de energía conmigo?
Si puede, será realmente útil para comprender los pasos que utilizó para transformar los datos.
Muchas gracias
Andy
Hola Andy (@thomsona),
Claro, pero hay cosas que mencionar:
1) Utilice tablas separadas para ModeFactor y CO2Factor:
2) He limpiado su tabla de datos (columnas vacías eliminadas, no hay ningún valor en ellas) para tener una tabla de demostración adecuada:
Estos son los pasos que he usado (puede copiarlos en su archivo y ver cómo cambia la tabla paso a paso haciendo clic en Elementos de la sección Pasos aplicados):
let
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("pVJBDoIwEPzKhpMmHBTEB6hXbiQeCIelViESSlpQ+b2txoRgQReSpmm7mdmZ2caxc5D5jQMCQwlYiJI7ruMFegtbqApkHMQZ7kJe9VN/Ja4dvyHg9y0rpmK2q/8xET5yfV5T2mhLKkOp7Snt8GScynkcFSrFy8ubhq6eMpgh9T6hbShqIZlJGxaYCj3otRcwtjRSCDQjIVBoRtRQRnLEwpQMIso4pI0CVYtKX3eN+oTcq3QwX106nBNkvAKw6vjxP/ptrRz+sBe71pkB2TUnyRM=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [#"Mode 1" = _t, #"Time 1" = _t, #"Destination 1" = _t, #"Mode 2" = _t, #"Time 2" = _t, #"Destination 2" = _t, #"Mode 3" = _t, #"Time 3" = _t, #"Destination 3" = _t]),
#"Added Index" = Table.AddIndexColumn(Source, "Index", 1, 1, Int64.Type),
#"Reordered Columns1" = Table.ReorderColumns(#"Added Index",{"Index", "Mode 1", "Time 1", "Destination 1", "Mode 2", "Time 2", "Destination 2", "Mode 3", "Time 3", "Destination 3"}),
#"Changed Type" = Table.TransformColumnTypes(#"Reordered Columns1",{{"Time 1", Int64.Type}, {"Time 2", Int64.Type}, {"Time 3", Int64.Type}}),
#"Replaced Value" = Table.ReplaceValue(#"Changed Type",null,0,Replacer.ReplaceValue,{"Time 2"}),
#"Replaced Value1" = Table.ReplaceValue(#"Replaced Value",null,0,Replacer.ReplaceValue,{"Time 3"}),
#"Unpivoted Only Selected Columns" = Table.Unpivot(#"Replaced Value1", {"Mode 1", "Time 1", "Destination 1", "Mode 2", "Time 2", "Destination 2", "Mode 3", "Time 3", "Destination 3"}, "Attribute", "Value"),
#"Split Column by Delimiter" = Table.SplitColumn(#"Unpivoted Only Selected Columns", "Attribute", Splitter.SplitTextByEachDelimiter({" "}, QuoteStyle.Csv, true), {"Attribute.1", "Attribute.2"}),
#"Added Custom" = Table.AddColumn(#"Split Column by Delimiter", "Custom", each "Step " & [Attribute.2]),
#"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Attribute.2"}),
#"Reordered Columns" = Table.ReorderColumns(#"Removed Columns",{"Index", "Custom", "Attribute.1", "Value"}),
#"Renamed Columns" = Table.RenameColumns(#"Reordered Columns",{{"Custom", "Step"}, {"Index", "Transaction"}}),
#"Split Table" = Table.Split(#"Renamed Columns",3),
#"Transform tables" = List.Transform(#"Split Table", each Table.Pivot(_, List.Distinct(_[Attribute.1]), "Attribute.1", "Value")),
#"Combine tables" = Table.Combine(#"Transform tables"),
#"Changed Type1" = Table.TransformColumnTypes(#"Combine tables",{{"Time", Int64.Type}})
in
#"Changed Type1"
Si esta publicación ayuda, entonces por favor considere Aceptarlo como la solución ✔️para ayudar a los otros miembros a encontrarlo más rápidamente.
No @thomsona ,
Honestamente, no dejaría los datos como están. Se ve muy desordenado y tendrás algún tipo de cálculo monstous como este para obtener el CO2 total:
Column =
VAR avgSpeed1 = MAXX ( FILTER ( Factors, Factors[Mode ] = Data[Mode 1] ), Factors[Factor] )
VAR CO2_1 =
MAXX (
FILTER ( Factors, Factors[CO2 Factors. ] = Data[Mode 1] ),
Factors[Factor 2]
)
VAR res1 = Data[Time 1] * ( avgSpeed1 / 60 ) * CO2_1
VAR avgSpeed2 = MAXX ( FILTER ( Factors, Factors[Mode ] = Data[Mode 2] ), Factors[Factor] )
VAR CO2_2 =
MAXX (
FILTER ( Factors, Factors[CO2 Factors. ] = Data[Mode 2] ),
Factors[Factor 2]
)
VAR res2 = Data[Time 2] * ( avgSpeed2 / 60 ) * CO2_2
VAR avgSpeed3 = MAXX ( FILTER ( Factors, Factors[Mode ] = Data[Mode 3] ), Factors[Factor] )
VAR CO2_3 =
MAXX (
FILTER ( Factors, Factors[CO2 Factors. ] = Data[Mode 3] ),
Factors[Factor 2]
)
VAR res3 = Data[Time 3] * ( avgSpeed3 / 60 ) * CO2_3
VAR avgSpeed4 = MAXX ( FILTER ( Factors, Factors[Mode ] = Data[Mode 4] ), Factors[Factor] )
VAR CO2_4 =
MAXX (
FILTER ( Factors, Factors[CO2 Factors. ] = Data[Mode 4] ),
Factors[Factor 2]
)
VAR res4 = Data[Time 4] * ( avgSpeed3 / 60 ) * CO2_3
RETURN
COALESCE ( res1 + res2 + res3 + res4, 0 )
Cambiaría los datos de Power Query para que tuvieran un aspecto similar al siguiente:
Después puede tener fácilmente la misma matriz si es necesario
La medida tendría este aspecto:
CO2 =
VAR currTime = MAX ( '_Data'[Time] )
VAR currMode = MAX ( _Data[Mode] )
VAR currAvgSpeed = MAXX ( FILTER ( ModeFactor, ModeFactor[Mode] = currMode ), ModeFactor[AvgSpeed])
VAR currCO2 = MAXX ( FILTER ( CO2Factor, CO2Factor[Mode] = currMode ), CO2Factor[CO2] )
RETURN
currTime * ( currAvgSpeed / 60 ) * currCO2
Si esta publicación ayuda, entonces por favor considere Aceptarlo como la solución ✔️para ayudar a los otros miembros a encontrarlo más rápidamente.
hola
¿Puede compartir la consulta de energía conmigo?
Si puede, será realmente útil para comprender los pasos que utilizó para transformar los datos.
Muchas gracias
Andy
Hola Andy (@thomsona),
Claro, pero hay cosas que mencionar:
1) Utilice tablas separadas para ModeFactor y CO2Factor:
2) He limpiado su tabla de datos (columnas vacías eliminadas, no hay ningún valor en ellas) para tener una tabla de demostración adecuada:
Estos son los pasos que he usado (puede copiarlos en su archivo y ver cómo cambia la tabla paso a paso haciendo clic en Elementos de la sección Pasos aplicados):
let
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("pVJBDoIwEPzKhpMmHBTEB6hXbiQeCIelViESSlpQ+b2txoRgQReSpmm7mdmZ2caxc5D5jQMCQwlYiJI7ruMFegtbqApkHMQZ7kJe9VN/Ja4dvyHg9y0rpmK2q/8xET5yfV5T2mhLKkOp7Snt8GScynkcFSrFy8ubhq6eMpgh9T6hbShqIZlJGxaYCj3otRcwtjRSCDQjIVBoRtRQRnLEwpQMIso4pI0CVYtKX3eN+oTcq3QwX106nBNkvAKw6vjxP/ptrRz+sBe71pkB2TUnyRM=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [#"Mode 1" = _t, #"Time 1" = _t, #"Destination 1" = _t, #"Mode 2" = _t, #"Time 2" = _t, #"Destination 2" = _t, #"Mode 3" = _t, #"Time 3" = _t, #"Destination 3" = _t]),
#"Added Index" = Table.AddIndexColumn(Source, "Index", 1, 1, Int64.Type),
#"Reordered Columns1" = Table.ReorderColumns(#"Added Index",{"Index", "Mode 1", "Time 1", "Destination 1", "Mode 2", "Time 2", "Destination 2", "Mode 3", "Time 3", "Destination 3"}),
#"Changed Type" = Table.TransformColumnTypes(#"Reordered Columns1",{{"Time 1", Int64.Type}, {"Time 2", Int64.Type}, {"Time 3", Int64.Type}}),
#"Replaced Value" = Table.ReplaceValue(#"Changed Type",null,0,Replacer.ReplaceValue,{"Time 2"}),
#"Replaced Value1" = Table.ReplaceValue(#"Replaced Value",null,0,Replacer.ReplaceValue,{"Time 3"}),
#"Unpivoted Only Selected Columns" = Table.Unpivot(#"Replaced Value1", {"Mode 1", "Time 1", "Destination 1", "Mode 2", "Time 2", "Destination 2", "Mode 3", "Time 3", "Destination 3"}, "Attribute", "Value"),
#"Split Column by Delimiter" = Table.SplitColumn(#"Unpivoted Only Selected Columns", "Attribute", Splitter.SplitTextByEachDelimiter({" "}, QuoteStyle.Csv, true), {"Attribute.1", "Attribute.2"}),
#"Added Custom" = Table.AddColumn(#"Split Column by Delimiter", "Custom", each "Step " & [Attribute.2]),
#"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Attribute.2"}),
#"Reordered Columns" = Table.ReorderColumns(#"Removed Columns",{"Index", "Custom", "Attribute.1", "Value"}),
#"Renamed Columns" = Table.RenameColumns(#"Reordered Columns",{{"Custom", "Step"}, {"Index", "Transaction"}}),
#"Split Table" = Table.Split(#"Renamed Columns",3),
#"Transform tables" = List.Transform(#"Split Table", each Table.Pivot(_, List.Distinct(_[Attribute.1]), "Attribute.1", "Value")),
#"Combine tables" = Table.Combine(#"Transform tables"),
#"Changed Type1" = Table.TransformColumnTypes(#"Combine tables",{{"Time", Int64.Type}})
in
#"Changed Type1"
Si esta publicación ayuda, entonces por favor considere Aceptarlo como la solución ✔️para ayudar a los otros miembros a encontrarlo más rápidamente.
HAY @ERD
Muchas gracias por enviar que más de tan rápidamente y por la ayuda con este.
Si tengo alguna pregunta, me pongo en contacto.
Andy
hola
Muchos thamks para sugerir el uso de Power Query, ya que esto es algo que no había considerado usar.
Este parece el camino a seguir en este sentido.
salud
Andy
Ahí, @thomsona
De acuerdo con su descripción, creo que puede crear algunas columnas para co1, co2, co3, co4.
Como este(Sólo cambiar 1234):columna co1
co1 =
VAR a =
MAXX ( FILTER ( Factors, [Mode ] = EARLIER ( Data[Mode 1] ) ), [Factor] )
VAR b =
MAXX (
FILTER ( 'data (2)', [CO2 Factors. ] = EARLIER ( Data[Mode 1] ) ),
[Factor 2]
)
RETURN
[Time 1] * ( a / 60 ) * b
Saludos
Janey Guo
Si este post ayuda,entonces por favor considere Aceptarlo como la solución para ayudar a los otros miembros a encontrarlo más rápidamente.
Muchas gracias por echar un vistazo a esto para mí y por proporcionar una solución a cómo resolver esto.
Voy a echar un vistazo a lo que usted ha sugerido y probarlo.
Espero que esta sea una oportunidad de aprendizaje muy útil para mí.
Saludos cordiales
Andy
Tengo un archivo a.pbix, pero no estoy seguro de cómo compartir esto.
hola
Los datos de ejemplo son los siguientes:
Modo 1 | Tiempo 1 | Destino 1 | Otros 1 | Modo 2 | Tiempo 2 | Destino 2 | Modo 3 | Tiempo 3 | Modo 4 | Tiempo 4 | Destino 4 |
Conducir un coche solo | 25 | Mi lugar de trabajo | |||||||||
Conducir un coche solo | 45 | Mi lugar de trabajo | |||||||||
ciclo | 45 | Mi lugar de trabajo | |||||||||
ciclo | 60 | Mi lugar de trabajo | |||||||||
taxi | 15 | Mi lugar de trabajo | |||||||||
Coche compartido como conductor | 15 | Mi lugar de trabajo | |||||||||
Compartir coche como pasajero | 10 | Mi lugar de trabajo | |||||||||
taxi | 25 | Mi lugar de trabajo | |||||||||
Coche compartido como conductor | 30 | Mi lugar de trabajo | |||||||||
Motocicleta (por encima de 125cc) | 20 | Mi lugar de trabajo | |||||||||
Compartir coche como pasajero | 20 | Mi lugar de trabajo | |||||||||
Motocicleta (por encima de 125cc) | 15 | Mi lugar de trabajo | |||||||||
caminar | 5 | La parada de autobús | autobús | 25 | La parada de autobús | caminar | 5 | Mi lugar de trabajo | |||
caminar | 15 | Mi lugar de trabajo | |||||||||
caminar | 20 | La parada de autobús | autobús | 10 | Mi lugar de trabajo | ||||||
caminar | 15 | La parada de autobús | autobús | 35 | La parada de autobús | caminar | 15 | Mi lugar de trabajo | |||
caminar | 5 | La parada de autobús | autobús | 25 | La parada de autobús | 0 | caminar | 10 | Mi lugar de trabajo |
Los factores que se utilizan para calcular las emisiones son los siguientes:
Modo Velocidades medias, expresadas en kilómetros por hora: | Factores de CO2. Estos se expresan como kilogramos de CO2 por pasajero y kilómetro: | ||||
caminar | 4.80 | subterráneo | 0.065 | ||
ciclo | 20.0 | Dlr | 0.075 | ||
subterráneo | 33.0 | tranvía | 0.042 | ||
Dlr | 25.0 | Tren de cercanías | 0.062 | ||
tranvía | 22.7 | autobús | 0.081 | ||
Tren de cercanías | 40.0 | Conducir un coche solo | 0.206 | ||
autobús | 15.5 | taxi | 0.168 | ||
Conducir un coche solo | 26.5 | patinete | 0.073 | ||
taxi | 26.5 | Motocicleta (por encima de 125cc) | 0.112 | ||
patinete | 26.5 | Barco | desconocido | ||
Motocicleta (por encima de 125cc) | 26.5 | Coche compartido como conductor | 0.129 | ||
Barco | 19.0 | Compartir coche como pasajero | 0.129 | ||
Coche compartido como conductor | 26.5 | Motocicleta (por debajo de 125cc) | 0.112 | ||
Compartir coche como pasajero | 26.5 | ||||
Motocicleta (por debajo de 125cc) | 26.5 | ||||
Parque y paseo | 15.5 |
Esperemos que ambos sean útiles.
Andy
Espero que se pueda acceder a ellos y sean útiles para tratar de ayudarme en esto.
https://www.dropbox.com/s/q7f38ukirascnsg/CO2%20Calculation%20test.pbix?dl=0
@thomsona ,Puede compartir datos de muestra y salida de muestra en formato de tabla? O un pbix de ejemplo después de eliminar datos confidenciales.
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 |
---|---|
2 | |
1 | |
1 | |
1 | |
1 |
User | Count |
---|---|
2 | |
2 | |
2 | |
2 | |
1 |