Django中缺失'Median'聚合函数?
Django的开发版本里有一些聚合函数,比如平均值(Avg)、计数(Count)、最大值(Max)、最小值(Min)、标准差(StdDev)、总和(Sum)和方差(Variance)(链接文本)。但是,为什么中位数(Median)没有在这个列表里呢?
实现一个中位数的函数看起来应该很简单。我是不是漏掉了什么?这些聚合函数在后台到底做了多少工作呢?
7 个回答
7
其实,原因可能是你需要记录所有的数字才能计算中位数。像平均值、数量、最大值、最小值、标准差、总和和方差这些都可以用固定的存储空间来计算。也就是说,一旦你“记录”了一个数字,以后就不需要再用到它了。
顺便说一下,你需要跟踪的变量有:最小值、最大值、数量、<n>
= 平均值,<n^2>
= 数值平方的平均值。
28
这是你缺少的函数。你只需要传入一个查询集和你想要找中位数的列名:
def median_value(queryset, term):
count = queryset.count()
return queryset.values_list(term, flat=True).order_by(term)[int(round(count/2))]
这并没有其他一些回答说的那么复杂。关键是让数据库来处理排序的工作,所以如果你已经对这个列进行了索引,这个操作就会非常便宜。
(更新于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)
15
因为中位数不是SQL中的一种聚合函数。你可以看看,比如说,PostgreSQL的聚合函数列表和MySQL的聚合函数列表。