Djangoの開発バージョンには、Avg、Count、Max、Min、StdDev、Sum、Varianceなどの集計関数があります(リンクテキスト)。中央値がリストにない理由はありますか?
実装は簡単なようです。私は何かが足りないのですか?集約関数は舞台裏でどのくらい実行していますか?
Djangoの開発バージョンには、Avg、Count、Max、Min、StdDev、Sum、Varianceなどの集計関数があります(リンクテキスト)。中央値がリストにない理由はありますか?
実装は簡単なようです。私は何かが足りないのですか?集約関数は舞台裏でどのくらい実行していますか?
これが不足している関数です。クエリセットと、中央値を検索する列の名前を渡します。
def median_value(queryset, term):
count = queryset.count()
return queryset.values_list(term, flat=True).order_by(term)[int(round(count/2))]
それは他の回答のいくつかが示しているように見えるほど難しくはありませんでした。重要なことは、dbソートですべての作業を実行できるようにすることです。したがって、列に既にインデックスが付けられている場合、これは非常に安価な操作です。
(2016年1月28日更新) 偶数のアイテムの中央値の定義をより厳密にしたい場合は、2つの中間値の値を平均します。
def median_value(queryset, term):
count = queryset.count()
values = queryset.values_list(term, flat=True).order_by(term)
if count % 2 == 1:
return values[int(round(count/2))]
else:
return sum(values[count/2-1:count/2+1])/Decimal(2.0)
中央値はSQL集計ではないためです。たとえば、PostgreSQL集計関数のリストとMySQL集計関数のリストを参照してください。
その理由は、中央値を計算するためにすべての数値を追跡する必要があるためです。Avg、Count、Max、Min、StDev、Sum、およびVarianceはすべて、一定のストレージニーズで計算できます。つまり、番号を「記録」すると、それが二度と必要になることはありません。
FWIW、追跡する必要のある変数は次のとおりです。最小、最大、カウント、<n>
=平均、<n^2>
=値の2乗の平均。
使用しているdbバックエンドはわかりませんが、dbが別のアグリゲートをサポートしている場合、またはそれを行うための賢い方法を見つけることができる場合は、 Aggregateから簡単にアクセスできます。
中央値が標準SQLの一部ではない可能性が高いです。
また、並べ替えが必要なため、計算にかなりの費用がかかります。
FWIWでは、PostgreSQL 8.4以降を拡張して、これらのコードスニペットで中央値の集計関数を使用できます。
他のコードスニペット(古いバージョンのPostgreSQLで機能します)をここに示します。このリソースのコメントを必ずお読みください。