Power Query (M 语言) 50 天移动平均线
Posted
技术标签:
【中文标题】Power Query (M 语言) 50 天移动平均线【英文标题】:Power Query (M language) 50 day moving Average 【发布时间】:2019-03-25 12:36:55 【问题描述】:我有一个产品列表,并希望使用 Power Query (M) 获得其销量的 50 天简单移动平均值。
表格按产品名称和日期排序。我添加了一个自定义列并应用了下面的代码。
if [date] >= #date(2018,1,29)
then List.Average(List.Range(Source[Volume],[Volume]-1,-50))
else ""
由于它已按日期和名称排序,因此应用了if
语句,其中日期作为条件/过滤器。但是,发生错误,提示
在表中未找到“卷”列。
我希望在电源查询中添加一个列,其中包含每个产品的 50 天移动平均值。如果date
大于或等于 2018 年 1 月 29 日,则要进行计算。
【问题讨论】:
在你对 horseyride 的评论中,在他下面的回答中,你说你的列名是 volume,小写 v。你上面的代码有 Volume,大写 V。 【参考方案1】:我们不知道您的列是什么,但假设您在 Source 中有 [product]、[date] 和 [volume],这将根据基于每个[日期],并放在一个新列中
AvgAmountAdded = Table.AddColumn(Source, "AverageAmount", (i) => List.Average(Table.SelectRows(Source, each ([product] = i[product] and [date]<=i[date] and [date]>=Date.AddDays(i[date],-50)))[volume]), type number)
【讨论】:
Source 有多个列,但是,对于这个问题,我认为这些只是需要的信息,[product]、[date] 和 [volume]。应用上面的代码,结果是“表”。如果展开,则显示为错误。我正在尝试理解代码并找出错误,但还没有成功。 刚刚测试过,使用列名 [product] [date] [volume] 可以完美运行——请注意每个列名的大小写如果您的版本不起作用,请发布您使用的完整代码您对“扩展”一词的使用很奇怪,因为我的代码中没有可扩展的内容 我插入了自定义列,然后粘贴了您的代码。我将尝试将“AverageAmount”更改为“Raw”(希望我做得对)以下是公式栏中的详细信息:= Table.AddColumn(#"Removed Columns1", "Custom", each Table.AddColumn(Source, " Raw", (i) => List.Average(Table.SelectRows(Source, each ([Product] = i[Product] and [date]=Date.AddDays(i[ date],-50)))[Volume]), type number)) 我正在搜索如何粘贴屏幕截图以提供更多详细信息... 你在复制代码。做主页..高级编辑器...找到您需要添加代码的位置并将我的粘贴到其中。您不添加自定义列然后粘贴我的代码,因为我的代码已经添加了一个自定义列。如果您想按照自己的方式进行操作,请添加自定义列并仅粘贴以 (i)=> 开头的部分并继续 [volume])【参考方案2】:终于!找到了解决办法。 一、按产品申请索引see this post for further details 然后在没有条件的情况下再次索引(索引所有行) 然后,应用下面的代码
= Table.AddColumn(#"Previous Step", "Volume SMA(50)", each if [Index_byProduct] >= 50 then List.Average(List.Range(#"Previous Step"[Volume], ([Index_All]-50),50)) else 0),
对于大型数据集,建议在 index-expand 步骤后使用 Table.Buffer 函数以提高 PQ 计算速度
【讨论】:
以上是关于Power Query (M 语言) 50 天移动平均线的主要内容,如果未能解决你的问题,请参考以下文章
格式Table.AddColumn(Power Query 之 M 语言)
合并函数Combiner.Combine…(Power Query 之 M 语言)
删除列Table.RemoveColumns(Power Query 之 M 语言)