用加权钟形曲线绘制直方图

时间:2019-07-16 19:47:28

标签: python matplotlib scipy

我正在绘制带有钟形曲线的直方图,而我遇到了钟形曲线部分的问题。基本上,我的数据由3列组成:ITEM_TYPE,QTY和WIDTH。直方图的数据需要考虑数量列,而我这样做没有问题,但是,当我尝试对钟形曲线进行同样的操作时,我不确定如何最好地进行处理。在下面查看我的代码:

import pandas as pd
import matplotlib.pylab as plt
import matplotlib.ticker as mtick
import numpy as np
from scipy import stats
import seaborn as sns
import statsmodels.api as sm

df = pd.read_csv('Size_Overview.csv')
df2 = df[df['ITEM_TYPE'] == 'Fixed Window']

weighted = sm.nonparametric.KDEUnivariate(df2['WIDTH'])
weighted.fit(fft=False, weights=df2['QTY_ORD'])

ax = plt.subplot()

ax.hist(df2['WIDTH'], bins = [0,1,2,3,4,5,6,7,8,9,10], weights=df2['QTY_ORD'])

lnspc = np.linspace(0, 10, len(df2['WIDTH']))
m, s = stats.norm.fit(df2['WIDTH'], weights=df2['QTY_ORD'])
pdf_g = stats.norm.pdf(lnspc, m, s)  
plt.plot(lnspc, pdf_g, label='Norm', c='red')

ax.set_ylabel('Unit Count (% of Total)')
ax.set_xlabel('Width (in Feet)')
ax.set_title('Width Distribution (Fixed Windows)')
ax.set_xticks(np.arange(0, 11, 1.0))
ax.yaxis.set_major_formatter(mtick.PercentFormatter(1.0))
plt.xticks(rotation=45)

plt.show()

因此,基本上,weighted.fit和ax.hist中的“ weights”参数可以正常工作,但是stats.norm.fit中的相同参数似乎被完全忽略了。因此,如果我的数据中有1行的数量非常多,则直方图将进行适当的调整,但钟形曲线每次都保持完全相同。基本上只是计算WIDTH列的均值和std而完全忽略了QTY

这是我的图表的样子:

enter image description here

如果我在1到2英尺之间的项目中添加大量的东西,这就是它的样子:

enter image description here

如您所见,直方图调整正确,但钟形曲线大致保持不变。如何使钟形曲线适应我的数量栏?感谢所有提示,在此先感谢

编辑:似乎没人能帮上忙,但是我还是想通了。这是我想出的解决方法:

添加了此代码:

values = df2['WIDTH'].values
qty = df2['QTY_ORD'].astype(int)
count = qty.values
full_values = np.repeat(values, count)

并替换为:

m, s = stats.norm.fit(df2['WIDTH'], weights=df2['QTY_ORD'])

具有:

m, s = stats.norm.fit(full_values)

因此,基本上可以使用numpy repeat函数根据qty列中的数字传入整个width列。就是这样!

所以现在我的第二张图表如下:

enter image description here

0 个答案:

没有答案