[ACCEPTED]-Missing 'Median' Aggregate Function in Django?-aggregate-functions
Here's your missing function. Pass it a 11 queryset and the name of the column that 10 you want to find the median for:
def median_value(queryset, term): count = queryset.count() return queryset.values_list(term, flat=True).order_by(term)[int(round(count/2))]
That wasn't 9 as hard as some of the other responses seem 8 to indicate. The important thing is to 7 let the db sorting do all of the work, so 6 if you have the column already indexed, this 5 is a super cheap operation.
(update 1/28/2016) If you want 4 to be more strict about the definition of 3 median for an even number of items, this 2 will average together the value of the two 1 middle values.
def median_value(queryset, term): count = queryset.count() values = queryset.values_list(term, flat=True).order_by(term) if count % 2 == 1: return values[int(round(count/2))] else: return sum(values[count/2-1:count/2+1])/Decimal(2.0)
Well, the reason is probably that you need to 6 track all the numbers to calculate median. Avg, Count, Max, Min, StDev, Sum, and 5 Variance can all be calculated with constant 4 storage needs. That is, once you "record" a 3 number you'll never need it again.
FWIW, the 2 variables you need to track are: min, max, count,
<n> = avg,
<n^2> = avg 1 of the square of the values.
A strong possibility is that median is not 2 part of standard SQL.
Also, it requires 1 a sort, making it quite expensive to compute.
I have no idea what db backend you are using, but 3 if your db supports another aggregate, or 2 you can find a clever way of doing it, You 1 can probably access it easily by Aggregate.
More Related questions