gpt4 book ai didi

django - 使用 Django ORM 进行快速移动平均计算

转载 作者:行者123 更新时间:2023-11-29 12:16:53 24 4
gpt4 key购买 nike

我们运行 Postgres 9.6.5 和 Django 2.0。我们有一个包含字段 created_atvalueModel。我们需要计算某个 date_range 的 90 天移动平均线。我们就是这样做的:

output = []

for i in range(len(date_range)):
output.append(
Model.objects.filter(
created_at__date__range=(date_range[i]-timezone.timedelta(days=90), date_range[i]),
).aggregate(Avg('value'))['value__avg'].days
)

这使用了 Avg 聚合函数,因此速度相当快,但是我们需要对 date_range 中的每个日期进行一次查询。对于更长的范围,这意味着很多查询。

Postgres can do this in a single query .我的问题是 - 我们能否以某种方式使用 Django ORM 在单个查询中执行此操作?

(我知道我可以使用 Django ORM 执行原始 SQL,但我想尽可能避免这种情况,这就是我要问的原因。)

最佳答案

假设每个日期只有一个条目,您可以使用 Django 2.0 的新窗口表达式在单个查询中计算 90 个周期的移动平均值:

from django.db.models import Avg, F, RowRange, Window

items = Model.objects.annotate(
avg=Window(
expression=Avg('value'),
order_by=F('created_at').asc(),
frame=RowRange(start=-90,end=0)
)
)

另见 ValueRange如果您想改为按特定字段值构建框架,例如,如果每个给定日期有多行,这可能会派上用场。

关于django - 使用 Django ORM 进行快速移动平均计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48790322/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com