作为一名游戏策划,有时候需要计算某一整个月的加权留存,在Excel中可以直接用Sumproduct去计算,但是有时候需要用到Power Query中的Group功能快速整合多个月的数据,因此在PQ中,使用这一公式的需求也是有的,而M函数并不提供类似的便捷的函数。
但是我们可以通过几个函数去组合构建出类似的函数功能(完全不需要用到自建函数)
用到的函数列表如下(此处感谢B站Up孙兴华提供的免费M函数课程,我的关于PQ的一切都是来自于他):
List.Sum
List.Transform
使用示例:
List.Transform(列表,对元素进行转换的规则)
= List.Transform({1,2,3},each _+1) // 列表中每个元素+1
或者= List.Transform({1,2,3},(x)=>x+1)
List.Zip
使用示例:
List.Zip({{"孙兴华", "李小龙"}, {20, 80}}) 返回:{{"孙兴华", 20},{"李小龙",80}}
List.Product
使用示例
List.Product({1,2,3}) 返回:6
1*2*3=6
解决问题:加权计算某个月内玩家的留存数据
假设下图为1月1~4日数据,以及其对应的注册玩家数和次留,速算这4天的加权次留为 (10*0.1 + .... + 40*0.1)/ (10+20+30+40)* 100%= 12%
思路:为了实现Sumproduct中数组对应项的值能相互运算的功能,所以需要用到List.Zip把对应向项的值封装到同一个List里面,然后再利用List.Product实现列表中的元素相乘。
又因为List.Zip封装出来的结果为大列表里面装着N个小列表,所以为了能够调用这些小列表执行List.Product函数,需要用到List.Transform函数
因此最终的公式为:
= Table.Group(源,{"日期"},{"加权次留",each List.Sum(List.Transform(List.Zip({[注册玩家数],[次留]}),(x)=>List.Product(x)))/List.Sum([注册玩家数])})
得出来的结果为:
以上,得出了我们想要的结果,实现了对应的功能。
用List.Accumulate其实也可以实现类似功能,不过那个就复杂的多啦~