Я хочу выполнить расчет только для определенного подмножества информационного кадра, создав окно, которое может включать данную дату:
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|
Как мне эффективно это реализовать?