График плотности частот с использованием панд - PullRequest
0 голосов
/ 28 октября 2018

У меня есть фрейм данных pandas, созданный как показано ниже

df_hist2 = pd.DataFrame({'Score':np.random.uniform(0,1,4300)}).append(
    pd.DataFrame({'Score':np.random.uniform(1,3,6900)}),ignore_index=True).append(
    pd.DataFrame({'Score':np.random.uniform(3,5,4900)}),ignore_index=True).append(
    pd.DataFrame({'Score':np.random.uniform(5,10,2000)}),ignore_index=True).append(
    pd.DataFrame({'Score':np.random.uniform(10,24,2100)}),ignore_index=True);

И я могу создать из него гистограмму, как показано ниже

df_hist2.plot.hist(bins=[0,1,3,5,10,24], edgecolor='black', linewidth=1.2)

И это что-то вроде этого

enter image description here

Однако я хочу создать гистограмму, которая показывает плотность частоты, а не только частоты, где

Плотность частоты = частота / ширинаящика

Я могу построить гистограмму, где я могу создать категорию для каждого из ячеек ('0-1', '1-3' и т. д.) и рассчитать плотности вручную.Однако есть ли более элегантный и простой способ сделать это?

Более того, для этого нужно было бы сначала рассчитать частоты по данным гистограммы.(в этом случае я знаю, так как я генерирую данные вручную, но не знаю, в случае реальных данных)

Я хотел бы иметь что-то, что вычисляет и строит следующую диаграмму

Hours   | Frequency | Width | Density       |
--------------------------------------------|
0 - 1   | 4300      | 1     | 4300/1 = 4300 |
1 - 3   | 6900      | 2     | 6900/2 = 3450 |
3 - 5   | 4900      | 2     | 4900/2 = 2450 |
5 - 10  | 2000      | 5     | 2000/5 = 400  |
10 - 24 | 2100      | 14    | 2100/14 = 150 |

И график, похожий на следующий (выполненный в Excel с некоторым ручным редактированием)

Примечание. Ширина интервала / ячейки сохраняется.Высота изменяется с учетом частоты.

enter image description here

1 Ответ

0 голосов
/ 28 октября 2018

Вот пример, который может приблизить вас к тому, что вы хотите, используя параметр гистограммы normed=1, который дает вам желаемую форму гистограммы. Масштабирование высоты гистограммы с помощью matplotlib.pyplot as plt дает вам то, что вы хотите:

fig = df_hist2.plot.hist(bins=[0,1,3,5,10,24], edgecolor='black', linewidth=1.2,
                   normed=True) 
plt.yticks(fig.get_yticks(), [int(x) for x in fig.get_yticks() * len(df_hist2)])

Вы можете дополнительно настроить точные значения тиков y по своему вкусу.

enter image description here

...