通过布尔值(PowerBI、Python)在表中定义日期周期

Posted

技术标签:

【中文标题】通过布尔值(PowerBI、Python)在表中定义日期周期【英文标题】:Defining date cycles in a table via a Boolean (PowerBI, Python) 【发布时间】:2021-03-24 20:10:56 【问题描述】:

考虑下表,它由 DateItem 列组成:

Date Item
April 2 X
April 3 X
April 5 X
April 11 X
April 12 X
April 14 X
April 20 X
April 2 Y
April 3 Y
April 9 Y
April 11 Y
April 12 Y
April 14 Y

我想添加一个名为 StartFlag 的附加列,其中包含指示项目是否“进入”此列表的布尔值,通过“进入”我们了解以下内容:

一个项目“进入”如果它在过去 5 天内不在列表中。

因此,上表应得出以下结果:

Date Item StartFlag
April 2 X TRUE
April 3 X FALSE
April 5 X FALSE
April 11 X TRUE
April 12 X FALSE
April 14 X FALSE
April 20 X TRUE
April 2 Y TRUE
April 3 Y FALSE
April 9 Y TRUE
April 11 Y FALSE
April 12 Y FALSE
April 14 Y FALSE

有人在 PowerBI 中有解决此问题的方法吗? (我可以在我的数据上运行 Python 脚本,这样也可以找到解决方案。)

谢谢。 -- 京东

【问题讨论】:

您要在DAXPowerQuery 中执行此操作吗? 您好,我们将不胜感激任何解决方案 【参考方案1】:

这是一个DAX 解决方案。我稍微更改了您的数据,以使用完整格式的数据。

表格

Date Item
02/04/2021 X
03/04/2021 X
05/04/2021 X
11/04/2021 X
12/04/2021 X
14/04/2021 X
20/04/2021 X
02/04/2021 Y
03/04/2021 Y
09/04/2021 Y
11/04/2021 Y
12/04/2021 Y
14/04/2021 Y

计算列

StartFlag =
VAR SelectedItem = [Item]
VAR SelectedDate = [Date]
VAR PreviousDate =
    MAXX (
        FILTER ( 'Table', [Date] < SelectedDate && [Item] = SelectedItem ),
        [Date]
    )
VAR DateDifference = SelectedDate - PreviousDate
RETURN
    DateDifference >= 5

输出

Date Item StartFlag
02 April 2021 X True
03 April 2021 X False
05 April 2021 X False
11 April 2021 X True
12 April 2021 X False
14 April 2021 X False
20 April 2021 X True
02 April 2021 Y True
03 April 2021 Y False
09 April 2021 Y True
11 April 2021 Y False
12 April 2021 Y False
14 April 2021 Y False

【讨论】:

你们也能提供 PowerQuery 解决方案吗?【参考方案2】:

这是Power Query 解决方案。您可以忽略Source 步骤,这是来自Enter Data 功能的数据。

步骤

    缓冲您将多次使用的表始终是一个好习惯,这就是为什么 ToDate 被缓冲的原因。 计算从AddCol 开始。使用(row) 允许访问每条记录。我的想法来自here。 我们使用Table.SelectRows 过滤上一步中的表,检索不包括当前记录日期的最大日期。 最后,我们在两列之间进行减法运算,并将输出转换为带有Number.From 的数字。这是在 IF 语句中评估的。

计算

let
  Source = Table.FromRows(
    Json.Document(
      Binary.Decompress(
        Binary.FromText(
          "Zc6xCQAgDETRXVILJlELNzGI+6+hhYXy2wd3/DlFPWvNrm6SZMhKhwqpgcxI/LIKcuX9OwxGXOqgLyIYEYw4tDY=",
          BinaryEncoding.Base64
        ),
        Compression.Deflate
      )
    ),
    let
      _t = ((type nullable text) meta [Serialized.Text = true])
    in
      type table [Date = _t, Item = _t]
  ),
  ToDate = Table.TransformColumnTypes(Source, "Date", type date),
  BufferedToDate = Table.Buffer(ToDate),
  AddCol = Table.AddColumn(
    BufferedToDate,
    "StartFlag",
    (row) =>
      let
        PreviousDate = List.Max(
          Table.SelectRows(BufferedToDate, each [Date] < row[Date] and [Item] = row[Item])[Date]
        ),
        IfStatement = Number.From(
          if PreviousDate = null then row[Date] else row[Date] - PreviousDate
        )
      in
        IfStatement >= 5
  )
in
  AddCol

输出

Date Item StartFlag
02/04/2021 X TRUE
03/04/2021 X FALSE
05/04/2021 X FALSE
11/04/2021 X TRUE
12/04/2021 X FALSE
14/04/2021 X FALSE
20/04/2021 X TRUE
02/04/2021 Y TRUE
03/04/2021 Y FALSE
09/04/2021 Y TRUE
11/04/2021 Y FALSE
12/04/2021 Y FALSE
14/04/2021 Y FALSE

【讨论】:

以上是关于通过布尔值(PowerBI、Python)在表中定义日期周期的主要内容,如果未能解决你的问题,请参考以下文章

创建过程并在表中插入值

powerbi中如何再度量值中提取虚拟表中的列

提交值后无法在表中获取值

Snowflake TIMESTAMP - 将毫秒值保留为 .000000,存储在表中

来自不同数组的不同值并在表中并排附加在一起

Python & Bigquery:使用 for 循环在表中逐行查询和插入数据