连续数据的拟合分布失败

时间:2016-03-04 05:30:18

标签: python matplotlib scipy dataframe distribution

我正在尝试重现the example given in this answer以适应我的实际数据的分布,例如df['Note']是我的数据框的一列,其中包含每个学生的平均注释:

Index     StudentName     Note
0          Mark            3.7
1          Bryan           3.5
2          Nil             0.1
3          Amanda          2.045
4          Arthur          1.2
5          Helen           2.5

实际数据帧包含大约350000行,平均值= 2.17,如同这一行

我的代码是为了获得合适的分布

def fit(dataframe, path):
    dataframe.set_index
    size=len(dataframe.index)
    x=dataframe.index
    y=dataframe['Note']
    plt.hist(y, bins=range(20))
    dist_names = ['alpha', 'beta', 'norm', 'expon']
    for dist_name in dist_names:
        dist = getattr(scipy.stats, dist_name)
        param = dist.fit(y)
        pdf_fitted = dist.pdf(x, *param[:-2], loc=param[-2], scale=param[-1]) * size
        plt.plot(pdf_fitted, label=dist_name)
        plt.xlim(0, 19)
        plt.legend(loc='upper left')
    plt.show()
    plt.savefig(path+'_fit.png', bbox_inches='tight', dpi=100)


def call_fit(pathname):
    path_picture="%spicture//" %pathname
    path="%data//" %pathname
    path_s=sorted(os.listdir(path))
    for i in path_s:
        file_path=os.path.join(path, i)
        picture=os.path.join(path_picture, i)
        df=pd.read_csv(file_path, sep='\t')
        fit(df, picture)

但输出很奇怪。我在这里放了两个函数,因为我不确定是什么导致了这个bug!毋庸置疑,这个分布有一个奇怪的外观,而且我的真实分布的直方图不是情节,但是每一次迭代都会发生一些奇怪的事情:看看并比较第一个情节和第10个情节:

First iteration 10th iteration

您的帮助和建议将非常感谢!因为我不知道我哪里错了

1 个答案:

答案 0 :(得分:1)

分布的奇怪外观可能是由于您的数据不适合分布(特别是alpha分布)。由于我没有您的数据,因此我无法进一步了解详情。使用您提供的样本看起来不错。

绘制了直方图,但是与1e29相比,条形图太小了,所以你无法看到它们。

图例和其他绘图元素正在累积,因为您总是在不清除它的情况下绘制在同一个子图中,因此在每次迭代中都会保留之前绘制的所有内容。