Высокая производительность применяется к группе pandas - PullRequest
3 голосов
/ 09 февраля 2020

Мне нужно рассчитать процентиль для столбца pandas кадра данных. Подмножество кадра данных выглядит следующим образом:

df

Я хочу вычислить 20-й процентиль SaleQTY, но для каждой группы ["Штрих-код" , "ShopCode"]: поэтому я определяю функцию, как показано ниже:

def quant(group):
    group["Quantile"] = np.quantile(group["SaleQTY"], 0.2)
    return group

И применяю эту функцию к каждой группе моих данных о продажах, которые имеют почти 18 миллионов строк и примерно 3 миллиона групп ["Штрих-кода" , "ShopCode"]:

quant_sale = sales.groupby(['Barcode','ShopCode']).apply(quant)

Это заняло 2 часа на сервере windows с 128 ГБ оперативной памяти и 32 ядрами. Это не имеет смысла, потому что это одна маленькая часть моего кода. Итак, я начинаю поиск net для повышения производительности. Я придумал решение "numba" с приведенным ниже кодом, который не работал:

from numba import njit, jit
@jit(nopython=True)
def quant_numba(df):
    final_quant = []
    for bar_shop,group in df.groupby(['Barcode','ShopCode']):
        group["Quantile"] = np.quantile(group["SaleQTY"], 0.2)
        final_quant.append((bar_shop,group["Quantile"]))
    return final_quant    
result = quant_numba(sales)  

Кажется, я не могу использовать pandas объекты в этом декораторе. enter image description here

Я не уверен, смогу ли я использовать многопроцессорную обработку (которая мне незнакома со всей концепцией) или есть какое-либо решение для ускорения моего кода. Так что любая помощь будет оценена.

Ответы [ 2 ]

3 голосов
/ 09 февраля 2020

Вы можете попробовать DataFrameGroupBy.quantile:

df1 = df.groupby(['Barcode', 'Shopcode'])['SaleQTY'].quantile(0.2)

Или, как указано, @Jon Clements для новых столбцов, заполненных процентилями, использовать GroupBy.transform:

df['Quantile'] = df.groupby(['Barcode', 'Shopcode'])['SaleQTY'].transform('quantile', q=0.2)
1 голос
/ 09 февраля 2020

В panda есть встроенная функция quantile ().

quantile () поможет получить n-й процентиль столбца в df.

Do c reference ссылка

пример geeksforgeeks ссылка

...