Pyspark - 使用 groupby 计算中值绝对百分比误差
Pyspark - Calculate Median Absolute Percent Error with groupby
我可以用这个函数计算中值绝对误差:
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
。我应该先除以实际值,然后取该列的中值。
如何编写此代码片段以先除以实际值,因为我仍然需要在 groupby 之后取 .agg(f.avg(f.col("actuals"))
以获得准确的平均值?
我想你快到了。本着函数 的精神,中位数绝对百分比可以计算如下:
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 与往常不同 平均绝对百分比误差)
注意:我将 pyspark.sql.functions
别名从 f.*
转换为 psf.*
并添加了 psẁ alias for
pyspark.sql.Window`。在其他地方,我坚持使用你的符号。
我可以用这个函数计算中值绝对误差:
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
。我应该先除以实际值,然后取该列的中值。
如何编写此代码片段以先除以实际值,因为我仍然需要在 groupby 之后取 .agg(f.avg(f.col("actuals"))
以获得准确的平均值?
我想你快到了。本着函数
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 与往常不同 平均绝对百分比误差)
注意:我将 pyspark.sql.functions
别名从 f.*
转换为 psf.*
并添加了 psẁ alias for
pyspark.sql.Window`。在其他地方,我坚持使用你的符号。