前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Power Query中批量处理操作(5)

Power Query中批量处理操作(5)

作者头像
逍遥之
发布2020-03-23 17:44:32
5240
发布2020-03-23 17:44:32
举报
文章被收录于专栏:数据技巧数据技巧

List.Generate(initial as function, condition as function, next as function,optional selector as nullable function)as list

第1参数是初始函数赋值,通常使用()=>;第2个参数是对应第1参数赋值的条件函数,在条件不符合时停止循环,如果条件设置错误会导致无限循环;第3参数是根据之前的初始及条件继而运行的函数;第4参数是可选的指定输出函数,也就是对当前步骤的初始赋值进行计算;返回的是结果是列表格式。

例:

List.Generate(()=>1,

each _<3,

each _+1)

={1,2}

解释:初始赋值公式使用()=>格式,第2参数是对赋值的数据进行判断是否小于3,如果符合在赋值数据基础上+1作为新的赋值进行循环。蓝色代表赋值(初始赋值和计算结果赋值),红色代表是否满足循环终止条件。

第一步:先用公式赋值1,判断1<3,结果是True,参与第3参数计算1+1=2

第二步:用上一步的第3参数计算结果2作为赋值,判断2<3,结果是True,参与第3参数计算2+1=3

第三步:用上一步的第3参数计算结果3作为赋值,判断3<3,结果是False,循环结束返回所有赋值过的数据(包含初始赋值,不包含最后一个不符合条件的赋值)组成列表,也就是{1,2},其中1就是初始赋值。

List.Generate(()=>1,

each _<3,

each _+1,

each _*2)

={2,4}

解释:这里再前面一样公式的基础上,加上了第4参数,第4参数也是个函数,也同样可以计算,是对输出结果的再一步计算。

List.Generate(()=>{2,0},

each_{1}<3,

each{_{0}+2,_{1}+1},

each _{0})

={2,4,6}

解释:目标结果为从2开始,循环3次并返回结果。初始赋值公式使用()=>,这里赋值的是1个具有2项的列表,列表中的第1项初始赋值为2,是作为数值计算的初始值,列表中的第2项初始赋值为0,是做循环累计数。

第一步:

第1参数

第2参数

第3参数

第4参数

{2,0}

0<3=True

{2+2,0+1}={4,1}

2

初始赋值为1个列表{2,0},判断列表的第2项,也就是0<3,结果是True则计算第3参数,计算公式为列表的第1项+2,列表的第2项+1,返回的结果是{2+2,0+1}={4,1}作为第二步的赋值,随后通过第4函数对赋值再次计算,因为初始赋值为{2,0},第4参数为返回赋值列表{2,0}的第1项,也就是2作为结果。

第二步:

第1参数

第2参数

第3参数

第4参数

{4,1}

1<3=True

{4+2,1+1}={6,2}

4

上一步第3公式的计算结果为{4,1},也就是第2步的赋值为{4,1},判断列表的第2项,也就是1<3,结果是True,返回结果是赋值列表的第1项+2,列表的第2项+1,也就是{4+2,1+1}={6,2},第4参数作为返回赋值列表的第1项,也就是{4,1}的第1项4作为结果。

第三步:

第1参数

第2参数

第3参数

第4参数

{6,2}

2<3=True

{6+2,2+1}={8,3}

6

上一步第3公式的计算结果为{6,2},也就是第3步的赋值为{6,2},判断列表的第2项,也就是2<3,结果是True,返回结果是赋值列表的第1项+2,列表的第2项+1,也就是{6+2,2+1}={8,3},第4参数作为返回赋值列表的第1项,也就是{6,2}的第1项6作为结果。

第四步:

第1参数

第2参数

第3参数

第4参数

{8,3}

3<3=False

结束循环

结束循环

上一步第3公式的计算结果为{8,3},也就是第3步的赋值为{8,3},判断列表的第2项,也就是3<3,结果是False,终止循环,返回之前的结果作为一个列表,也就是之前的最终结果{2,4,6}

我们可以举一个实例:如果一个股票现在价格是10元,目标价格是100元,需要连续多少次涨停才能达到?最终的涨停价格是多少?

涨停次数:

List.Count(

List.Generate(()=>{10,1},

each _{0}<100,

each {_{0}*1.1, _{1}+1}))

=25

List.Last(

List.Generate(()=>{10,1},

each_{0}<100,

each {_{0}*1.1, _{1}+1},

each _{1}))

=25

解释:

第一种方式是生成一个由2个列表项组成的复合列表组合,第1项为价格,第2项为次数。因为循环终止是在100元以内即终止,所以价格肯定未能达到100,还需继续+1次才能达到目标价格,但是列表的返回值包含了原始的价格10元,所以正好抵消次数的要求。

第二种方式是因为初始赋值已经为1,列表的第2项是起循环累计的功能,所以直接取最后一次循环的列表第2项即可。所以我们在循环的时候就已经对展示结果做了指定的输出,也就是第4参数返回的结果是循环次数,最终我们取循环次数累计值的最后一个,也是25。

最终涨停价格:

List.Last(

List.Generate(()=>{10,1},

each_{0}<100,

each {_{0}*1.1, _{1}+1},

each _{0}),1)*1.1

= 108.35

解释:

因为我们考虑到循环终止时还是处于100元以下,所以如果要达到100元的目标值,还需要继续加1次涨停,同理在循环的时候我们取列表的金额,在最后一次循环金额的基础上再做一次涨停价格计算。当然这里忽略小数点的保留进位问题,因为通常情况下,涨停并不是完全是10%。有时候还会有9.97%之类的。

除此之外我们还可以用Record来记录,Record相对于List的优势在于可以对于数据进行标题命名,同样以上面的例子来看。

涨停次数:

List.Count(

List.Generate(()=>[价格=10,次数=1],

each [价格]<100,

each [价格=[价格]*1.1, 次数=[次数]+1]))

=25

List.Last(

List.Generate(()=>[价格=10,次数=1],

each [价格]<100,

each [价格=[价格]*1.1, 次数=[次数]+1],

each [次数]))

=25

逻辑都是一样,只不过用记录的话是不是更能让人理解些呢?

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据技巧 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档