Power Query 中堪称最强大的函数 List.Accumulate,你会用了吗?

Power Query 中堪称最强大的函数 List.Accumulate,你会用了吗?

编码文章call10242025-10-22 21:53:543A+A-

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星球」内容合集「链接」



.

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4