Вот ваша недостающая функция. Передайте ему QuerySet и имя столбца, который требуется найти медиану для:
def median_value(queryset, term):
count = queryset.count()
return queryset.values_list(term, flat=True).order_by(term)[int(round(count/2))]
Это было не так сложно, как некоторые из других ответов, кажется, указывают. Важно, чтобы сортировка db выполняла всю работу, поэтому, если у вас уже индексированный столбец, это супер дешевая операция.
(обновление 1/28/2016) Если вы хотите быть более строгими об определении медианы для четного числа элементов, то это будет в среднее вместе значения двух средних значений.
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)
Есть линейные, не сортировочные, алгоритмы: http://valis.cs.uiuc.edu/~sariel/research/CG/applets/linear_prog/median.html –
Неправильный алгоритм, я имел в виду медиана медиан : http://en.wikipedia.org/wiki/Selection_algorithm#Linear_general_selection_algorithm_-_.22Median_of_Medians_algorithm.22 –
@Todd Gardner: Первая ссылка - это «общий выбор на основе разделов», а O (nlogn) - не линейный. Сайт неправильный. Было бы неплохо удалить этот комментарий, но оставим комментарий медианных медин. –