Pandas график плотности графика из таблицы частот

Допустим, у меня есть DataFrame, который выглядит (упрощенно) так

>>> df
    freq 
2      2   
3     16  
1     25  

где столбец индекса представляет значение, а столбец freq представляет частоту появления этого значения, как в таблице частот.

Я хотел бы построить график плотности для этой таблицы, как полученный из типа графика kde. Однако этот вид, по-видимому, предназначен только для pd.Series. Мой df слишком велик, чтобы сгладить его до 1D-серии, т. е. df = [2, 2, 3, 3, 3, ..,, 1, 1]. Как я могу построить такой график плотности в этих обстоятельствах?


person john kals    schedule 09.12.2015    source источник
comment
Какая версия Панды?   -  person Alexander    schedule 10.12.2015


Ответы (4)


Я знаю, что вы спрашивали о случае, когда df слишком велико, чтобы его можно было сгладить, но следующий ответ работает, когда это не так:

pd.Series(df.index.repeat(df.freq)).plot.kde()

Или, в более общем случае, когда значения находятся в столбце с именем val, а не в индексе:

df.val.repeat(df.freq).plot.kde()
person thebigspin    schedule 29.08.2019

Распределение плотности можно построить с помощью гистограммы, если нормализовать значения y по произведению численности населения. Это сделает площадь, покрытую полосами, равной 1.

plt.bar(
    df.index,
    df.freq / df.freq.sum(),
    width=-1,
    align='edge'
)

Параметры width и align должны гарантировать, что каждый бар покрывает интервал (k-1, k].

Кто-то, лучше разбирающийся в статистике, должен ответить, действительно ли оценка плотности ядра имеет смысл для дискретных распределений.

person Stig Johan B.    schedule 29.08.2019

Возможно, это сработает:

import matplotlib.pyplot as plt

plt.plot(df.index, df['freq'])

plt.show()
person gabra    schedule 09.12.2015

Seaborn был создан, чтобы делать это поверх Matplotlib и автоматически вычисляет оценки плотности ядра, если вы хотите.

import seaborn as sns

x = pd.Series(np.random.randint(0, 20, size = 10000), name = 'freq')

sns.distplot(x, kde = True)

введите здесь описание изображения

person HS-nebula    schedule 29.08.2019