Wie aggregiere ich eine Gruppe nach Abfragesatz in Django?Python

Python-Programme
Anonymous
 Wie aggregiere ich eine Gruppe nach Abfragesatz in Django?

Post by Anonymous »

Ich arbeite mit Zeitreihendaten, die mit diesem Modell dargestellt werden:

Code: Select all

class Price:
timestamp = models.IntegerField()
price = models.FloatField()
Angenommen, der Zeitstempel hat 1-Minuten-Intervalldaten, so würde ich sie auf 1 Stunde umrechnen:

Code: Select all

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')
)
der unter der Haube die folgende SQL ausführt:

Code: Select all

select min(timestamp) timestamp, max(price) high
from core_price
group by floor((timestamp / 3600))
order by timestamp
Jetzt möchte ich einen gleitenden 4-Stunden-Durchschnitt berechnen, der normalerweise wie folgt berechnet wird:

Code: Select all

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)
oder

Code: Select all

Window(expression=Avg('high'), frame=RowRange(start=-4, end=0))
Wie wende ich die obige Fensteraggregation auf die erste Abfrage an? Offensichtlich kann ich so etwas nicht tun, da die erste Abfrage bereits eine Aggregation ist:

Code: Select all

>>> queryset.annotate(ma=Window(expression=Avg('high'), frame=RowRange(start=-4, end=0)))
django.core.exceptions.FieldError: Cannot compute Avg('high'): 'high' is an aggregate

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post