需要一些帮助计算百分位数

时间:2010-06-21 00:11:53

标签: c statistics large-data-volumes

提供rpc服务器,每天接收数百万个请求。每个请求我都需要处理时间Ti。我们希望随时找到第65百分位处理时间(当处理时间根据它们的值按递增顺序排序时)。由于请求数量非常大,我们无法存储过去所有请求的处理时间。所以答案不一定是第65百分位,你可以给出一些近似的答案,即处理时间大约是第65百分位数。

提示:如何在不存储所有数据的情况下为非常大的数据存储直方图(即概述)。

4 个答案:

答案 0 :(得分:2)

拿一天的数据。使用它来确定你的桶的大小(比如说一天的数据显示你的数据的绝大多数(95%?)在1秒的0.5秒内(荒谬的值,但挂起)

要获得第65百分位数,你需要至少20个这个范围内的水桶,但要慷慨,并使其成为80.所以你将你的1秒窗口(-0.5秒到+0.5秒)划分为80个桶每1/80秒一次。

每个桶是1秒的1/80。使桶0为(中心 - 偏差)=(1 - 0.5)= 0.5至自身+ 1/80秒。铲斗1为0.5 + 1 / 80th-0.5 + 2 / 80ths。等

对于每个值,找出它所属的存储桶,并为该存储桶增加一个计数器。

要找到第65百分位数,得到总数,然后从零开始走,直到达到总数的65%。

每当您想要重置时,将计数器all设置为零。

如果您总是希望获得良好的数据,请保留其中的两个,然后使用您最近最少重置的那个来重置它们,以获得更多有用的数据。

答案 1 :(得分:1)

使用更新过滤器:

if q < x:
    q += .01 * (x - q)  # up a little
else:
    q += .005 * (x - q)  # down a little

此处,分位数估算器q跟踪x流, 向每个x移动一点。 如果这两个因素都是.01,它会经常向上移动, 追踪第50百分位数。 随着.01上升,.005下降,它浮动,第67百分位; 一般来说,它跟踪向上/(向上+向下)百分位数。 较大的上/下因素跟踪速度更快但噪音更大 - 你必须试验你的真实数据。

(我不知道如何分析更新,欢迎链接。)

下面的updown()适用于长矢量X,Q,以便绘制它们: alt text

#!/usr/bin/env python
from __future__ import division
import sys
import numpy as np
import pylab as pl

def updown( X, Q, up=.01, down=.01 ):
    """ updown filter: running ~ up / (up + down) th percentile
        here vecs X in, Q out to plot
    """
    q = X[0]
    for j, x in np.ndenumerate(X):
        if q < x:
            q += up * (x - q)  # up a little
        else:
            q += down * (x - q)  # down a little
        Q[j] = q
    return q

#...............................................................................
if __name__ == "__main__":

    N = 1000
    up = .01
    down = .005
    plot = 0
    seed = 1
    exec "\n".join( sys.argv[1:] )  # python this.py N= up= down=
    np.random.seed(seed)
    np.set_printoptions( 2, threshold=100, suppress=True )  # .2f

    title = "updown random.exponential: N %d  up %.2g  down %.2g" % (N, up, down)
    print title
    X = np.random.exponential( size=N )
    Q = np.zeros(N)
    updown( X, Q, up=up, down=down )
        # M = np.zeros(N)
        # updown( X, M, up=up, down=up )
    print "last 10 Q:", Q[-10:]
    if plot:
        fig = pl.figure( figsize=(8,3) )
        pl.title(title)
        x = np.arange(N)
        pl.plot( x, X, "," )
        pl.plot( x, Q )
        pl.ylim( 0, 2 )
        png = "updown.png"
        print >>sys.stderr, "writing", png
        pl.savefig( png )
        pl.show()

答案 2 :(得分:0)

获取表示列表或数组的给定百分位数的值的更简单方法是scipy.stats模块中的scoreatpercentile函数。

>>>import scipy.stats as ss
>>>ss.scoreatpercentile(v,65)

给出值

时,有一个兄弟的百分位数来返回百分位数

答案 3 :(得分:-1)

您需要存储一笔运行金额和总计数。

然后检查标准偏差计算。