Django 的开发版本具有聚合函数,如 Avg、Count、Max、Min、StdDev、Sum 和 Variance(链接文本)。列表中缺少中位数是否有原因?
实施一个似乎很容易。我错过了什么吗?聚合函数在幕后做了多少?
Django 的开发版本具有聚合函数,如 Avg、Count、Max、Min、StdDev、Sum 和 Variance(链接文本)。列表中缺少中位数是否有原因?
实施一个似乎很容易。我错过了什么吗?聚合函数在幕后做了多少?
这是您缺少的功能。将查询集和要为其查找中值的列的名称传递给它:
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)
因为中位数不是 SQL 聚合。例如,请参阅PostgreSQL 聚合函数列表和MySQL 聚合函数列表。
好吧,原因可能是您需要跟踪所有数字来计算中位数。Avg、Count、Max、Min、StDev、Sum 和 Variance 都可以根据恒定的存储需求进行计算。也就是说,一旦你“记录”了一个数字,你就再也不需要它了。
FWIW,您需要跟踪的变量是:最小值、最大值、计数、<n>
= 平均值、<n^2>
= 值平方的平均值。
我不知道您使用的是什么数据库后端,但是如果您的数据库支持另一个聚合,或者您可以找到一种巧妙的方法,您可以通过Aggregate轻松访问它。
一个很大的可能性是中位数不是标准 SQL 的一部分。
此外,它需要一种排序,因此计算起来非常昂贵。
FWIW,您可以使用这些代码片段扩展 PostgreSQL 8.4 及更高版本以具有中值聚合函数。
此处显示了其他代码片段(适用于旧版本的 PostgreSQL)。请务必阅读此资源的评论。