2017-01-02 13 views
1

私はオブジェクトのdjangoクエリーセットを持っているとしましょう。UserUseraverage_scoreです。 average_scoreに基づいてユーザーのパーセンタイル(上位10%、上位20%など)を確認するにはどうすればよいですか。djangoクエリーセットからパーセンタイルを計算する

私がクエリーセットをソートすることができたなら、理論的には合計カウントで割り算されたインデックスを取ることができます(例えば合計100%の5位がトップ5%です)。しかし、私はクエリーセットをソートできないので、ここに?

答えて

1

可能性のあるゼロ除算を考慮してスニペットを更新しました。 __lteクエリーセットフィルタ(Less than or equal to)を使用してaverage_scoreのオブジェクト数を指定した数より少なくし、データベース内のオブジェクトの総数で割ったものです。

すべてが、データベース側で行われ、(ほとんど)何もデータが

queryset = User.objects.all() 
    total_count = queryset.count() 
    if total_count: 
     percentile = float(queryset.filter(average_score__lte=average_score).count())/total_count 
    else: 
     return 0.0 
+0

ゼロ除算に注意してください!あなたのスニペットはこのエラーをキャッチしません。 – Wilfried

+0

右、スニペットを更新します。これは起こらないはずですが、average_scoreはUserオブジェクトから来ているので、データベースには少なくとも1つのオブジェクトがあります。 –

+1

http://stackoverflow.com/questions/11360858/what-is-the-eafp-principle-in-pythonちょうどEAFPのprincipeについてのSO投稿。サンカの答えに使用されます。より多くのpytonic。 – Wilfried

1

数ヶ月前に前後に転送されないので、それも、データベース内のユーザーオブジェクトの数が多いと効率的に動作するはずです、以下のようなスクリプトのような、今年の平均トランザクションを見つけるために似たような問題がありました。うまくいけば助けることができます..

import time 
from django import template 
from yourapp.models import Transaction 

register = template.Library() 
now_year = time.strftime("%Y") 

@register.simple_tag 
def graph_average_income_by_year(): 

    try: 
     transactions = Transaction.objects.filter(paid=True)\ 
              .filter(payment_date__year=now_year) 
     count_transactions = transactions.count() 
     incomes = [ p.total_transfer for p in transactions ] 
     return ("%.1f" % (float(sum(incomes))/count_transactions)) 
    except: 
     return 0.0 
関連する問題