我想知道这是否有可能以更有效的方式实现。
我在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()但没有找到一个好的解决方案。在
提前谢谢
您可能可以使用其中的一些
.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,这样您就可以最大限度地控制它。在
相关问题 更多 >
编程相关推荐