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.
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
Solved! Go to Solution.
@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 link
⭕ Subscribe and learn Power BI from these videos
⚪ Website ⚪ LinkedIn ⚪ PBI User Group
@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
⭕ Subscribe and learn Power BI from these videos
⚪ Website ⚪ LinkedIn ⚪ PBI User Group
@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 link
⭕ Subscribe and learn Power BI from these videos
⚪ Website ⚪ LinkedIn ⚪ PBI User Group
@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
⭕ Subscribe and learn Power BI from these videos
⚪ Website ⚪ LinkedIn ⚪ PBI User Group
Hey @Fowmy , first of all the code you sent works awesome! However, I've been ultimately trying to create a Triple Exponential Moving Average, and I figure I could just reuse a good part of the code to create a second and third EMA then calculate a final column to create a TEMA. It's not working out for me right now, and I'd greatly appreciate your assistance again. I've attached another sample Excel file that includes date, value, average, ema1, ema2, ema3, and Tema columns. The formulas are present, and hopefully makes sense. Thanks again!!!
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.