Легкий подход к обработке данных 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, что, скорее всего, займет больше времени, чем прямое определение значений в базе данных.