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

Microsoft is giving away 50,000 FREE Microsoft Certification exam vouchers. Get Fabric certified for FREE! Learn more

Reply
guruscz
Frequent Visitor

Non additive measure - advanced weighted average

Hi all, 

 

I am building weighted average based on several conditions. Below is the measure which is calculationg the weighted average of power based on real generation of power plant which is in past till today basically the rest of rows is 0 for future. and price of hedge which is calculated for past and future. The formula is doing both and in rows in matrix it looks good the values and if I calculate it in excel it match. Problem is the TOTAL average in matrix which is giving incorect value. 

 

VAR hedge_volume = 
        SUMX(
            FILTER(DealGroupPWR, NOT DealGroupPWR[StrategyID] IN {1, 2, 3}),
            DealGroupPWR[GROUP_TotalVolumeMW])
VAR real_generation = 
        SUMX(
            FILTER(DealGroupPWR, DealGroupPWR[StrategyID] IN {1, 2, 3}),
            DealGroupPWR[_GenerationHedgeVolume])

VAR GeneHedgeVolume =
        SUMX(DealGroupPWR,
            DealGroupPWR[_GenerationHedgeVolume])
VAR diff = 
        (real_generation - hedge_volume)

VAR eur_hedge = 
            [EUR/MWh_onlyhedge] --measure of hedge price per mwh
VAR eur_realgen = 
            [EUR/MWh_onlyrealgen] --measure of real gen price per mwh


VAR calc_weight = IF(real_generation = 0, GeneHedgeVolume, real_generation)

RETURN   

        ((hedge_volume * eur_hedge) + (diff * eur_realgen)) / GeneHedgeVolume

 

1 ACCEPTED SOLUTION
guruscz
Frequent Visitor

In the end I fix the problem it was all coming from diff calculation. So I had to split the diff calculation like below

VAR hedge_volume = 
        SUMX(
            FILTER(DealGroupPWR, NOT DealGroupPWR[StrategyID] IN {1, 2, 3}),
            DealGroupPWR[GROUP_TotalVolumeMW])
VAR real_generation = 
        SUMX(
            FILTER(DealGroupPWR, DealGroupPWR[StrategyID] IN {1, 2, 3}),
            DealGroupPWR[GenerationHedgeVolume])

VAR diff = 
        IF(real_generation = 0, 0, real_generation - hedge_volume)
RETURN
    IF(HASONEVALUE('delivery date'[date]), diff, 
        SUMX(
            VALUES('delivery date'[date]),
            IF(
                CALCULATE(SUMX(FILTER(DealGroupPWR, DealGroupPWR[StrategyID] IN {1, 2, 3}), DealGroupPWR[GenerationHedgeVolume])) = 0,
                0, 
                -- real generation condition
                CALCULATE(SUMX(FILTER(DealGroupPWR, DealGroupPWR[StrategyID] IN {1, 2, 3}), DealGroupPWR[GenerationHedgeVolume])) - 
                -- real generation volume
                CALCULATE(SUMX(FILTER(DealGroupPWR, NOT DealGroupPWR[StrategyID] IN {1, 2, 3}), DealGroupPWR[GROUP_TotalVolumeMW]))
            )   -- hedge volume
        )
    )

 

View solution in original post

6 REPLIES 6
guruscz
Frequent Visitor

In the end I fix the problem it was all coming from diff calculation. So I had to split the diff calculation like below

VAR hedge_volume = 
        SUMX(
            FILTER(DealGroupPWR, NOT DealGroupPWR[StrategyID] IN {1, 2, 3}),
            DealGroupPWR[GROUP_TotalVolumeMW])
VAR real_generation = 
        SUMX(
            FILTER(DealGroupPWR, DealGroupPWR[StrategyID] IN {1, 2, 3}),
            DealGroupPWR[GenerationHedgeVolume])

VAR diff = 
        IF(real_generation = 0, 0, real_generation - hedge_volume)
RETURN
    IF(HASONEVALUE('delivery date'[date]), diff, 
        SUMX(
            VALUES('delivery date'[date]),
            IF(
                CALCULATE(SUMX(FILTER(DealGroupPWR, DealGroupPWR[StrategyID] IN {1, 2, 3}), DealGroupPWR[GenerationHedgeVolume])) = 0,
                0, 
                -- real generation condition
                CALCULATE(SUMX(FILTER(DealGroupPWR, DealGroupPWR[StrategyID] IN {1, 2, 3}), DealGroupPWR[GenerationHedgeVolume])) - 
                -- real generation volume
                CALCULATE(SUMX(FILTER(DealGroupPWR, NOT DealGroupPWR[StrategyID] IN {1, 2, 3}), DealGroupPWR[GROUP_TotalVolumeMW]))
            )   -- hedge volume
        )
    )

 

