Легкий подход к обработке данных Django Queryset

Я ищу оптимальный способ выполнения простой обработки данных из Django Queryset. Хотелось бы обойтись без установки библиотек с большими объемами, таких как Pandas или numpy. Количество строк в Queryset не должно превышать 2000. Идея состоит в том, чтобы выполнять основные функции, такие как x1, x2, x3, ниже. Я хочу избежать отдельного запроса к базе данных для каждой из них, поэтому я думаю получить все эти данные один раз из базы данных, преобразовать их в стандартную структуру данных и вычислить результаты.

Образец набора:

T1_id    T2_id   T1_value    T2_value
  1        2        2           0
  3        5        0           0
  4        1        1           1
  2        7        0           3

Эквиваленты кода Пандас:

data = [[1, 2, 2, 0], [3, 5, 0, 0], [4, 1, 1, 1], [2, 7, 0, 3]]

df = pd.DataFrame(data, columns=['T1_id', 'T2_id', 'T1_value', 'T2_value'])

x1 = df[df['T1_id'] == 1]['T1_value'].mean()  # Mean of T1_value from rows where T1_id == 1
x2 = df[df['T1_id'] == 1]['T2_value'].sum()  # Sum of T2_value from rows where T1_id == 1
x3 = len(df[df['T1_id'] == 1])  # Number of rows where T1_id == 1

Вы можете легко вычислить все это с помощью .aggregate(…) [Django-doc]:

from django.db.models import Avg, Count, Sum

MyModel.objects.filter(T1_id=1).aggregate(
    x1=Avg('T1_value'), x2=Sum('T2_value'), x3=Count('*')
)

вернет словарь, который сопоставляет элементы с соответствующим результатом, например:

{'x1': 14.25, 'x2': 1302, 'x3': 42}

Если сделать это в виде запроса, база данных вычислит это, а база данных находится ближе к данным и часто оптимизирована для создания агрегатов, поэтому, скорее всего, значительно превзойдет pandas. Тем более что если мы будем использовать pandas для агрегирования, ей придется сначала перенести данные из базы данных в pandas, что, скорее всего, займет больше времени, чем прямое определение значений в базе данных.

Вернуться на верх