2013-10-05 3 views
1

Я пытаюсь вычислить процентиль после прочтения википедии я реализовал простую формулупитон: NumPy - вычислить процентиль с линейной интерполяцией

def _percentile(numList, percentile): 
    numList.sort() 
    n = int(round(percentile * len(numList) + 0.5)) 
    if n > 1: 
     return numList[n-2] 
    else: 
     return 0 

Но то, что я хочу сделать, это версия интерполяции упоминается в вики: (http://en.wikipedia.org/wiki/Percentile#Linear_interpolation_between_closest_ranks) Я ищу в google и нашел numpy, но я не думаю, что получаю правильное значение, когда использую его даже для простой формулы. И когда я пытаюсь передать значение для интерполяции, это дает мне ошибку. (http://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.percentile.html)

позволяет начинается со следующим списком:

B = [15, 20, 35, 40, 50] 

по моему методу: Я получаю фактическое значение исходного списка, которые представляют процентиль, что я ищу:

>>> print percentile(B, P=0.) 
0 
>>> print percentile(B, P=0.1) 
0 
>>> print percentile(B, P=0.2) 
15 
>>> print percentile(B, P=0.3) 
15 
>>> print percentile(B, P=0.4) 
20 
>>> print percentile(B, P=0.5) 
20 
>>> print percentile(B, P=0.6) 
35 
>>> print percentile(B, P=0.7) 
35 
>>> print percentile(B, P=0.8) 
40 
>>> print percentile(B, P=0.9) 
40 
>>> print percentile(B, P=0.95) 
40 
>>> print percentile(B, P=1.0) 
50 

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

>>> np.percentile(B, 0.1) 
15.02 
>>> np.percentile(B, 0.2) 
15.039999999999999 
>>> np.percentile(B, 0.3) 
15.06 
>>> np.percentile(B, 0.4) 
15.08 
>>> np.percentile(B, 0.5) 
15.1 
>>> np.percentile(B, 0.6) 
15.120000000000001 
>>> np.percentile(B, 0.7) 
15.140000000000001 
>>> np.percentile(B, 0.8) 
15.16 
>>> np.percentile(B, 0.9) 
15.18 
>>> np.percentile(B, 1) 
15.199999999999999 
>>> np.percentile(B, 10) 
17.0 
>>> np.percentile(B, 20) 
19.0 
>>> np.percentile(B, 30) 
23.0 
>>> np.percentile(B, 40) 
29.0 
>>> np.percentile(B, 50) 
35.0 

Мой вопрос задается массивом, как я могу получить значение из этого массива, которые представляют процентили, такие как 10, 20 ... 100 с использованием линейной интерполяции метода для расчета процентиля?

ответ

0

numpy правильный товар.

Ваш код возврата процентиль numList + [0], то есть набор, который включает в себя 0.

0-я процентиль пункт будет самый низкий пункт в numList, что в примере 15.

1

I была та же проблема. Для меня это было просто ... Я думал, что параметр percentile (вы называете это P) является float от 0.0-1.0, где 1.0 представляет 100% -percentile.

Я только что прочитал руководство и нашел, что P находится в диапазоне 0-100, где 100 представляет 100% -переход. не

numpy.percentile (а, д, ось = None, из = нет, overwrite_input = false, интерполяции = 'линейного')

д: плавать в диапазоне [0,100] (или последовательность floats) Percentile to , который должен быть от 0 до 100 включительно.

http://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.percentile.html

Надежда, что помогает!

Смежные вопросы