v-bmanikante
Community Support
Community Support

Hi @guruscz,

 

As we haven’t heard back from you, we wanted to kindly follow up to check if the solution provided for the issue worked? or Let us know if you need any further assistance?


If our response addressed, please mark it as Accept as solution and click Yes if you found it helpful.

 

Regards,

B Manikanteswara Reddy

v-vpabbu
Community Support
Community Support

Hi @guruscz,

 

Can you Please try the below measure:

 

adv_wt_avg =
VAR hedge_volume =
    SUMX(
        FILTER(DealGroupPWR, NOT DealGroupPWR[StrategyID] IN {1, 2, 3}),
        DealGroupPWR[GROUP_TotalVolumeMW]
    )



VAR real_generation =
    SUMX(
        FILTER(DealGroupPWR, DealGroupPWR[StrategyID] IN {1, 2, 3}),
        DealGroupPWR[_GenerationHedgeVolume]
    )



VAR GeneHedgeVolume =
    SUMX(DealGroupPWR, DealGroupPWR[_GenerationHedgeVolume])



VAR diff = (real_generation - hedge_volume)



VAR eur_hedge = [EUR/MWh_onlyhedge]  
VAR eur_realgen = [EUR/MWh_onlyrealgen]  



VAR calc_weight = IF(real_generation = 0, GeneHedgeVolume, real_generation)



-- Calculate weighted average per row
VAR WeightedAvg =
    DIVIDE(
        (hedge_volume * eur_hedge) + (diff * eur_realgen),
        GeneHedgeVolume
    )




VAR WeightedAvg_Total =
    DIVIDE(
        SUMX(
            ALLSELECTED(DealGroupPWR[Date]),  
            VAR hedge_volume_per_date =
                SUMX(
                    FILTER(DealGroupPWR, NOT DealGroupPWR[StrategyID] IN {1, 2, 3}),
                    DealGroupPWR[GROUP_TotalVolumeMW]
                )
            VAR real_generation_per_date =
                SUMX(
                    FILTER(DealGroupPWR, DealGroupPWR[StrategyID] IN {1, 2, 3}),
                    DealGroupPWR[_GenerationHedgeVolume]
                )
            VAR GeneHedgeVolume_per_date =
                SUMX(DealGroupPWR, DealGroupPWR[_GenerationHedgeVolume])
            VAR diff_per_date = real_generation_per_date - hedge_volume_per_date



            RETURN 
                (hedge_volume_per_date * eur_hedge) + (diff_per_date * eur_realgen)
        ),
        SUMX(ALLSELECTED(DealGroupPWR[Date]), GeneHedgeVolume), 
        0  
    )



RETURN
    IF(
        ISINSCOPE(DealGroupPWR[Date]),
        WeightedAvg,   
        WeightedAvg_Total  
    )

 

 Regards,

Vinay Pabbu

techies
Resolver V
Resolver V

Hi @guruscz please check this 

 

new = VAR hedge_volume =
        SUMX(
            FILTER(DealGroupPWR, NOT DealGroupPWR[StrategyID] IN {1, 2, 3}),
            DealGroupPWR[GROUP_TotalVolumeMW])

VAR real_generation =
        SUMX(
            FILTER(DealGroupPWR, DealGroupPWR[StrategyID] IN {1, 2, 3}),
            DealGroupPWR[_GenerationHedgeVolume])

VAR GeneHedgeVolume =
        SUMX(DealGroupPWR,
            DealGroupPWR[_GenerationHedgeVolume])

VAR diff =
        (real_generation - hedge_volume)

VAR eur_hedge =
            [EUR/MWh_onlyhedge] --measure of hedge price per mwh
VAR eur_realgen =
            [EUR/MWh_onlyrealgen] --measure of real gen price per mwh

VAR calc_weight = IF(real_generation = 0, GeneHedgeVolume, real_generation)

-- Handle total row separately
VAR WeightedAvg =
    ((hedge_volume * eur_hedge) + (diff * eur_realgen)) / GeneHedgeVolume

VAR WeightedAvg_Total =
    SUMX(
        VALUES(DealGroupPWR[Date]),  -- Iterates over dates to calculate row-wise
        ((hedge_volume * eur_hedge) + (diff * eur_realgen)) / GeneHedgeVolume
    )

