当前位置: 首页 > 知识库问答 >
问题:

根据最近3天数据动态计算移动平均线[PySpark]

尉迟轶
2023-03-14

我想根据最近3天的数字计算每个customer_id和日期的移动平均值。为了计算5月4日的移动平均数,我们需要计算5月1-3日的平均购买量

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

输出火花DF

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

共有1个答案

王飞英
2023-03-14

使用rangebeter(start,end)窗口函数中创建自定义的窗口框架边界。开始结束相对于当前行。

在您的情况下,它应该是范围(-3,-1)。这将从当前日期往回看3天,允许您计算移动平均值。

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|
+----------+-----------+------------+------------------+
 类似资料:
  • 公式链接:https://sciencing.com/calculate-exponential-moving-averages-8221813.html

  • 问题内容: 美好的一天, 我正在使用以下代码来计算9天移动平均线。 但这是行不通的,因为它会在调用限制之前先计算所有返回的字段。换句话说,它将计算该日期之前或等于该日期的所有关闭时间,而不仅仅是最后9个。 因此,我需要从返回的选择中计算出SUM,而不是直接计算出来。 IE浏览器 从SELECT中选择SUM … 现在我将如何去做,这是非常昂贵的还是有更好的方法? 问题答案: 使用类似 内查询返回的所

  • 我又用Python玩了一点,我找到了一本有例子的整洁的书。其中一个例子是绘制一些数据。我有一个有两列的。txt文件,我有数据。我把数据绘制得很好,但在练习中,它说:进一步修改程序,计算并绘制数据的运行平均值,定义如下: 其中在本例中(并且是数据文件中的第二列)。使程序将原始数据和运行平均值绘制在同一张图上。 到目前为止我有这个: 非常感谢^^:)

  • 问题内容: 我需要做类似的事情: 除了,我还需要检索的前20个值的移动平均值。 首选标准SQL,但如有必要,我将使用MySQL扩展。 问题答案: 这只是我的头顶,而且我正要出门,所以未经测试。我也无法想象它会在任何种类的大数据集上表现出色。我确实确认它至少可以正常运行。:)

  • 问题内容: 假设我有一个清单: 我想创建一个计算n天移动平均值的函数。所以如果是5,我希望我的代码计算第一个1-5,将其相加并找到平均值,即3.0,然后继续计算2-6,计算平均值,即4.0,然后3- 7、4-8、5-9、6-10。 我不想计算前n-1天,因此从第n天开始,它将计算前几天。 这似乎可以打印出我想要的内容: 但是,我不知道如何计算这些列表中的数字。有任何想法吗? 问题答案: 旧版本的P

  • 我使用基本的过滤器平滑一些数据: 出于某些原因,我想每X(=8)步做一次。事实是,就目前而言,我不知道如何计算每8°输入的值。我仍然在处理每个输入,并且只“存储”8°。 您将如何“节省CPU”避免在每一步计算它?是否有一个系列,我可以提前计算8°值? 这是我的实际代码(每一步都很平滑): 我想避免将“while的7个步骤”变成一个独特的操作。有可能吗?