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

sut*_*tee 10 python django aggregate-functions

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

实现一个似乎很容易.我错过了什么吗?幕后的聚合功能有多少?

Mar*_*ian 21

这是你缺少的功能.传递一个查询集和要查找中位数的列的名称:

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

这并不像其他一些反应似乎表明的那么难.重要的是让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)
Run Code Online (Sandbox Code Playgroud)

  • 我知道这个帖子有点旧,但是您更新的答案真的准确吗?例如,如果查询集中有三个值,则“返回值[int(round(3/2))]”将解析为“values[2]”。恕我直言,正确的解决方案是“返回值[int(count/2)]”,它将解析为“值[1]”。 (2认同)

jac*_*ian 14

因为中位数不是SQL聚合.见,例如,的PostgreSQL的聚集函数列表MySQL的聚合函数列表.


dmo*_*dmo 7

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

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