【问题标题】:Is there a way to force eager evaluation on Power Query M Table and Record expressions?有没有办法强制对 Power Query M 表和记录表达式进行热切评估?
【发布时间】:2019-01-11 01:12:31
【问题描述】:

我正在使用 PowerBI 进行蒙特卡罗可视化。到目前为止,我能够执行蒙特卡罗模拟,但我一直坚持创建可视化。

我创建了一个包含两列的表,即迭代和结果,它可以有任意数量的行(例如,例如 1.000)。我想在大约 20 个条形图的条形图中显示结果,但是,由于结果可以是任何数字,我必须将结果分组到 20 个范围内,我将在图表中显示。我已经完成了所有这些工作,我得到了一个漂亮的表,其中包含名称(这是范围的文本表示)、最小值、最大值以及在此范围内的迭代次数。

但后来我注意到迭代的总计数与 1.000 不匹配,我检查了为什么会这样,并且我注意到似乎重新计算了多个变量。所以我创建了一些测试代码来看看发生了什么:

    tableMinGevolg = Record.Field(Table.Min(MonteCarlo_runs, "gevolgTotaal"), "gevolgTotaal"),
    test1 = tableMinGevolg,
    test2 = tableMinGevolg,
    test3 = tableMinGevolg,

运行此代码可以/将产生 3 个不同的测试变量值。所以我去挖掘并发现 Power Query M 对 Record 和 Table 表达式使用惰性求值。由于蒙特卡洛模拟使用随机性,我认为这会导致我的问题。每次引用该表时,都会对值进行评估,随机性会产生不同的结果,这会与我的结果相混淆。

我想知道是否可以强制对变量进行热切评估,以便我可以确定在计算这些范围时不会再次执行蒙特卡洛模拟?

【问题讨论】:

    标签: powerbi powerquery m


    【解决方案1】:

    尝试使用Table.Buffer function 将表加载到内存中。

    tableMinGevolg = Table.Buffer(Record.Field(Table.Min(MonteCarlo_runs, "gevolgTotaal"), "gevolgTotaal"))
    

    【讨论】:

    • 在这种情况下使用 Table.Buffer 似乎不起作用。我终于开始尝试这个解决方案,并以多种方式进行了尝试,但对于测试变量,我仍然得到不同的结果。这行代码不起作用,因为它需要一个 Table 并且给出了一个 Record。但是在 MonteCarlo_runs 上使用 Table.Buffer 也不能解决问题。此外,创建一个新变量 MCRuns = Table.Buffer(MonteCarlo_runs) 并引用它不起作用。
    • 嗯。您的蒙特卡洛是如何计算的?有什么地方可以播种吗?
    • 我已经知道 Number.Random() 不能被播种,Power Query 的一个有趣的事情是它足够聪明,可以记住具有相同参数的函数调用,如果它被调用再次它不会重新运行该功能,而只是使用相同的结果。这对于 Number.Random() 函数来说真的很糟糕(所有调用都有相同的随机数)。我通过使用 Number.RandomBetween(0, [id])/[id] 解决了这个问题。
    • 直到现在我都无法解决我原来的问题,但我确实找到了解决方法。 Power BI 的可视化部分能够为我创建条形图,据我所知,这确实包括所有迭代,因此不再需要我自己的计算来创建它。
    猜你喜欢
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多