Как сделать несколько гистограмм на основе группового уровня MultiLevel с пользовательскими ячейками вокруг медианы? - PullRequest
0 голосов
/ 25 февраля 2020

Ради воспроизводимого кода у меня есть такой фрейм данных:

import pandas as pd


data = {'product':['DI', 'DI', 'DI', 'DI', 'DI', 'DI', 'PrTap', 'PrTap', 'PrTap', 'PrTap', 'PrTap', 'PrAdv', 'PrAdv', 'PrAdv', 'PrAdv'], 
        'comp':['DVINC', 'DVINC', 'DVINC', 'DVINC', 'DVINC', 'DVINC', 'TAMOD', 'TAMOD', 'TAMOD', 'TAMOD', 'TAMOD', 'ADMAG', 'ADMAG', 'ADMAG', 'ADMAG'], 
        'prev_qtr_return':[7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]}
df = pd.DataFrame(data) 

Я хотел бы создать несколько гистограмм, сгруппированных по product и comp. Тем не менее, я бы хотел, чтобы каждая корзина основывалась на медиане prev_qtr_return для каждого объекта groupby. Самая центральная корзина будет состоять из медианы и значений на 10% ниже и выше ее. Нижний контейнер будет состоять из значений от 30% ниже медианы до 10% ниже медианы, а верхний контейнер будет состоять из значений от 10% выше медианы до 30% выше и т. Д. Так, используя в качестве примера группу groupby ('DI', 'DVINC'):

Принимая значения [7,8,9,10,11,12], медиана будет 9.5, поэтому ожидаемые ребра бина будут:

lower_bin:  [6.65, 8.55)
middle_bin: [8.55, 10.45)
upper_bin:  [10.45, 12.35)

Таким образом, итоговое число бинов будет:

lower_bin:  2
middle_bin: 2
upper_bin:  2

Однако я бы предпочел, чтобы по оси Y отображался процент от общей частоты, а не количество, поэтому 33% соответственно для каждого бина. Я не уверен, как создавать пользовательские корзины без необходимости вручную создавать отдельные столбцы в кадре данных для каждой корзины, а затем создавать столбчатую диаграмму, что не так желательно. Я ожидаю, что конечный результат будет иметь этот базовый вывод example_output , но с краями корзины, являющимися метками, и вертикальной линией для медианы.

Я смотрел на pandas cut функция, и это может помочь в целях биннинга, но я не уверен, как перевести это в гистограмму.

...