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

jit*_*u83 1 python numpy dataframe python-3.x

我有一个元组列表[(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]))

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

Dan*_*l F 5

首先,我将这个凌乱的列表更改为两个numpy数组,如@ user8153:

val, freq = np.array(list_tuples).T
Run Code Online (Sandbox Code Playgroud)

然后你可以重建数组(使用np.repeat阻止循环):

data = np.repeat(val, freq)
Run Code Online (Sandbox Code Playgroud)

并在阵列上使用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[-1] // 2, cdf)]

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))
Run Code Online (Sandbox Code Playgroud)