date - Pyspark:如何在日期上创建窗口
问题描述
我想通过创建一个可以包含给定日期的窗口来仅对数据框的指定子集进行计算:
df=df.orderBy('Date')
window_row = Window.partitionBy('I1','Id2')
df=df.withColumn('max_Date', when((col('Date')<=target_date),max('Date').over(window_row)))
df=df.withColumn('cum_sum', when((col('Date')==col('max_Date')),sum('Sale').over(window_row)))
时target_date= '2020-01-01'
,我得到以下输出:
|I1| Id2| Date| Sale| max_Date|cum_sum|
+--+----+-------------+------+----------+------+
|AA| B0| 2019-07-01| 1|2020-12-01| null|
|AA| B0| 2020-01-01| 23|2020-12-01| null|
|AA| B0| 2020-01-01| 2|2020-01-01| null|
|AA| B0| 2020-02-01| 0| null| null|
|AA| B0| 2020-12-01| 116| null| null|
|BB| C0| 2019-03-01| 1|2020-03-01| null|
|BB| C0| 2019-05-01| 26|2020-03-01| null|
|BB| C0| 2020-03-01| 1| null| null|
|CC| B0| 2019-03-01| 8|2019-04-01| null|
|CC| B0| 2019-04-01| 1|2019-04-01| 1|
但是,所需的输出是:
|I1| Id2| Date| Sale| max_Date|cum_sum|
+--+----+-------------+------+----------+------+
|AA| B0| 2019-07-01| 1|2020-01-01| null|
|AA| B0| 2020-01-01| 23|2020-01-01| 25|
|AA| B0| 2020-01-01| 2|2020-01-01| 25|
|AA| B0| 2020-02-01| 0| null| null|
|AA| B0| 2020-12-01| 116| null| null|
|BB| C0| 2019-03-01| 1|2019-05-01| null|
|BB| C0| 2019-05-01| 26|2019-05-01| 26|
|BB| C0| 2020-03-01| 1| null| null|
|CC| B0| 2019-03-01| 8|2019-04-01| null|
|CC| B0| 2019-04-01| 1|2019-04-01| 1|
我如何以有效的方式实现这一点?
解决方案
这可能有帮助
>>> w = Window.partitionBy("date")
>>> w_preceding = Window.partitionBy("I1","ID2").orderBy('DATE').rangeBetween(Window.unboundedPreceding, 0)
>>> df=df.withColumn('max_Date', when((col('Date')<=target_date),max('Date').over(w)))
>>> df=df.withColumn('cum_sum', when((col('Date')==col('max_Date')),sum('Sale').over(w_preceding)))
>>> df.show()
+----------+---+---+----+----------+-------+
| Date| I1|Id2|Sale| max_Date|cum_sum|
+----------+---+---+----+----------+-------+
|2019-05-01| BB| C0| 26|2019-05-01| 26.0|
|2020-03-01| BB| C0| 1|2020-03-01| 27.0|
|2019-07-01| AA| B0| 1|2019-07-01| 2.0|
|2019-07-01| AA| B0| 1|2019-07-01| 2.0|
|2020-02-01| AA| B0| 0|2020-02-01| 2.0|
|2020-09-01| AA| B0| 0| null| null|
|2019-04-01| CC| B0| 1|2019-04-01| 1.0|
+----------+---+---+----+----------+-------+
推荐阅读
- symfony - 在 Symfony 包中使用缓存
- r - 如果多列是 NA - R 解决方案,则删除一行
- tensorflow - tf.keras 在每个 epoch 后以评估模式评估训练和验证
- spartacus-storefront - 将斯巴达克斯从 3.0.0 升级到 3.3.0 后无法加载斯巴达克斯店面
- r - 如何使用非标准评估模拟 R 中的 lisp 引用行为?
- velocity - 我想用 Velocity 模板语言屏蔽字符串的最后 4 位数字
- c# - 如何在视图中调用派生类的属性?
- javascript - 比较两个 Json 对象的值,找出对象值的差异并输出到新的 Json
- pandas - 熊猫从开始日期开始在一列中获得天数?
- java - 动作类在 Selenium 中不可定位