Welcome, guest | Sign In | My Account | Store | Cart

This function find the percentile of a list of values. Note that the list must be sorted already.

Python, 26 lines
 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26``` ```import math import functools def percentile(N, percent, key=lambda x:x): """ Find the percentile of a list of values. @parameter N - is a list of values. Note N MUST BE already sorted. @parameter percent - a float value from 0.0 to 1.0. @parameter key - optional key function to compute value from each element of N. @return - the percentile of the values """ if not N: return None k = (len(N)-1) * percent f = math.floor(k) c = math.ceil(k) if f == c: return key(N[int(k)]) d0 = key(N[int(f)]) * (c-k) d1 = key(N[int(c)]) * (k-f) return d0+d1 # median is 50th percentile. median = functools.partial(percentile, percent=0.5) ```

e.g.

``````>>> percentile(range(10),0.25)
2.25
>>> percentile(range(10),0.75)
6.75
>>> median(range(10))
4.5
>>> median(range(11))
5
``````

Matthew Shaer 16 years, 9 months ago

Correction. That does the interpolation in the wrong direction (ie the higher the percent the closer to the lower value it went). Change to: d0 = key(N[int(f)]) * (c-k) and d1 = key(N[int(c)]) * (k-f)

Wai Yip Tung (author) 12 years, 10 months ago

Thank you for your correction. I takes me 4 years to find this comment and correct it??

 Created by Wai Yip Tung on Tue, 17 Apr 2007 (PSF)