Django中缺少“中位数”聚合函数?

eyh26e7m  于 12个月前  发布在  Go
关注(0)|答案(7)|浏览(135)

Django的开发版本有一些聚合函数,比如Avg,Count,Max,Min,StdDev,Sum,和Variance(链接文本)。
实现一个似乎很容易。我错过了什么吗?聚合函数在幕后做了多少?

btxsgosb

btxsgosb1#

这里是你缺少的函数。传递一个查询集和你想要查找中位数的列的名称:

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

字符串
这并不像其他一些回复所显示的那样困难,重要的是让数据库排序完成所有的工作,所以如果你已经索引了列,这是一个超级便宜的操作。

  • (更新1/28/2016)* 如果您想对偶数个项目的中位数定义更严格,这将对两个中间值的值进行平均。
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)

sqxo8psd

sqxo8psd3#

好吧,原因可能是你需要跟踪所有的数字来计算中位数。平均值,计数,最大值,最小值,标准差,总和和方差都可以在恒定的存储需求下计算。也就是说,一旦你“记录”了一个数字,你就再也不需要它了。
FWIW,您需要跟踪的变量是:min,max,count,<n> = avg,<n^2> =值平方的avg。

fnvucqvd

fnvucqvd4#

一个很大的可能性是中位数不是标准SQL的一部分。
此外,它需要排序,这使得计算成本相当高。

8oomwypt

8oomwypt5#

我不知道你使用的是什么数据库后端,但是如果你的数据库支持另一个聚合,或者你可以找到一个聪明的方法来做,你可以很容易地通过Aggregate访问它。

zujrkrfu

zujrkrfu6#

FWIW,您可以扩展PostgreSQL 8.4及更高版本,以使用these code snippets获得中位数聚合函数。
其他代码片段(适用于旧版本的PostgreSQL)是shown here。请务必阅读此资源的注解。

ilmyapht

ilmyapht7#

我已经实现了下面的版本,因为我也得到了一些奇怪的结果与上述实现和舍入行为。
使用Python 3.11.4

def median_value(queryset, column_name):
    count = queryset.count()
    values = queryset.values_list(column_name, flat=True).order_by(column_name)
    if count == 0:
        return Decimal("0")
    if count % 2 == 1:
        return values[int(count/2)]
    else:
        return sum(values[int(count/2)-1:int(count/2)+1])/Decimal(2.0)

字符串

相关问题