我想根据最近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
使用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个步骤”变成一个独特的操作。有可能吗?