Django 中缺少“中位数”聚合函数?
-
09-09-2019 - |
题
Django 的开发版本具有 Avg、Count、Max、Min、StdDev、Sum 和 Variance 等聚合函数(链接文本)。中位数没有出现在列表中是否有原因?
实施一个似乎很容易。我错过了什么吗?聚合函数在幕后做了多少工作?
解决方案
因为中位数不是 SQL 聚合。例如,参见 PostgreSQL 聚合函数列表 和 MySQL 聚合函数列表.
其他提示
这是你缺少的功能。通过它,你要查找的中线的查询集和列的名称:
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)
那么,的原因的可能是你需要跟踪所有的计算中位数的数字。平均,计数,最大值,最小值,标准偏差,总和,方差都可以用恒定的存储需求计算。也就是说,一旦你“记录”一个数字,你再也不需要它。
FWIW,你需要跟踪变量是:最小,最大,计数,<n>
= AVG,<n^2>
=平均的值的平方的
一个很大的可能性是,中位数是不是标准的SQL的一部分。
此外,它需要排序,使得它相当昂贵计算。
我不知道你用的是什么DB后端,但如果你的数据库支持其它集合,或者你可以找到这样做的一个聪明的办法,你或许可以轻松地通过的汇总。
不隶属于 StackOverflow