使用numpy计算加权百分位数

53

有没有一种方法可以使用numpy.percentile函数计算加权百分位数?或者是否有其他的Python函数可用于计算加权百分位数?

谢谢!


在我看来,Sam A 在下面的解决方案(https://dev59.com/72Eh5IYBdhLWcg3w9XWn#63440143)似乎是当前最佳实践的有力竞争者。 - geotheory
12个回答

1

不幸的是,numpy并没有内置所有加权函数,但你总可以自己组合一些。

def weight_array(ar, weights):
     zipped = zip(ar, weights)
     weighted = []
     for a, w in zipped:
         for j in range(w):
             weighted.append(a)
     return weighted


np.percentile(weight_array(ar, weights), 25)

1
为了补充这个解决方案,您可以尝试使用np.percentile(Counter(dict(zip(ar, weights)).elements()), 25)。您需要从collections中导入Counter,并且它在ar中有重复的键时表现不佳,但是Counter().elements()很好用! - colcarroll
29
你认为权重应该是整数。 - Ruggero Turra
11
此外,它很可能会使用大量超额的内存和 CPU 时间来分别存储和排序。不适用于大量数据。 - PiHalbe

-1

这是我的解决方案:

def my_weighted_perc(data,perc,weights=None):
    if weights==None:
        return nanpercentile(data,perc)
    else:
        d=data[(~np.isnan(data))&(~np.isnan(weights))]
        ix=np.argsort(d)
        d=d[ix]
        wei=weights[ix]
        wei_cum=100.*cumsum(wei*1./sum(wei))
        return interp(perc,wei_cum,d)

它简单地计算数据的加权CDF,然后用于估计加权百分位数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接