RETURN
    IF(
        ISINSCOPE(DealGroupPWR[Date]),
        WeightedAvg,   
        WeightedAvg_Total  
    )
bhanu_gautam
Super User
Super User

@guruscz , Try using

VAR hedge_volume =
SUMX(
FILTER(DealGroupPWR, NOT DealGroupPWR[StrategyID] IN {1, 2, 3}),
DealGroupPWR[GROUP_TotalVolumeMW]
)
VAR real_generation =
SUMX(
FILTER(DealGroupPWR, DealGroupPWR[StrategyID] IN {1, 2, 3}),
DealGroupPWR[_GenerationHedgeVolume]
)
VAR GeneHedgeVolume =
SUMX(DealGroupPWR,
DealGroupPWR[_GenerationHedgeVolume]
)
VAR diff =
(real_generation - hedge_volume)

VAR eur_hedge =
[EUR/MWh_onlyhedge] --measure of hedge price per mwh
VAR eur_realgen =
[EUR/MWh_onlyrealgen] --measure of real gen price per mwh

VAR calc_weight = IF(real_generation = 0, GeneHedgeVolume, real_generation)

VAR row_weighted_avg =
SUMX(
DealGroupPWR,
((DealGroupPWR[GROUP_TotalVolumeMW] * [EUR/MWh_onlyhedge]) +
((DealGroupPWR[_GenerationHedgeVolume] - DealGroupPWR[GROUP_TotalVolumeMW]) * [EUR/MWh_onlyrealgen])) /
DealGroupPWR[_GenerationHedgeVolume]
)

RETURN
row_weighted_avg




Did I answer your question? Mark my post as a solution! And Kudos are appreciated

Proud to be a Super User!




LinkedIn






Hi Bhanu, unfortunetally that did not worked and I am getting Nan erro for all rows. In my original calculation I am getting in rows values aroun 100 eur per mwh, and then the total is 10...but should be around the 100 if I calculate it manually. 

Helpful resources

Announcements
Notebook Gallery Carousel1

NEW! Community Notebooks Gallery

Explore and share Fabric Notebooks to boost Power BI insights in the new community notebooks gallery.

April2025 Carousel

Fabric Community Update - April 2025

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

