0

我有下表,我试图在 GCP 数据准备中争吵:

Timestamp   Event
2018-04-01   0
2018-04-02   0
2018-04-03   0
2018-04-04   0
2018-04-05   1
2018-04-06   0
2018-04-07   0
2018-04-08   0

我正在尝试以某种方式对其进行转换,如果 Event 为 1,则 Event 中的前 3 个条目设置为 1,Event 中的下 2 个条目设置为 2。

因此,基本上数据集在转换后将如下所示

Timestamp   Event
2018-04-01   0
2018-04-02   1
2018-04-03   1
2018-04-04   1
2018-04-05   1
2018-04-06   2
2018-04-07   2
2018-04-08   0

我曾尝试使用窗口和条件来实现这一点,但没有成功。关于如何实现这种转变的任何想法?如果可以帮助实现此结果,我愿意拆分列或创建新的派生列。谢谢!

4

1 回答 1

0

您可以在IF语句中使用窗口函数作为条件的一部分。使用PREVNEXT窗口函数,您可以获得窗口中当前行上方或下方 X 行的值。获得值后,您可以比较它们是否与预期值匹配并相应地塑造您的 IF 语句。

对于您的用例,您需要验证之前 1 或 2 位置的 PREV 值是否等于 1,并将这些行替换为数字 2。如果不正确,如果位置 1、2 或 3 的 NEXT 值等于1,行应替换为数字 1。最后,您需要检查当前行的值是否为 1,并将其余行替换为 0。将其转换为 Dataprep 接受的公式如下所示:

IF(PREV(Event, 1) == 1 || PREV(Event, 2) == 1, 2, IF(NEXT(Event, 1) == 1 || NEXT(Event, 2) == 1 || NEXT(Event, 3) == 1, 1, IF(Event == 1, 1, 0)))

要在 Dataprep 上输入此公式,请在“函数”选项卡下,选择“自定义公式”。在自定义公式窗口下,将公式类型设置为“多行公式”,因为 PREV 和 NEXT 函数需要一个额外的参数来指定要排序的列。

在此处输入图像描述

于 2018-10-21T16:42:12.433 回答