Forum Discussion
Exponential Moving Average in Power Query M ?
Hello! How can an exponential moving average be created in Power Query M? I already know how to do this in Excel, and DAX can be a pain in the tail. Here's a table of example data. Thank you!
Date Value
1/1/2021 0.888073856
1/2/2021 0.087243733
1/3/2021 0.597531606
1/4/2021 0.25492501
1/5/2021 0.836644673
1/6/2021 0.253785258
1/7/2021 0.757333787
1/8/2021 0.958886707
1/9/2021 0.598108137
1/10/2021 0.180565909
1/11/2021 0.788755716
1/12/2021 0.888126908
1/13/2021 0.231740519
1/14/2021 0.107410191
1/15/2021 0.648458581
1/16/2021 0.582213204
1/17/2021 0.191300599
1/18/2021 0.864502562
1/19/2021 0.583108477
jsflint
Can you share the expected value based on the sample data that you have given?
You can save the Excel file with the results in One Drive or Google Drive and share the linkHere it is
jsflint
Please find attached the PBIX file below my signature with the desired results. Basically, the solution involves a recursive operation to calculate the EMA ( Exponential Moving Average in Power Query ).
There are two columns, Average and EMA.Complete M Code:
let Source = Table.FromRows( Json.Document( Binary.Decompress( Binary.FromText( "VZLbbQRBCARz2e+TD5p3LNbln4Y5adnB3yVmmqJ/fy9+8xsEvl4X/Qghwwp2fV5fhIPY3BERuJEchFRIROmN9CAXB2Ua38gOSmEmS5Ib+UGVIdIobxQHGbsEdFLkIqlM7E/2Wu+hxDV5AjIdFmUIE58YvHQwJZX1d8OWD3PWkqL5jpeQTsim5jVsGSEEzEzGCC8lkZbO5bMdLydiZar8+OfYc17gHhy2tDi+xjrMsOVF4CQVz3WwvGSHJCedOfA+Qh8uO+qw5YWCoBJDdk24L+TBswGWFe3FJeMxhl2UXlz6eHMhbCtpndGmKFhSssvaZdYnypJC3YYyz4fVv4aBvOt8fT5/", BinaryEncoding.Base64 ), Compression.Deflate ) ), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Date = _t, Value = _t] ), #"Changed Type" = Table.TransformColumnTypes( Source, {{"Date", type date}, {"Value", type number}} ), Step1 = Table.AddIndexColumn(#"Changed Type", "Index", 0, 1, Int64.Type), Step2 = Table.AddColumn( Step1, "Average", each if [Index] > 6 then List.Average(List.Range(Step1[Value], _[Index] - 7, 7)) else null , type number), Step3 = Table.AddColumn( Step2, "EMA", each if [Index] > 6 then let start = List.First(List.RemoveNulls(Step2[Average])), vlist = List.Range(Step2[Value], 8, _[Index] - 7), acc = List.Accumulate( vlist, start, (state, current) => (current - state) * (2 / (1 + 7)) + state ) in if [Index] = 7 then start else acc else null, type number ) in Step3
4 Replies
- jsflintFrequent Visitor
Here it is
- Fowmy
Super User
jsflint
Please find attached the PBIX file below my signature with the desired results. Basically, the solution involves a recursive operation to calculate the EMA ( Exponential Moving Average in Power Query ).
There are two columns, Average and EMA.Complete M Code:
let Source = Table.FromRows( Json.Document( Binary.Decompress( Binary.FromText( "VZLbbQRBCARz2e+TD5p3LNbln4Y5adnB3yVmmqJ/fy9+8xsEvl4X/Qghwwp2fV5fhIPY3BERuJEchFRIROmN9CAXB2Ua38gOSmEmS5Ib+UGVIdIobxQHGbsEdFLkIqlM7E/2Wu+hxDV5AjIdFmUIE58YvHQwJZX1d8OWD3PWkqL5jpeQTsim5jVsGSEEzEzGCC8lkZbO5bMdLydiZar8+OfYc17gHhy2tDi+xjrMsOVF4CQVz3WwvGSHJCedOfA+Qh8uO+qw5YWCoBJDdk24L+TBswGWFe3FJeMxhl2UXlz6eHMhbCtpndGmKFhSssvaZdYnypJC3YYyz4fVv4aBvOt8fT5/", BinaryEncoding.Base64 ), Compression.Deflate ) ), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Date = _t, Value = _t] ), #"Changed Type" = Table.TransformColumnTypes( Source, {{"Date", type date}, {"Value", type number}} ), Step1 = Table.AddIndexColumn(#"Changed Type", "Index", 0, 1, Int64.Type), Step2 = Table.AddColumn( Step1, "Average", each if [Index] > 6 then List.Average(List.Range(Step1[Value], _[Index] - 7, 7)) else null , type number), Step3 = Table.AddColumn( Step2, "EMA", each if [Index] > 6 then let start = List.First(List.RemoveNulls(Step2[Average])), vlist = List.Range(Step2[Value], 8, _[Index] - 7), acc = List.Accumulate( vlist, start, (state, current) => (current - state) * (2 / (1 + 7)) + state ) in if [Index] = 7 then start else acc else null, type number ) in Step3