Использование функциональности Pandas Agg для вычисления квантилей - PullRequest
1 голос
/ 11 февраля 2020

Я пытаюсь очистить и упростить мой код и недавно столкнулся с именованным агрегированием в Pandas ( см. Ссылку )

Это примечание на странице:

Если вашим функциям агрегации требуются дополнительные аргументы, частично примените их с помощью functools.partial ().

Вот установочный код:

from functools import partial as fpart
import pandas as pd
import numpy as np


 inputData = {'groupByVar1':['a','a','a','a','a','a','a','a','a','a','b','b','b','b','b','b','b','b','b','b'],
         'groupByVar2':[1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4],
         'value':[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]}


 df = pd.DataFrame(inputData)

 upperPercentile = 0.98
 lowerPercentile=0.05

Вот метод, который я использовал

nsgdf = df.groupby(['groupByVar1','groupByVar2'])[['value']].quantile(upperPercentile).rename({'value':'upperPercentileValue'},axis=1).reset_index(drop=False)
nsgdf['lowerPercentileValue'] = df.groupby(['groupByVar1','groupByVar2'])[['value']].quantile(lowerPercentile).values

Вот метод, который я хотел бы использовать:

fpartUpper = fpart(np.quantile,q=upperPercentile)
fpartLower = fpart(np.quantile,q=lowerPercentile)
bdf = df.groupby(['groupByVar1','groupByVar2']).agg(
     upperPercentileValue=pd.NamedAgg(column='value',aggfunc=fpartUpper),
     lowerPercentileValue=pd.NamedAgg(column='value',aggfunc=fpartLower)
)

Следующая ошибка возвращается из Pandas:

pandas .core.base.SpecificationError: Имена функций должны быть уникальными, найдено несколько именованных квантилей

Однако, если я выполню следующее, я действительно получу результат:

fpartUpper([1,2,3,4,5])
Out[16]: 4.92

Как мне заставить этот конкретный метод работать с pandas? Что мне не хватает? Почему Pandas находит несколько определений для квантиля, тогда как запуск пустой функции не вызывает проблем?

...