Power Query 中堪称最强大的函数 List.Accumulate,你会用了吗?
PowerQuery M语言中的List.Accumulate 函数是一个强大且灵活的迭代工具,尽管它可能不像其他列表函数那样直观,但 List.Accumulate 在处理需要依赖先前计算结果的迭代逻辑时,展现出其不可或缺的价值,堪称 PowerQuery 函数中的“隐藏神器"。
本文将带你了解 List.Accumulate 函数的语法结构和基本用法,通过具体的应用场景阐释其在实际数据转换中的威力。
List.Accumulate函数语法
List.Accumulate函数通过对列表中的每个元素执行一个累加器函数,从而从列表项中累积出一个汇总值。
基本语法如下:
List.Accumulate(
list, // 待处理的表
seed // 种子,初始值
accumulator // 累加器函数
)
其中accumulator是一个函数,接受两个参数:state(当前累积状态)和current(当前列表元素),返回新的状态。
List.Accumulate会从列表的第一个元素开始,依次将每个元素与当前状态通过 accumulator 函数结合,更新状态,直到处理完整个列表。
List.Accumulate基本用法
List.Accumulate的基本用法通常涉及简单的累积操作,比如对数字列表求和。这种用法简单直观,适合初学者快速上手。
假设你有一个数字列表 {1, 2, 3, 4, 5},需要计算它们的总和,用List.Accumulate公式如下:
List.Accumulate(
{1, 2, 3, 4, 5},
0,
(state, current) => state + current
)
对这个公式说明如下:
- list:{1, 2, 3, 4, 5},要处理的数字列表。
- seed:0,初始状态为 0。
- accumulator:(state, current) =>state + current,将当前状态 state 与当前元素相加。
执行过程如下:
即便对于求和这类简单任务,List.Accumulate 也提供了一种透明的方式来理解累积过程。虽然List.Sum() 函数对于简单求和更为简洁高效 ,但使用 List.Accumulate 进行求和能促使用户思考 seed(初始值)以及累加器(逐个添加元素)的每一步操作。
还利用这个例子,可以通过更改seed值来改变结果,假如想在100的基础上加上这个列表的累计值,只需要将seed参数改为100:
还可以根据计算逻辑更改迭代函数来实现不同的计算,比如计算这个列表中每个数字的平方之和,公式修改如下:
上面这些例子比较简单,不过这种明确的步骤对于学习该函数的根本原理非常有帮助,下面再来一个稍微复杂的用法。
记录作为 seed 和 state
通过使用记录作为 seed 和 state,seed初始化多个值,List.Accumulate 能够在一个迭代传递中同时跟踪和更新多个相关值,这非常高效。
例如在一次遍历列表中同时找出最大值、最小值、求和、计数和平均值, seed 和 state可以按如下的方式来定义。
= List.Accumulate(
{1, 2, 100, 200, -300, 20, 30},
[min=null, max=null, sum=0, count=0, avg=0],
(s, c) => [
min = List.Min({s[min], c}),
max = List.Max({s[max], c}),
sum = s[sum] + c,
count = s[count] + 1,
avg = (s[sum] + c)/(s[count] + 1) //
实时计算平均值
]
)
结果如下:
列表作为seed 和 state
List.Accumulate不仅仅用于将列表缩减为单个或多个指标记录,它还可以将一个列表转换为另一个列表。
比如筛选一个列表中大于2的数,并将符合条件的数乘以2后加入新列表,可以这样来写:
= List.Accumulate(
{0,1, 2, 3, 4, 5, 6},
{}, // 种子是一个空列表
(s, c) =>if c > 2 then List.Combine({s, {c * 2}}) else s
)
结果如下:
以上就是List.Accumulate的基本介绍,以下是该函数使用时需要注意的点:
- 对于初始值的选择,求和通常用 0,求积用 1,最大值最小值用null,文本连接用 "",列表构建用 {};
- seed的类型必须与state以及最终结果类型相匹配,否则会报错;
- 迭代函数中的两个参数state与 current不要混淆,可以为为这两个参数自定义更清晰的名称,而非通用的 s, c 或 x, y。
List.Accumulate函数的真正威力在于其处理复杂迭代逻辑和结构化数据的能力,后面会再介绍更复杂的应用场景。
我在知识星球开设了AI专栏,聚焦于探索AI在PowerBI数据分析领域的广泛应用场景,利用AI打造适合PowerBI的图表和工具,提升数据分析的效率和效果,欢迎加入,一起学习、探讨、进化,成为精通AI和Power BI的数据分析专家~
PowerBI星球的最新2024版内容合辑,值得你收藏学习:
「PowerBI星球」内容合集「链接」
.
相关文章
- Spring Boot中对接Twilio以实现发送验证码和验证短信码
- Spring Boot 3.5:这次更新让你连配置都不用写了,惊不惊喜?
- Spring Boot+Pinot实战:毫秒级实时竞价系统构建
- SpringBoot敏感配置项加密与解密实战
- SpringBoot 注解最全详解,建议收藏!
- Spring Boot 常用注解大全:从入门到进阶
- SpringBoot启动之谜:@SpringBootApplication如何让配置化繁为简
- Springboot集成Kafka原理_spring集成kafka的原理
- Spring Boot中@Data注解的深度解析与实战应用
- 大佬用1000字就把SpringBoot的配置文件讲的明明白白!