Для контекста у меня много измерений температуры, проведенных на разных станциях, и я хочу проверить, соответствует ли это прогнозу.
Моя модель:
class Station(models.Model):
station_id = models.CharField(max_length = 18 ,primary_key = True)
sector = models.CharField(max_length = 40)
class Weather(models.Model):
station = models.ForeignKey(Station)
temperature = models.FloatField()
date = models.DateField()
class Forecast(models.Model):
station = models.ForeignKey(Station)
date = models.DateField()
score = models.IntegerField()
Для каждого измерения температуры я хотел бы знать среднее значение прогнозов для станции за последние 7 дней, если только в этом временном интервале не будет другого измерения температуры, и в этом случае это отправная точка. Следующий код выполняет то, что я хочу, но выполняется слишком медленно (~ 10 минут!):
observations = Weather.objects.all().order_by('station','date')
for obs in observations:
try :
if obs.station == previous.station:
date_inf = min(obs.date- timedelta(days=7), previous.date)
else :
date_inf = obs.date- timedelta(days=7)
except UnboundLocalError :
date_inf = obs.date- timedelta(days=7)
forecast = Forecast.objects.filter(
station=obs.station
).filter(
date__gte = date_inf
).filter(
date__lte = obs.date - timedelta(days=1)
).aggregate(average_score=Avg('score'))
if forecast["average_score"] is not None:
print(forecast["average_score"],obs.rating)
# Some more code....
previous = obs
Как я могу оптимизировать время выполнения? Есть ли способ сделать это с помощью одного запроса?
Спасибо!