"); $(".slidesjs-pagination" ).prependTo(".pagination_sec"); $(".slidesjs-pagination" ).append("
"); $(".slidesjs-play.slidesjs-navigation").appendTo(".playpause_sec"); $(".slidesjs-stop.slidesjs-navigation").appendTo(".playpause_sec"); $(".slidesjs-pagination" ).append(""); $(".slidesjs-pagination" ).append(""); } catch(e){ } /* End: This code is added by iTalent as part of iTrack COMPL-455 */ $(".slidesjs-previous.slidesjs-navigation").attr('tabindex', '0'); $(".slidesjs-next.slidesjs-navigation").attr('tabindex', '0'); /* start: This code is added by iTalent as part of iTrack 1859082 */ $('.slidesjs-play.slidesjs-navigation').attr('id','playtitle'); $('.slidesjs-stop.slidesjs-navigation').attr('id','stoptitle'); $('.slidesjs-play.slidesjs-navigation').attr('role','tab'); $('.slidesjs-stop.slidesjs-navigation').attr('role','tab'); $('.slidesjs-play.slidesjs-navigation').attr('aria-describedby','tip1'); $('.slidesjs-stop.slidesjs-navigation').attr('aria-describedby','tip2'); /* End: This code is added by iTalent as part of iTrack 1859082 */ }); $(document).ready(function() { if($("#slides .item").length < 2 ) { /* Fixing Single Slide click issue (commented following code)*/ // $(".item").css("left","0px"); $(".item.slidesjs-slide").attr('style', 'left:0px !important'); $(".slidesjs-stop.slidesjs-navigation").trigger('click'); $(".slidesjs-previous").css("display", "none"); $(".slidesjs-next").css("display", "none"); } var items_length = $(".item.slidesjs-slide").length; $(".slidesjs-pagination-item > button").attr("aria-setsize",items_length); $(".slidesjs-next, .slidesjs-pagination-item button").attr("tabindex","-1"); $(".slidesjs-pagination-item button").attr("role", "tab"); $(".slidesjs-previous").attr("tabindex","-1"); $(".slidesjs-next").attr("aria-hidden","true"); $(".slidesjs-previous").attr("aria-hidden","true"); $(".slidesjs-next").attr("aria-label","Next"); $(".slidesjs-previous").attr("aria-label","Previous"); //$(".slidesjs-stop.slidesjs-navigation").attr("role","button"); //$(".slidesjs-play.slidesjs-navigation").attr("role","button"); $(".slidesjs-pagination").attr("role","tablist").attr("aria-busy","true"); $("li.slidesjs-pagination-item").attr("role","list"); $(".item.slidesjs-slide").attr("tabindex","-1"); $(".item.slidesjs-slide").attr("aria-label","item"); /*$(".slidesjs-stop.slidesjs-navigation").on('click', function() { var itemNumber = parseInt($('.slidesjs-pagination-item > a.active').attr('data-slidesjs-item')); $($('.item.slidesjs-slide')[itemNumber]).find('.c-call-to-action').attr('tabindex', '0'); });*/ $(".slidesjs-stop.slidesjs-navigation, .slidesjs-pagination-item > button").on('click keydown', function() { $.each($('.item.slidesjs-slide'),function(i,el){ $(el).find('.c-call-to-action').attr('tabindex', '-1'); }); var itemNumber = parseInt($('.slidesjs-pagination-item > button.active').attr('data-slidesjs-item')); $($('.item.slidesjs-slide')[itemNumber]).find('.c-call-to-action').attr('tabindex', '0'); }); $(".slidesjs-play.slidesjs-navigation").on('click', function() { $.each($('.item.slidesjs-slide'),function(i,el){ $(el).find('.c-call-to-action').attr('tabindex', '-1'); }); }); $(".slidesjs-pagination-item button").keyup(function(e){ var keyCode = e.keyCode || e.which; if (keyCode == 9) { e.preventDefault(); $(".slidesjs-stop.slidesjs-navigation").trigger('click').blur(); $("button.active").focus(); } }); $(".slidesjs-play").on("click",function (event) { if (event.handleObj.type === "click") { $(".slidesjs-stop").focus(); } else if(event.handleObj.type === "keydown"){ if (event.which === 13 && $(event.target).hasClass("slidesjs-play")) { $(".slidesjs-stop").focus(); } } }); $(".slidesjs-stop").on("click",function (event) { if (event.handleObj.type === "click") { $(".slidesjs-play").focus(); } else if(event.handleObj.type === "keydown"){ if (event.which === 13 && $(event.target).hasClass("slidesjs-stop")) { $(".slidesjs-play").focus(); } } }); $(".slidesjs-pagination-item").keydown(function(e){ switch (e.which){ case 37: //left arrow key $(".slidesjs-previous.slidesjs-navigation").trigger('click'); e.preventDefault(); break; case 39: //right arrow key $(".slidesjs-next.slidesjs-navigation").trigger('click'); e.preventDefault(); break; default: return; } $(".slidesjs-pagination-item button.active").focus(); }); }); // Start This code is added by iTalent as part of iTrack 1859082 $(document).ready(function(){ $("#tip1").attr("aria-hidden","true").addClass("hidden"); $("#tip2").attr("aria-hidden","true").addClass("hidden"); $(".slidesjs-stop.slidesjs-navigation, .slidesjs-play.slidesjs-navigation").attr('title', ''); $("a#playtitle").focus(function(){ $("#tip1").attr("aria-hidden","false").removeClass("hidden"); }); $("a#playtitle").mouseover(function(){ $("#tip1").attr("aria-hidden","false").removeClass("hidden"); }); $("a#playtitle").blur(function(){ $("#tip1").attr("aria-hidden","true").addClass("hidden"); }); $("a#playtitle").mouseleave(function(){ $("#tip1").attr("aria-hidden","true").addClass("hidden"); }); $("a#play").keydown(function(ev){ if (ev.which ==27) { $("#tip1").attr("aria-hidden","true").addClass("hidden"); ev.preventDefault(); return false; } }); $("a#stoptitle").focus(function(){ $("#tip2").attr("aria-hidden","false").removeClass("hidden"); }); $("a#stoptitle").mouseover(function(){ $("#tip2").attr("aria-hidden","false").removeClass("hidden"); }); $("a#stoptitle").blur(function(){ $("#tip2").attr("aria-hidden","true").addClass("hidden"); }); $("a#stoptitle").mouseleave(function(){ $("#tip2").attr("aria-hidden","true").addClass("hidden"); }); $("a#stoptitle").keydown(function(ev){ if (ev.which ==27) { $("#tip2").attr("aria-hidden","true").addClass("hidden"); ev.preventDefault(); return false; } }); }); // End This code is added by iTalent as part of iTrack 1859082
Top Kudoed Authors