Ради воспроизводимого кода у меня есть такой фрейм данных:
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
функция, и это может помочь в целях биннинга, но я не уверен, как перевести это в гистограмму.