Django中缺失'Median'聚合函数?

14 投票
7 回答
8446 浏览
提问于 2025-04-15 12:00

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的聚合函数列表

撰写回答