【问题标题】:Plotting a histogram with overlaid PDF用叠加的 PDF 绘制直方图
【发布时间】:2019-09-24 16:40:39
【问题描述】:

这是我之前几个问题的后续。这是我正在玩的代码:

import pandas as pd
import matplotlib.pyplot as plt
import scipy.stats as stats
import numpy as np
dictOne = {'Name':['First', 'Second', 'Third', 'Fourth', 'Fifth', 'Sixth', 'Seventh', 'Eighth', 'Ninth'],
           "A":[1, 2, -3, 4, 5, np.nan, 7, np.nan, 9],
           "B":[4, 5, 6, 5, 3, np.nan, 2, 9, 5],
           "C":[7, np.nan, 10, 5, 8, 6, 8, 2, 4]}
df2 = pd.DataFrame(dictOne)
column = 'B'
df2[df2[column] > -999].hist(column, alpha = 0.5)
param = stats.norm.fit(df2[column].dropna())   # Fit a normal distribution to the data
print(param)
pdf_fitted = stats.norm.pdf(df2[column], *param)
plt.plot(pdf_fitted, color = 'r')

我正在尝试在数据框中的单列中制作数字的直方图——我可以这样做——但是使用重叠的正态曲线...类似于here 上的最后一张图。我正试图让它在这个玩具示例上工作,以便我可以将它应用到我更大的数据集上。我上面粘贴的代码给了我这个图表:

为什么pdf_fitted 与此图中的数据不匹配?如何覆盖正确的 PDF?

【问题讨论】:

  • 你看过distplot中的seaborn吗?

标签: python pandas scipy histogram curve-fitting


【解决方案1】:

如果您希望将直方图与真正的 PDF 进行比较,您应该使用 density=True 绘制直方图。否则你的归一化(幅度)将被关闭。

此外,您需要在绘制 pdf 时指定 x 值(作为有序数组):

fig, ax = plt.subplots()

df2[df2[column] > -999].hist(column, alpha = 0.5, density=True, ax=ax)

param = stats.norm.fit(df2[column].dropna())
x = np.linspace(*df2[column].agg([min, max]), 100) # x-values

plt.plot(x, stats.norm.pdf(x, *param), color = 'r')
plt.show()


顺便说一句,使用直方图将连续变量与分布进行比较并不总是最好的。 (您的样本数据是离散的,但链接使用连续变量)。 bin 的选择可能会影响直方图的形状,这可能会导致错误的推断。相反,ECDF 是连续变量分布的更好(无选择)说明:

def ECDF(data):
    n = sum(data.notnull())
    x = np.sort(data.dropna())
    y = np.arange(1, n+1) / n
    return x,y

fig, ax = plt.subplots()

plt.plot(*ECDF(df2.loc[df2[column] > -999, 'B']), marker='o')

param = stats.norm.fit(df2[column].dropna())
x = np.linspace(*df2[column].agg([min, max]), 100) # x-values

plt.plot(x, stats.norm.cdf(x, *param), color = 'r')
plt.show()

【讨论】:

  • 这在我的玩具示例中效果很好,但是当我将它应用到我的真实数据集时,我得到`文件“C:\Users[用户名]\Anaconda3\lib\site-packages\ pandas\core\indexing.py",第 1327 行,在 _convert_to_indexer .format(mask=objarr[mask])) KeyError: '[nan nan nan ... nan nan nan] not in index'` 这是什么意思?
  • @Jim421616 您是否不小心覆盖了列变量?同样从那个回溯中,我很难判断错误发生在哪里。哪一行是有问题的?
  • 关于连续数据的公平评论。无论如何,我的实际工作使用(伪)连续数据,所以 PDF 就可以了。
猜你喜欢
  • 1970-01-01
  • 2019-09-25
  • 1970-01-01
  • 2019-08-19
  • 1970-01-01
  • 2018-02-06
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多