Как рассчитать стандартное отклонение в диапазоне дат, если в pyspark 2.2.0 отсутствуют даты

#pyspark #apache-spark-sql

Вопрос:

У меня есть pyspark df, в котором я использую комбинацию функций windows udf для расчета стандартного отклонения по историческим рабочим датам. Проблема в том, что в моем df отсутствуют даты, когда нет транзакции. Как я могу рассчитать std dev, включая эти пропущенные даты, не добавляя их в качестве дополнительных строк в мой df, чтобы ограничить размер df, выходящий из памяти.

Таблица образцов и выходной ток

 | ID | Date     | Amount | Std_Dev|
|----|----------|--------|--------|
|1   |2021-03-24| 10000  |        |
|1   |2021-03-26|  5000  |        |
|1   |2021-03-29| 10000  |2886.751|
 

Текущий Код

 from pyspark.sql.functions import udf,first,Window,withColumn
import numpy as np
from pyspark.sql.types import IntegerType

windowSpec = Window.partitionBy("ID").orderBy("date")

workdaysUDF = F.udf(lambda date1, date2: int(np.busday_count(date2, date1)) if (date1 is not None and date2 is not None) else None, IntegerType()) # UDF to calculate difference between business days#

df = df.withColumn("date_dif", workdaysUDF(F.col('Date'), F.first(F.col('Date')).over(windowSpec))) #column calculating business date diff#

windowval = lambda days: Window.partitionBy('id').orderBy('date_dif').rangeBetween(-days, 0)

df = df.withColumn("std_dev",F.stddev("amount").over(windowval(6))
        .drop("date_dif")  
 

Желаемый вывод, в котором значения дат, отсутствующих с 24 по 29 марта, заменяются на 0.

 | ID | Date     | Amount | Std_Dev|
|----|----------|--------|--------|
|1   |2021-03-24| 10000  |        |
|1   |2021-03-26|  5000  |        |
|1   |2021-03-29| 10000  |4915.96 |
 

Пожалуйста, обратите внимание, что я показываю std dev только для одной даты для иллюстрации, для каждой строки будет значение, так как я использую функцию прокрутки окон.
Любая помощь была бы очень признательна.

PS: Версия Pyspark на предприятии 2.2.0, поэтому у меня нет возможности изменять версию.

Спасибо, VSG