在Django中缺少'Median'聚合函数?

时间:2009-06-03 00:51:25

标签: python django aggregate-functions

Django的开发版本具有聚合函数,如Avg,Count,Max,Min,StdDev,Sum和Variance(link text)。列表中是否缺少中位数?

实施一个似乎很容易。我错过了什么吗?聚合功能在幕后做了多少?

6 个答案:

答案 0 :(得分:20)

这是你失踪的功能。传递一个查询集和要查找中位数的列的名称:

def median_value(queryset, term):
    count = queryset.count()
    return queryset.values_list(term, flat=True).order_by(term)[int(round(count/2))]

这并不像其他一些回应似乎表明的那么难。重要的是让db排序完成所有工作,所以如果你已经将列编入索引,这是一个超级便宜的操作。

(2016年1月28日更新) 如果你想对偶数项的中位数定义更严格,那么这将是两个中间值的平均值。

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)

答案 1 :(得分:14)

因为中位数不是SQL聚合。例如,请参阅list of PostgreSQL aggregate functionsthe list of MySQL aggregate functions

答案 2 :(得分:7)

嗯,原因可能是您需要跟踪所有数字来计算中位数。 Avg,Count,Max,Min,StDev,Sum和Variance都可以根据不断的存储需求进行计算。也就是说,一旦你“记录”了一个数字,你就再也不需要它了。

FWIW,您需要跟踪的变量是:min,max,count,<n> = avg,<n^2> =平方值的平均值。

答案 3 :(得分:2)

很可能中位数不是标准SQL的一部分。

此外,它需要排序,使计算成本非常高。

答案 4 :(得分:2)

我不知道你正在使用什么db后端,但是如果你的数据库支持另一个聚合,或者你可以找到一种聪明的方法,你可以通过Aggregate轻松访问它。

答案 5 :(得分:1)

FWIW,您可以将PostgreSQL 8.4及更高版本扩展为具有these code snippets的中间聚合函数。

其他代码段(适用于较早版本的PostgreSQL)是shown here。请务必阅读此资源的评论。