Calculate various averages.
- arithmetic mean
- weighted arithmetic mean
- percentile (including median and quartiles)
- mode
- mid-range
- geometric mean
- harmonic mean
| #python version 3.3.3 | |
| #assume that all parameters satisfy pre-conditions. | |
| #programs do not deal with wrong parameters. | |
| import math | |
| import functools | |
| #arithmetic mean | |
| #l: data(list) | |
| def arithmetic(l): | |
| return sum(l)/len(l) | |
| #weighted arithmetic mean | |
| #l: data(list), w: weight(list) | |
| def weighted(l,w): | |
| return sum([l[i]*w[i] for i in range(len(l))])/sum(w) | |
| #percentile/quantile | |
| #l: data(list) | |
| #q: percentage 0<=q<=1 | |
| def percentile(l,q): | |
| def helper(sl, i): | |
| hi, lo = int(math.ceil(i)), int(math.floor(i)) | |
| return sl[int(i)] if i==int(i) else (hi-i)*sl[lo]+(i-lo)*sl[hi] | |
| return helper(sorted(l), (len(l)-1)*q) | |
| #median | |
| #l: data(list) | |
| def median(l): | |
| return percentile(l,0.5) | |
| #quartile | |
| #l: data(list) | |
| #returns: list of 5 q-quantiles (q=0,q=.25,q=.5,q=.75,q=1) | |
| def quartile(l): | |
| return [percentile(l,0.25*x) for x in range(5)] | |
| #frequency dictionary | |
| #l: data(list), d: dict to store the frequencies | |
| #returns: frecency dictionary(dict) | |
| def freqDict(l,d): | |
| if not l:return d | |
| if l[0] in d.keys(): | |
| d[l[0]] +=1 | |
| else: | |
| d[l[0]] =1 | |
| return freqDict(l[1:],d) | |
| #mode | |
| #l: data(list) | |
| #returns: mode(list). note that if multiple modes, all in the resulting list. | |
| def mode(l): | |
| d = freqDict(l,{}) | |
| m = max(d.values()) | |
| return [item[0] for item in d.items() if item[1]==m] | |
| #mid-range | |
| #l: data(list) | |
| def midRange(l): | |
| return (max(l)+min(l))/2.0 | |
| #geometric mean | |
| #l: data(list) | |
| def geometric(l): | |
| return functools.reduce(lambda x,y:x*y,l)**(1/len(l)) | |
| #functools.reduce(lambda x,y:x*y,l) is 'product' | |
| #here, the recursive expression | |
| def product(l): | |
| return 1 if not l else l[0]*product(l[1:]) | |
| #harmonic mean | |
| #l: data(list) | |
| def harmonic(l): | |
| return len(l)/sum([1/l[i] for i in range(len(l))]) |