【问题标题】:Pyspark - Calculate Median Absolute Percent Error with groupbyPyspark - 使用 groupby 计算中值绝对百分比误差
【发布时间】:2020-04-13 01:23:57
【问题描述】:

我可以用这个函数计算中值绝对误差:

from pyspark.sql import Window

def compute_Median_Abs_Err(df, expected_col, actual_col):

    grp_window = Window.partitionBy('grp')

    magic_percentile = F.expr('percentile_approx(abserror, 0.5)')

    med_abs_err = df.withColumn("abserror",
                           f.abs(f.col(actual_col) - f.col(expected_col)
                           )).groupby('start_month', 'start_dt'
                                     ).agg(magic_percentile.alias("med_abs_error")
                                          )

    return(med_abs_err)

可以用这个等式计算:

MEDIAN(abs(predictions - actuals))

我希望能够计算中值绝对百分比误差,用这个等式计算:

MEDIAN( abs(predictions - actuals) / actuals )

我认为我的理解是正确的:

from pyspark.sql import Window

def compute_Median_Perc_Err(df, expected_col, actual_col):

    grp_window = Window.partitionBy('grp')

    magic_percentile = f.expr('percentile_approx(abserror, 0.5)')

    med_perc_err = df.withColumn("abserror",
                           f.abs(f.col(actual_col) - f.col(expected_col)
                           )).groupby('start_month', 'start_dt'
                                     ).agg(magic_percentile.alias("med_abs_error"), f.avg(f.col(actual_col)).alias("mean")
                                          ).withColumn("med_perc_error", f.col("med_abs_error") / f.col("mean"))


    return(med_perc_err)

但我意识到这一点,在使用median 之前,我并没有除以actuals。我应该先除以实际值,然后取该列的中位数。

我如何编写这段代码 sn-p 先除以实际值,因为我仍然需要在 groupby 之后取.agg(f.avg(f.col("actuals")) 以获得准确的平均值?

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql pyspark-sql


    【解决方案1】:

    我想你快到了。本着proposed here函数的精神,中值绝对百分比可以计算如下:

    import pyspark.sql.functions as psf
    import pyspark.sql.Window as psw
    
    def compute_mape(df, expected_col, actual_col):
    
      grp_window = psw.Window.partitionBy('grp')
      magic_percentile = psf.expr('percentile_approx(relerror, 0.5)')
    
      mape = df.withColumn("abserror",
                          psf.col(actual_col) - psf.col(expected_col))
              .withColumn("relerror", 
                          psf.abs(psf.col("abserror")/psf.col(actual_col)))
              .groupBy('start_month','start_dt')
              .agg(magic_percentile.alias("med_perc_error"))
    
      return(mape)
    
    
    compute_mape("col1", "col2")
    

    (这里的首字母缩略词 MAPE 与 mean absolute percentage error 不同)

    注意:我将 pyspark.sql.functions 别名从 f.* 转换为 psf.* 并添加了 psẁ alias forpyspark.sql.Window`。在其他任何地方,我都坚持使用你的符号。

    【讨论】:

      猜你喜欢
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      • 1970-01-01
      • 2020-11-27
      • 2021-05-26
      • 2020-09-21
      相关资源
      最近更新 更多