通过布尔值(PowerBI、Python)在表中定义日期周期
Posted
技术标签:
【中文标题】通过布尔值(PowerBI、Python)在表中定义日期周期【英文标题】:Defining date cycles in a table via a Boolean (PowerBI, Python) 【发布时间】:2021-03-24 20:10:56 【问题描述】:考虑下表,它由 Date 和 Item 列组成:
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 脚本,这样也可以找到解决方案。)
谢谢。 -- 京东
【问题讨论】:
您要在DAX
或PowerQuery
中执行此操作吗?
您好,我们将不胜感激任何解决方案
【参考方案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)在表中定义日期周期的主要内容,如果未能解决你的问题,请参考以下文章