如何在Python中从频率分布表中获得均值和标准差

发布于 2021-01-29 15:00:28

我有一个元组列表[(val1,freq1),(val2,freq2)....(valn,freqn)]。我需要获得上述数据的集中趋势的度量(均值,中位数)和偏差的度量(方差,均值)。我还想绘制一个值的箱形图。

我看到numpy数组有直接的方法可以从值列表中获取均值/中位数和标准差(或方差)。

numpy(或任何其他知名的库)是否有直接方法可对这种频率分布表进行操作?

另外,以编程方式将上述元组列表扩展为一个列表的最佳方法是什么?(例如,如果freq
dist为[(1,3),(50,2)],则为获取列表[1,1,1,50,50]以使用np.mean([1,1,1, 50,50]))

在这里看到一个自定义函数,但是如果可能的话,我想使用一个标准的实现

关注者
0
被浏览
71
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    首先,我将杂乱的列表更改为两个numpy数组,就像@ user8153那样:

    val, freq = np.array(list_tuples).T
    

    然后,您可以重建数组(使用np.repeat防止循环):

    data = np.repeat(val, freq)
    

    并在您的阵列上使用numpy统计函数data


    如果这导致内存错误(或者您只是想尽可能提高性能),则还可以使用一些专门构建的函数:

    def mean_(val, freq):
        return np.average(val, weights = freq)
    
    def median_(val, freq):
        ord = np.argsort(val)
        cdf = np.cumsum(freq[ord])
        return val[ord][np.searchsorted(cdf, cdf[-1] // 2)]
    
    def mode_(val, freq): #in the strictest sense, assuming unique mode
        return val[np.argmax(freq)]
    
    def var_(val, freq):
        avg = mean_(val, freq)
        dev = freq * (val - avg) ** 2
        return dev.sum() / (freq.sum() - 1)
    
    def std_(val, freq):
        return np.sqrt(var_(val, freq))
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看