打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
移动平均,移动求和,移动求最大值,...,自定义函数太多了! - Excel函数式编程
userphoto

2024.04.25 云南

关注

今天继续介绍移动平均的问题,之前的内容参见:

计算移动平均的函数 - Excel函数式编程

分组移动平均 - 计算移动平均的函数(数组版):Excel函数式编程

注:今天介绍的方法目前只能在Excel 365的测试频道中才能使用。当前频道中需要过一段时间。

问题

前面我们介绍了移动平均的自定义函数,

RollingAverage = LAMBDA(data, n, MAKEARRAY( ROWS(data), 1, LAMBDA(r, c, IF( r < n, '', AVERAGE(CHOOSEROWS(data, SEQUENCE(n, , r - n + 1))) ) ) ));

这个函数可以帮助我们计算过去n期的移动平均值,

现在,我们还想统计过去n期的合计,当然可以用同样的方法创建一个移动求和的函数,只需要将上面自定义函数中的AVERAGE改为SUM即可。

如果还想统计过去n期的最大值,也可以用同样的方法创建一个移动求最大值的函数,只需要将上面的自定义函数中的AVERAGE改为MAX即可。

类似的还可以计算移动最小值,移动中位数,标准差,等等等等。

问题在于,这样的话,我们就需要创建很多自定义函数。

而且,这些自定义函数逻辑都是一样的。

感觉很浪费。

一个函数解决问题

目前,Excel中已经推出了用函数名称作为参数的功能,我们可以利用这个功能,创建一个万能的移动聚合计算的函数。

Rolling = LAMBDA(data, n,    LAMBDA(function, MAKEARRAY(        ROWS(data),        1,        LAMBDA(r, c,            IF(                r < n,                '',                function(CHOOSEROWS(data, SEQUENCE(n, , r - n + 1)))            )        ))));

这个函数可以看作是一个嵌套,从最外层(第1行)看,形式如下:

LAMBDA(data, n,移动计算函数)

这个自定义函数的返回值是一个函数:“移动计算函数”,

其定义是另一个LAMBDA定义的自定义函数:

LAMBDA(function, MAKEARRAY( ROWS(data), 1, LAMBDA(r, c, IF( r < n, '', function(CHOOSEROWS(data, SEQUENCE(n, , r - n + 1))) ) ))));

它以“function”为参数,对过去n期的数据进行计算(第8行)。

使用

如果像普通的自定义函数一样调用的话,

= Rolling(B2:B32, 3)

将返回一个错误,

这是因为这次调用返回的是内层的自定义函数(即上面说的“移动计算函数”)。

这个函数是需要一个函数名作为参数的,

=Rolling(B2:B32, 3)(AVERAGE)

结果就是移动平均,

可以计算移动求和,

移动求最大值,

用自定义函数做参数

有些聚合计算的需求不能使用这种方式满足。比如计算过去n期中的排名第二的数。显然需要使用LARGE函数,但是LARGE函数需要第二个参数,没有办法直接作为这里的参数。

此时,可以使用自定义函数作为参数,

=Rolling(B2:B32,3)(LAMBDA(x, LARGE(x, 2)))

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
如果你有电脑,一定要死磕这21个技巧
这本揭露世界运行真相的书,越早读到越好!(力荐!!!)
摄影:游南京历史文化街区------熙南里(51)
锦溪古镇风光(22)
历年填《减兰》词11首合集
偷偷告诉你,社会的潜规则
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服