1

有没有办法像这样使用它

Foo.objects.annotate(geometric_mean=GeometricMean('bars__value'))

或者

Foo.objects.annotate(geometric_mean=Power(Prod('bars__value'), Count('bars'))
4

1 回答 1

3

你可以做一些非常相似的事情:你可以计算自然对数的平均值:

from django.db.models import Avg
from django.db.models.functions import Ln

Foo.objects.annotate(geometric_mean=Avg(Ln('bars__value')))

那么几何平均值就是它的指数。如果您真的需要几何平均值本身,那么您可以在该结果上使用Exp[Django-doc]

from django.db.models import Avg
from django.db.models.functions import Exp, Ln

Foo.objects.annotate(geometric_mean=Exp(Avg(Ln('bars__value'))))

但是,如果您只想按两个几何平均值排序,则不需要这个,因为指数保持顺序关系不变:e a ≤e b意味着a≤b,反之亦然。

这是因为ln(x 1 ×x 2 ×…×x n )等价于ln(x 1 )+ln(x 2 )+…+ln(x n ),而ln(x y )等价于y× ln(x)

于 2020-12-06T01:18:29.040 回答