|
|
|
@ -184,24 +184,24 @@ for cs in call_stacks: |
|
|
|
|
|
|
|
|
|
def percentile(N, percent, key=lambda x: x): |
|
|
|
|
""" |
|
|
|
|
Find the percentile of a list of values. |
|
|
|
|
Find the percentile of an already sorted 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 N - is a list of values. MUST be already sorted. |
|
|
|
|
@parameter percent - a float value from [0.0,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 |
|
|
|
|
idx = (len(N) - 1) * percent |
|
|
|
|
idx_floor = math.floor(idx) |
|
|
|
|
idx_ceil = math.ceil(idx) |
|
|
|
|
if idx_floor != idx_ceil: |
|
|
|
|
# interpolate the nearest element values |
|
|
|
|
return (key(N[int(idx_floor)]) * (idx_ceil - idx) + |
|
|
|
|
key(N[int(idx_ceil)]) * (idx - idx_floor)) |
|
|
|
|
return key(N[int(idx)]) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def tidy_tag(tag): |
|
|
|
|