Pyspark - рассчитать абсолютную процентную ошибку по медиане с помощью groupby - PullRequest
1 голос
/ 13 апреля 2020

Я могу вычислить Медианную абсолютную ошибку с помощью этой функции:

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)

Но я понял с этим, я не делю на actuals, прежде чем взять median. Я должен сначала поделить на фактические значения, а затем взять медиану этого столбца.

Как мне написать этот фрагмент кода, чтобы сначала разделить на фактические значения, поскольку мне все еще нужно взять .agg(f.avg(f.col("actuals")) после того, как groupby получит точное значение?

1 Ответ

1 голос
/ 13 апреля 2020

Я думаю, что вы были почти там. В духе предложенной здесь функции средний абсолютный процент может быть вычислен следующим образом:

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`. В другом месте я придерживался ваших обозначений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...