Агрегировать группу по набору запросов в Django?Python

Программы на Python
Anonymous
 Агрегировать группу по набору запросов в Django?

Сообщение Anonymous »

Я работаю с данными временных рядов, которые представлены с помощью этой модели:

Код: Выделить всё

class Price:
timestamp = models.IntegerField()
price = models.FloatField()
Предполагая, что временная метка содержит данные с интервалом в 1 минуту, я бы ресэмплировал ее до 1 часа следующим образом:

Код: Выделить всё

queryset = (
Price.objects.annotate(timestamp_agg=Floor(F('timestamp') / 3600))
.values('timestamp_agg')
.annotate(
timestamp=Min('timestamp'),
high=Max('price'),
)
.values('timestamp', 'high')
.order_by('timestamp')
)
который под капотом выполняет следующий SQL:

Код: Выделить всё

select min(timestamp) timestamp, max(price) high
from core_price
group by floor((timestamp / 3600))
order by timestamp
Теперь я хочу вычислить скользящее среднее за 4 часа, которое обычно рассчитывается следующим образом:

Код: Выделить всё

select *, avg(high) over (order by timestamp rows between 4 preceding and current row) ma
from (select min(timestamp) timestamp, max(price) high
from core_price
group by floor((timestamp / 3600))
order by timestamp)
или

Код: Выделить всё

Window(expression=Avg('price'), frame=RowRange(start=-4, end=0))
Как применить приведенную выше агрегацию окон к первому запросу? Очевидно, я не могу сделать что-то подобное, поскольку первый запрос уже является агрегацией:

queryset.annotate(ma=Window(expression=Avg('high'),frame=RowRange(start=-4, end=0)))

django.core.Exceptions.FieldError: Cannot вычислить Avg('high'): 'high' представляет собой совокупность


Подробнее здесь: https://stackoverflow.com/questions/797 ... -in-django

Вернуться в «Python»