У меня есть входной фрейм данных, как показано ниже:
partner_id|month_id|value1 |value2
1001 | 01 |10 |20
1002 | 01 |20 |30
1003 | 01 |30 |40
1001 | 02 |40 |50
1002 | 02 |50 |60
1003 | 02 |60 |70
1001 | 03 |70 |80
1002 | 03 |80 |90
1003 | 03 |90 |100
Используя приведенный ниже код, я создал два новых столбца, которые вычисляют среднее значение с помощью оконной функции:
rnum = (Window.partitionBy("partner_id").orderBy("month_id").rangeBetween(Window.unboundedPreceding, 0))
df = df.withColumn("value1_1", F.avg("value1").over(rnum))
df = df.withColumn("value1_2", F.avg("value2").over(rnum))
Выход:
partner_id|month_id|value1 |value2|value1_1|value2_2
1001 | 01 |10 |20 |10 |20
1002 | 01 |20 |30 |20 |30
1003 | 01 |30 |40 |30 |40
1001 | 02 |40 |50 |25 |35
1002 | 02 |50 |60 |35 |45
1003 | 02 |60 |70 |45 |55
1001 | 03 |70 |80 |40 |50
1002 | 03 |80 |90 |50 |60
1003 | 03 |90 |100 |60 |70
Совокупное среднее значение хорошо работает для столбцов value1 и value2 с использованием функции pyspark Window. Но, если мы пропустим данные за один месяц во входных данных, как показано ниже, для следующего месяца средний расчет должен происходить на основе номера месяца. вместо нормального среднего. Например, если ввод такой, как показано ниже (данные за месяц 02 отсутствуют)
partner_id|month_id|value1 |value2
1001 | 01 |10 |20
1002 | 01 |20 |30
1003 | 01 |30 |40
1001 | 03 |70 |80
1002 | 03 |80 |90
1003 | 03 |90 |100
Затем происходит вычисление среднего значения для трех записей за месяц, как показано ниже: например: (70 + 10) / 2 Но, как правильно рассчитать среднее значение, если определенные значения месяца отсутствуют ???