2015-12-12 2 views
1

Я делаю анализ данных в Django, и я пытаюсь создать запрос базы данных, который может перебирать модель и распечатывать количество строк в пределах интервала.Django: лучший запрос для нормального распространения

Проблема в том, что общая сумма результатов варьируется. Если «интервал» изменен, «total» также изменится. Почему это так?

# Get the data 
data = COPD6Model.objects.filter(patient=patients) 
# Calculate the min and max value 
max_min = data.aggregate(Max("fev1_procent"), Min("fev1_procent")) 
max = float(max_min.get("fev1_procent__max")) 
min = float(max_min.get("fev1_procent__min")) - float(interval) 
# Set the interval 
interval = 2.0 
total = 0 
# Iterate over the query 
for start in numpy.arange(min, max, interval): 
    end = start + interval 
    result = len(data.filter(fev1_procent__gt=start, fev1_procent__lte=end)) 
    total += result 
print total 
+1

Только примечание стороны, вы можете использовать 'queryset.count()' вместо 'len (queryset)' –

+0

Кроме того, можете ли вы пояснить, почему вы вычитаете 'float (interval)' при первом вычислении 'min'? –

+0

Да, потому что запрос ищет только значения «больше, чем начало». Поэтому, если минимальное значение равно стартовому значению, оно не будет считаться (только на первой итерации). Вот почему я устанавливаю значение «min» ниже фактического минимального значения. Надеюсь, это так! – Vingtoft

ответ

1

Должно возникнуть проблема с точностью поплавка. Используйте decimal вместо float.

Смежные вопросы