Класс Variance
Класс Variance применяется в агрегации и аннотации QuerySet для вычисления дисперсии числовых значений поля. Дисперсия показывает, насколько сильно значения отклоняются от среднего арифметического. Класс принимает выражение для агрегации и возвращает объект, который можно использовать с методами aggregate и annotate. По умолчанию вычисляется дисперсия выборки, но можно указать вычисление дисперсии генеральной совокупности с помощью параметра sample=False.
Синтаксис
Variance(expression, sample=True, **extra)
Параметры:
-
expression- выражение (обычно имя поля модели), для которого вычисляется дисперсия; -
sample=True- еслиTrue, вычисляется дисперсия выборки (деление на n-1), еслиFalse- дисперсия генеральной совокупности (деление на n); -
**extra- дополнительные параметры, такие какoutput_fieldилиfilter.
Пример . С агрегацией
Рассмотрим модель Article с полем rating и вычислим дисперсию рейтингов всех статей:
from django.db.models import Variance
from myapp.models import Article
res = Article.objects.aggregate(rating_variance=Variance('rating'))
print(res)
Результат выполнения кода:
{"rating_variance": 2.5}
Пример . С аннотацией
Аннотируем каждую категорию значением дисперсии рейтингов статей в ней:
from django.db.models import Variance
from myapp.models import Category
categories = Category.objects.annotate(rating_variance=Variance('articles__rating'))
for category in categories:
print(category.name, category.rating_variance)
Результат выполнения кода:
"Technology 0.8"
"Science 1.2"
Пример . С дисперсией генеральной совокупности
Вычислим дисперсию для всей генеральной совокупности, установив параметр sample=False:
from django.db.models import Variance
from myapp.models import Article
res = Article.objects.aggregate(
population_variance=Variance('rating', sample=False)
)
print(res)
Результат выполнения кода:
{"population_variance": 2.0}
Пример . С фильтрацией
Вычислим дисперсию рейтингов только для опубликованных статей:
from django.db.models import Variance, Q
from myapp.models import Article
res = Article.objects.filter(
Q(status='published')
).aggregate(published_variance=Variance('rating'))
print(res)
Результат выполнения кода:
{"published_variance": 1.8}