gpt4 book ai didi

python - 在django queryset中聚合并计算arrayfield的中值

转载 作者:行者123 更新时间:2023-11-29 13:53:20 25 4
gpt4 key购买 nike

我想知道这是否可能以更有效的方式实现。
我在 PostGRESQL 中有一个结构如下的数据集:

Year, Sitename, Array (length = 4500)  

例如:

1982, DANC, array([2,3,4,5,6,7,...])  
1982, ANCH, array([5,6,4,3,5,7,...])
1983, DANC, array([3,3,4,6,3,6,...])
1983, ANCH, array([8,8,5,4,3,2,...])

我想做的是按年将数组(跨行)相加

E.G.,   
1982 1982 1982
DANC ANCH TOT
2 5 7
3 6 9
4 4 8
5 3 8
6 5 11
7 7 14
... ... ...

我的 Django 模型如下所示:

class Abundance(models.Model):
abundance_id = models.AutoField(primary_key=True)
site = models.ForeignKey('Site')
season = models.SmallIntegerField()
samples = ArrayField(models.DecimalField(blank=True, decimal_places=3, max_digits=30))

def __unicode__(self):
return self.site

我的 Views.py 中的以下代码有效:

import numpy as np
import bottleneck as bn
...


def testview(request):

s = ["ACUN","BRDM"]
quants = []
medians = []
for yr in range(1982,2015):
X = Abundance.objects.values_list('samples').filter(site__site_id__in = s).filter(season = yr)
h = np.matrix(np.array(X,dtype=float))
i = h.sum(axis=0)
m = bn.median(i)
up = np.percentile(i,95)
down = np.percentile(i,5)
qlist = [yr, round(down,3), round(up,3)]
mlist = [yr, round(m,3)]
quants.append(qlist)
medians.append(mlist)

return JsonResponse({'quants':quants, 'medians':medians})

但是,上面的代码非常慢——尤其是在绘制许多站点时。我试过玩 .aggregate() 但我没有找到好的解决方案。

提前致谢

最佳答案

您可能可以使用那里的一些 .aggregate() 将负载下推到 Postgres,但我认为这里速度方面的更大问题之一是 Decimal 字段。它是精度最高的,但它也是 Python 进出的更昂贵的类型之一。

就是说,我不确定是否有一种快速的方法可以从数据库调用中获取百分位数,但是您可以通过 Django ORM 轻松地将总和和中位数下推到数据库。对于其他(百分位数等),您也可以将它们向下推,但您将深入研究 django 的自定义聚合(https://docs.djangoproject.com/en/1.9/ref/models/expressions/#creating-your-own-aggregate-functions),如果您要走那么远,可能值得一试类似 aldjemy ( https://github.com/Deepwalker/aldjemy/ ) 的东西,并将整个查询转换为 SQLAlchemy,这样您就可以最大限度地控制它。

关于python - 在django queryset中聚合并计算arrayfield的中值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36850891/

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