聚集并计算Django querys的arrayfield中值

2024-05-29 09:46:05 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Year, Sitename, Array (length = 4500)  

例如:

^{pr2}$

我要做的是将数组(跨行)按年累加起来

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

我的视图.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()但没有找到一个好的解决方案。在

提前谢谢


Tags: selfidtruereturnmodelsdefnpsite
1条回答
网友
1楼 · 发布于 2024-05-29 09:46:05

您可能可以使用其中的一些.aggregate()将负载推到Postgres,但是我认为这里速度方面的一个更大的问题是Decimal字段。它是最高精度的,但它也是Python移入移出的代价更高的类型之一。在

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

相关问题 更多 >

    热门问题