Pyspark滚动平均从第一排开始

Pyspark滚动平均从第一排开始,pyspark,Pyspark,我试图计算Pyspark的滚动平均值。我有它的工作,但它似乎有不同的行为比我预期的。滚动平均值从第一行开始 例如: columns = ['month', 'day', 'value'] data = [('JAN', '01', '20000'), ('JAN', '02', '40000'), ('JAN', '03', '30000'), ('JAN', '04', '25000'), ('JAN', '05', '5000'), ('JAN', '06', '15000'),

我试图计算Pyspark的滚动平均值。我有它的工作,但它似乎有不同的行为比我预期的。滚动平均值从第一行开始

例如:

columns = ['month', 'day', 'value']
data = [('JAN', '01', '20000'), ('JAN', '02', '40000'), ('JAN', '03', '30000'), ('JAN', '04', '25000'), ('JAN', '05', '5000'), ('JAN', '06', '15000'),
       ('FEB', '01', '10000'), ('FEB', '02', '50000'), ('FEB', '03', '100000'), ('FEB', '04', '60000'), ('FEB', '05', '1000'), ('FEB', '06', '10000'),]

df_test = sc.createDataFrame(data).toDF(*columns)
win = Window.partitionBy('month').orderBy('day').rowsBetween(-2,0)
df_test.withColumn('rolling_average', f.avg('value').over(win)).show()

+-----+---+------+------------------+
|month|day| value|   rolling_average|
+-----+---+------+------------------+
|  JAN| 01| 20000|           20000.0|
|  JAN| 02| 40000|           30000.0|
|  JAN| 03| 30000|           30000.0|
|  JAN| 04| 25000|31666.666666666668|
|  JAN| 05|  5000|           20000.0|
|  JAN| 06| 15000|           15000.0|
|  FEB| 01| 10000|           10000.0|
|  FEB| 02| 50000|           30000.0|
|  FEB| 03|100000|53333.333333333336|
|  FEB| 04| 60000|           70000.0|
|  FEB| 05|  1000|53666.666666666664|
|  FEB| 06| 10000|23666.666666666668|
+-----+---+------+------------------+
这将更符合我的预期。有没有办法得到这种行为

+-----+---+------+------------------+
|month|day| value|   rolling_average|
+-----+---+------+------------------+
|  JAN| 01| 20000|              null|
|  JAN| 02| 40000|              null|
|  JAN| 03| 30000|           30000.0|
|  JAN| 04| 25000|31666.666666666668|
|  JAN| 05|  5000|           20000.0|
|  JAN| 06| 15000|           15000.0|
|  FEB| 01| 10000|              null|
|  FEB| 02| 50000|              null|
|  FEB| 03|100000|53333.333333333336|
|  FEB| 04| 60000|           70000.0|
|  FEB| 05|  1000|53666.666666666664|
|  FEB| 06| 10000|23666.666666666668|
+-----+---+------+------------------+

默认行为的问题是,我需要另一列来跟踪延迟应该从何处开始。

尝试使用
行数()
窗口函数,然后使用when+或语句替换null


  • 若要更改
    延迟启动
    ,请在@484更精简的版本时更改
    语句
    col(“rn”)

    import pyspark.sql.functions as f
    from pyspark.sql import Window
    
    w1 = Window.partitionBy('month').orderBy('day')
    w2 = Window.partitionBy('month').orderBy('day').rowsBetween(-2, 0)
    
    df.withColumn("rolling_average", f.when(f.row_number().over(w1) > f.lit(2), f.avg('value').over(w2))).show(10, False)
    

    p、 请不要将此标记为答案:)

    谢谢。这是可行的,而且比我所想的行数()更优雅。
    import pyspark.sql.functions as f
    from pyspark.sql import Window
    
    w1 = Window.partitionBy('month').orderBy('day')
    w2 = Window.partitionBy('month').orderBy('day').rowsBetween(-2, 0)
    
    df.withColumn("rolling_average", f.when(f.row_number().over(w1) > f.lit(2), f.avg('value').over(w2))).show(10, False)