Ecco la funzione mancante. Passare un set di query e il nome della colonna che si desidera trovare la mediana di:
def median_value(queryset, term):
count = queryset.count()
return queryset.values_list(term, flat=True).order_by(term)[int(round(count/2))]
che non è stato così difficile come alcune delle altre risposte sembrano indicare. L'importante è lasciare che l'ordinamento db faccia tutto il lavoro, quindi se hai già la colonna indicizzata, questa è un'operazione super economica.
(aggiornamento 2016/01/28) Se si vuole essere più rigorosi sulla definizione di mediano per un numero pari di elementi, questo in media insieme il valore dei due valori medi.
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)
fonte
2012-02-29 16:56:05
ci sono lineari, non ordinamento, algoritmi: http://valis.cs.uiuc.edu/~sariel/research/CG/applets/linear_prog/median.html –
algoritmo sbagliato, volevo dire bfprt : http://en.wikipedia.org/wiki/Selection_algorithm#Linear_general_selection_algorithm_-_.22Median_of_Medians_algorithm.22 –
@Todd Gardner: il primo collegamento è il "generale di selezione della partizione-based" ed è O (nlogn) non è lineare. Il sito è sbagliato. Sarebbe bello cancellare quel commento, ma lasciare il commento della mediana dei mediani. –