#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