为了给出背景信息,我在不同的站点进行了大量的温度测量,我想检查它是否与预测的一致。 我的模特是:
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
如何优化执行时间?有没有办法用一个查询来做到这一点?
谢谢!
答案 0 :(得分:0)
对于每次测量,您都会重新计算过去7天的平均值。如果您的测量结果比7天更接近,则会有重叠。例如。如果您的测量间隔为1天,则在数据库中重新计算每个对象的平均值6次。
您最好的选择是获取所有测量值,然后是所有匹配的预测值,然后在Python中对内存进行平均。当然,更多的python代码,但它会运行得更快。