基于最近3天的数据动态计算移动平均值[pyspark]

cx6n0qe3  于 2021-05-18  发布在  Spark
关注(0)|答案(1)|浏览(965)

我想根据最近3天的数据计算每个客户id和日期的移动平均值。为了计算5月4日的移动平均数,我们需要计算5月1日至3日的平均购买金额
我想使用一些窗口功能,但我不太清楚如何计算。平均值基于过去3天为一个给定的日期和客户id
Spark测向

date        customer_id   purchase_sum
2020-05-01  1             200
2020-05-02  1             243
2020-05-03  1             232
2020-05-04  1             253
2020-05-05  1             221
2020-05-06  1             212
2020-05-07  1             233

2020-05-01  2             323
2020-05-02  2             342
2020-05-03  2             342
2020-05-04  2             311
2020-05-05  2             344
2020-05-06  2             321
2020-05-07  2             345

输出Spark测向

date        customer_id   purchase_sum  L3D_moving_avg
2020-05-04  1             253           225
2020-05-05  1             221           243
2020-05-06  1             212           235
2020-05-07  1             233           228

2020-05-04  2             311           336
2020-05-05  2             344           332
2020-05-06  2             321           332
2020-05-07  2             345           325
fcg9iug3

fcg9iug31#

使用 rangeBetween(start, end) 在窗口中创建自定义窗框边界的步骤 window 功能。这个 start 以及 end 相对于当前行。
你的情况应该是这样的 rangeBetween(-3, -1) . 这是从现在开始的3天 date 允许你计算移动平均值。

from pyspark.sql.window import Window
from pyspark.sql import functions as F
from pyspark.sql.functions import col

w=Window().partitionBy("customer_id").orderBy("date")
df = df.withColumn('rank', F.dense_rank().over(w))

w2 = (Window().partitionBy("customer_id").orderBy("rank").rangeBetween(-3, -1))

df.select("*", (F.mean("purchase_sum").over(w2)).alias("L3D_moving_avg"))\
        .filter(col("rank")>=4).drop("rank").show()

+----------+-----------+------------+------------------+                        
|      date|customer_id|purchase_sum|    L3D_moving_avg|
+----------+-----------+------------+------------------+
|2020-05-04|          1|         253|             225.0|
|2020-05-05|          1|         221|242.66666666666666|
|2020-05-06|          1|         212|235.33333333333334|
|2020-05-07|          1|         233|228.66666666666666|
|2020-05-04|          2|         311| 335.6666666666667|
|2020-05-05|          2|         344| 331.6666666666667|
|2020-05-06|          2|         321| 332.3333333333333|
|2020-05-07|          2|         345| 325.3333333333333|
+----------+-----------+------------+------------------+

相关问题