2016-04-25 55 views
1

これがより効率的な方法で可能かどうか疑問に思っています。例えばdjangoクエリーセットで配列フィールドの集計と中央値を計算

Year, Sitename, Array (length = 4500) 


私はこのように構成されているPostgreSQLのデータセットを持っている

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()で試してみましたが、良い解決策が見つかりませんでした。事前

答えて

0

おかげであなたは、おそらくダウンのPostgresへの負荷をプッシュするためにそこに.aggregate()の一部を使用することができますが、私はここにスピードと大きな問題の一つは、10進数フィールドだと思います。これは最高の精度ですが、Pythonが出入りするためのより高価な型の1つです。

DBコールからパーセンテージを簡単に取り出せるかどうかはわかりませんが、Django ORMを使用して簡単にDBにプッシュすることができます。他の人(パーセンタイルなど)については、おそらくそれらを押し下げることもできますが、django()のカスタム集計を掘り下げて調べることになります。 aldjemy(https://github.com/Deepwalker/aldjemy/)、クエリ全体をSQLAlchemyに変換して、最大の制御権を得ます。

関連する問題