【发布时间】:2020-07-22 16:05:05
【问题描述】:
我有一个如下的输入数据框:
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
使用 pyspark Window 函数的 value1 和 value2 列的累积平均值表现良好。 但是,如果我们在下面的输入中错过了一个月的数据,那么下个月的平均计算应该基于月份。而不是正常的平均值。 例如,如果输入如下(缺少 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 但是,如果缺少某些月份值,正确的平均方法是什么???
【问题讨论】:
-
你能展示“错误”的输出吗?
标签: python dataframe pyspark average pyspark-dataframes