Django的开发版本有一些聚合函数,比如Avg,Count,Max,Min,StdDev,Sum,和Variance(链接文本)。实现一个似乎很容易。我错过了什么吗?聚合函数在幕后做了多少?
btxsgosb1#
这里是你缺少的函数。传递一个查询集和你想要查找中位数的列的名称:
def median_value(queryset, term): count = queryset.count() return queryset.values_list(term, flat=True).order_by(term)[int(round(count/2))]
字符串这并不像其他一些回复所显示的那样困难,重要的是让数据库排序完成所有的工作,所以如果你已经索引了列,这是一个超级便宜的操作。
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)
型
hwazgwia2#
因为median不是SQL聚合。例如,参见list of PostgreSQL aggregate functions和the list of MySQL aggregate functions。
sqxo8psd3#
好吧,原因可能是你需要跟踪所有的数字来计算中位数。平均值,计数,最大值,最小值,标准差,总和和方差都可以在恒定的存储需求下计算。也就是说,一旦你“记录”了一个数字,你就再也不需要它了。FWIW,您需要跟踪的变量是:min,max,count,<n> = avg,<n^2> =值平方的avg。
<n>
<n^2>
fnvucqvd4#
一个很大的可能性是中位数不是标准SQL的一部分。此外,它需要排序,这使得计算成本相当高。
8oomwypt5#
我不知道你使用的是什么数据库后端,但是如果你的数据库支持另一个聚合,或者你可以找到一个聪明的方法来做,你可以很容易地通过Aggregate访问它。
zujrkrfu6#
FWIW,您可以扩展PostgreSQL 8.4及更高版本,以使用these code snippets获得中位数聚合函数。其他代码片段(适用于旧版本的PostgreSQL)是shown here。请务必阅读此资源的注解。
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)
字符串
7条答案
按热度按时间btxsgosb1#
这里是你缺少的函数。传递一个查询集和你想要查找中位数的列的名称:
字符串
这并不像其他一些回复所显示的那样困难,重要的是让数据库排序完成所有的工作,所以如果你已经索引了列,这是一个超级便宜的操作。
型
hwazgwia2#
因为median不是SQL聚合。例如,参见list of PostgreSQL aggregate functions和the list of MySQL aggregate functions。
sqxo8psd3#
好吧,原因可能是你需要跟踪所有的数字来计算中位数。平均值,计数,最大值,最小值,标准差,总和和方差都可以在恒定的存储需求下计算。也就是说,一旦你“记录”了一个数字,你就再也不需要它了。
FWIW,您需要跟踪的变量是:min,max,count,
<n>
= avg,<n^2>
=值平方的avg。fnvucqvd4#
一个很大的可能性是中位数不是标准SQL的一部分。
此外,它需要排序,这使得计算成本相当高。
8oomwypt5#
我不知道你使用的是什么数据库后端,但是如果你的数据库支持另一个聚合,或者你可以找到一个聪明的方法来做,你可以很容易地通过Aggregate访问它。
zujrkrfu6#
FWIW,您可以扩展PostgreSQL 8.4及更高版本,以使用these code snippets获得中位数聚合函数。
其他代码片段(适用于旧版本的PostgreSQL)是shown here。请务必阅读此资源的注解。
ilmyapht7#
我已经实现了下面的版本,因为我也得到了一些奇怪的结果与上述实现和舍入行为。
使用Python 3.11.4
字符串