Нужна помощь в расчете процентиля - PullRequest
1 голос
/ 21 июня 2010

Предоставляется сервер RPC, который получает миллионы запросов в день.Каждый запрос занимает время обработки Ti для обработки.Мы хотим найти время обработки 65-го процентиля (когда время обработки сортируется в соответствии с их значениями в порядке возрастания) в любой момент.Мы не можем хранить время обработки всех запросов прошлого, так как количество запросов очень велико.И поэтому ответ не обязательно должен быть точным 65-м процентилем, вы можете дать приблизительный ответ, то есть время обработки, которое будет примерно равным 65-му процентилю.

Подсказка: что-то делать, как гистограмма (то есть обзор)хранится для очень больших данных без сохранения всех данных.

Ответы [ 4 ]

2 голосов
/ 21 июня 2010

Возьмите данные за один день. Используйте его, чтобы выяснить, какой размер составляют ваши сегменты (скажем, данные за один день показывают, что подавляющее большинство (95%?) Ваших данных находится в пределах 0,5 секунды от 1 секунды (смешные значения, но зависают)

Чтобы получить 65-й процентиль, вам нужно по крайней мере 20 сегментов в этом диапазоне, но будьте щедрыми и сделайте его равным 80. Таким образом, вы делите свое 1-секундное окно (от -0,5 секунды до +0,5 секунды) на 80 сегментов, делая каждая 1/80 секунды в ширину.

Каждое ведро составляет 1/80 от 1 секунды. Сделать ведро 0 быть (отклонение от центра) = (1 - 0,5) = 0,5 само по себе + 1/80 секунды. Ведро 1 составляет 0,5 + 1/80-е - 0,5 + 2/80-е. И т.д.

Для каждого значения определите, в какое ведро оно попадает, и увеличьте счетчик для этого ведра.

Чтобы найти 65-й процентиль, получите общее количество и ходите по бадьям с нуля, пока не получите 65% от этого общего.

Всякий раз, когда вы хотите выполнить сброс, установите все счетчики на ноль.

Если вы всегда хотите, чтобы у вас были хорошие данные, оставьте две из них и поочередно сбросьте их, используя ту, которую вы сбрасывали не так давно, поскольку в ней есть более полезные данные.

1 голос
/ 01 июля 2010

Использовать фильтр обновления:

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

Здесь квантильная оценка q отслеживает поток x, двигаясь немного к каждому x. Если бы оба фактора были 0,01, он бы двигался вверх так же часто, как и вниз, отслеживание 50-го процентиля. С 0,01 вверх, 0,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()
0 голосов
/ 07 октября 2010

Более простой способ получить значение, представляющее данный процентиль списка или массива, - это функция Scoreatpercentile в модуле scipy.stats.

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

есть процентиль братьев и сестер, возвращающий процентиль с учетомзначение

0 голосов
/ 21 июня 2010

вам нужно будет сохранить промежуточную сумму и общее количество.

, а затем проверить вычисления стандартного отклонения.

...