Рассчитать процентиль в столбцах данных pyspark - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть фрейм данных PySpark, который содержит идентификатор, а затем пару переменных, для которых я хочу вычислить точку 95%.

Часть printSchema ():

root
 |-- ID: string (nullable = true)
 |-- MOU_G_EDUCATION_ADULT: double (nullable = false)
 |-- MOU_G_EDUCATION_KIDS: double (nullable = false)

Я нашел Как получить Percentile, используя фрейм Spark Data и GroupBy в python , но это не с сообщением об ошибке:

perc95_udf = udf(lambda x: x.quantile(.95))


fanscores = genres.withColumn("P95_MOU_G_EDUCATION_ADULT", perc95_udf('MOU_G_EDUCATION_ADULT')) \
                      .withColumn("P95_MOU_G_EDUCATION_KIDS", perc95_udf('MOU_G_EDUCATION_KIDS'))

fanscores.take(2) 

AttributeError: у объекта 'float' нет атрибута 'quantile'

Другие попытки UDF, которые я уже пробовал:

def percentile(quantiel,kolom):
    x=np.array(kolom)
    perc=np.percentile(x, quantiel)
    return perc

percentile_udf = udf(percentile, LongType())


fanscores = genres.withColumn("P95_MOU_G_EDUCATION_ADULT", percentile_udf(quantiel=95, kolom=genres.MOU_G_EDUCATION_ADULT)) \
                  .withColumn("P95_MOU_G_EDUCATION_KIDS", percentile_udf(quantiel=95, kolom=genres.MOU_G_EDUCATION_KIDS))

fanscores.take(2)   

выдает ошибку: "TypeError: wrapper () получил неожиданный аргумент ключевого слова 'quantiel' "

Мое окончательное испытание:

import numpy as np

def percentile(quantiel):
    return udf(lambda kolom: np.percentile(np.array(kolom), quantiel))

fanscores = genres.withColumn("P95_MOU_G_EDUCATION_ADULT", percentile(quantiel=95)(genres.MOU_G_EDUCATION_ADULT)) \
                  .withColumn("P95_MOU_G_EDUCATION_KIDS", percentile(quantiel=95) (genres.MOU_G_EDUCATION_KIDS))

fanscores.take(2)  

Дает ошибку:

PickleException: ожидается нулевые аргументы для построенияClassDict (для numpy.dtype)

Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 19 сентября 2018
df.selectExpr('percentile(MOU_G_EDUCATION_ADULT, 0.95)').show()

для больших наборов данных рассмотрите использование процентной_апрокс ()

...