Рассчитать процентиль с помощью Groupby на фрейме данных pyspark - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь сгруппироватьBy, а затем вычислить процентиль на фрейме данных pyspark.Я протестировал следующий фрагмент кода в соответствии с этим stackoverflow post :

from pyspark.sql.types import FloatType
import pyspark.sql.functions as func
import numpy as np

qt_udf = func.udf(lambda x,qt: float(np.percentile(x,qt)), FloatType())
df_out = df_in.groupBy('Id').agg(func.collect_list('value').alias('data'))\
.withColumn('median', qt_udf(func.col('data'),func.lit(0.5)).cast("string"))  

df_out.show()

, но получил следующую ошибку:

Traceback (последний вызов был последним):> df_out.show () ....> return lambda * a: f (* a) AttributeError: у объекта 'module' нет атрибута 'процентиля'

Это из-за непостоянной версии (1.4.1), функция процентиля была добавлена ​​из версии 1.5.Невозможно обновить numpy версию в краткосрочной перспективе.

1 Ответ

0 голосов
/ 14 декабря 2018

Определите окно и используйте встроенную функцию percent_rank для вычисления значений процентиля.

from pyspark.sql import Window
from pyspark.sql import functions as func
w = Window.partitionBy(df_in.Id).orderBy(df_in.value) #assuming default ascending order
df_out = df_in.withColumn('percentile_col',func.percent_rank().over(w))
...