使用Pyspark在数据帧的不同列上提取多个平均值和移动平均值

使用Pyspark在数据帧的不同列上提取多个平均值和移动平均值,pyspark,databricks,Pyspark,Databricks,我有一个数据框,如下所示: 我想计算并创建具有以下功能的新列: 过去1天内质量/强度的平均值/移动平均值 过去2天内质量/强度的平均值/移动平均值 过去5天内质量/强度的平均值/移动平均值 过去1周内质量/强度的平均值/移动平均值 过去两周内质量/强度的平均值/移动平均值 过去1个月内质量/强度的平均值/移动平均值 请告诉我如何在pyspark中实现这一点。您可以使用group by子句中的窗口来指定聚合的天数 from pyspark.sql.window import Window f

我有一个数据框,如下所示:

我想计算并创建具有以下功能的新列:

  • 过去1天内质量/强度的平均值/移动平均值
  • 过去2天内质量/强度的平均值/移动平均值
  • 过去5天内质量/强度的平均值/移动平均值
  • 过去1周内质量/强度的平均值/移动平均值
  • 过去两周内质量/强度的平均值/移动平均值
  • 过去1个月内质量/强度的平均值/移动平均值

请告诉我如何在pyspark中实现这一点。

您可以使用
group by
子句中的
窗口
来指定聚合的天数

from pyspark.sql.window import Window
from pyspark.sql import functions as f
对于1天的聚合和1天的滑动:

df.groupBy(f.window(col('date'), '1 day', '1 day')).agg(f.avg('strength'))
df.groupBy(f.window(col('date'), '3 days', '1 day')).agg(f.avg('strength'))
对于3天的聚合和1天的滑动:

df.groupBy(f.window(col('date'), '1 day', '1 day')).agg(f.avg('strength'))
df.groupBy(f.window(col('date'), '3 days', '1 day')).agg(f.avg('strength'))

这就是我解决问题的方法。@WaqarAhmed提供的答案也是解决同样问题的另一种方法

from pyspark.sql.functions import *
from pyspark.sql.window import *


w_1day = Window().partitionBy('device').orderBy('date').rowsBetween(-1, 0)
w_2day = Window().partitionBy('device').orderBy('date').rowsBetween(-2, 0)
w_5day = Window().partitionBy('device').orderBy('date').rowsBetween(-5, 0)
w_7day = Window().partitionBy('device').orderBy('date').rowsBetween(-7, 0)
w_14day = Window().partitionBy('device').orderBy('date').rowsBetween(-14, 0)
w_21day = Window().partitionBy('device').orderBy('date').rowsBetween(-21, 0)
w_30day = Window().partitionBy('device').orderBy('date').rowsBetween(-30, 0)

df_avg = df.withColumn('rolling_1_day_average_q', avg("quality").over(w_1day))
df_avg = df_avg.withColumn('rolling_2_day_average_q', avg("quality").over(w_2day))
df_avg = df_avg.withColumn('rolling_5_day_average_q', avg("quality").over(w_5day))
df_avg = df_avg.withColumn('rolling_7_day_average_q', avg("quality").over(w_7day))
df_avg = df_avg.withColumn('rolling_14_day_average_q', avg("quality").over(w_14day))
df_avg = df_avg.withColumn('rolling_21_day_average_q', avg("quality").over(w_21day))
df_avg = df_avg.withColumn('rolling_30_day_average_q', avg("quality").over(w_30day))

你试过什么吗?你需要简单平均,移动平均。我是pyspark的初学者。我用滞后来计算与前一天的差异。但不太清楚如何计算一段时间内的平均值。我知道我们需要一个groupBy,但如何使用它来获得一段时间内的平均值/移动平均值w_1day=Window()。分区('device')。排序('date')。rowsBetween(-1,0)df_avg=df。with column('rolling_1_day_average_quality',avg(“quality”)。over(w_1day))w_3day=Window().partitionBy('device').orderBy('date').rowsBetween(-3,0)df_avg=df.withColumn('rolling_3_day_average_quality',avg('quality')。over(w_3day)),我试过上面几行。你认为这和你给出的一样吗?