特定の数のランククラスを整数の特定のサンプルに均一に分散できる関数を実装したいと考えています。たとえば、[1,3,20,30,50,60] と 3 つのクラスの場合、番号が割り当てられます
- 1 -> 1
- 3 -> 1
- 20 -> 2
- 30 -> 2
- 50 -> 3
- 60 -> 3
このメソッドの標準実装を知っていますか? 追加のライブラリなしで実装したいと思います。理想的には、SAS「RANK」の動作に似ている必要がありますが、受け入れられている実装であればどれでもかまいません。
私は試みましたが、考慮すべき特別なケースがたくさんあります (サンプル データよりも多くのクラス、多くの等しいサンプル データの整数など)。1 つの実装ですべての異常なケースを賢明に解決する方法がわかりません。
編集:コメントは、私が実際に「データを分位点にビン化」したいことを指摘しました。入力は、重複の可能性がある順序付け可能な番号のリストです。[maxbin] に bin クラス 1 を均等に割り当てたい。Python で実装しますが、疑似コードまたはアルゴリズムまたはルールでのアドバイスは問題ありません。私の主な懸念は、すべてのビンを均等に分配する方法が明確でない異常なケースです。
これがPythonでの私の試みです(サンプルデータよりも多くのクラスがある場合は失敗します):
import bisect
import math
class QuantileClass:
def __init__(self, classes, data, fallback=None):
if not data:
self.cutoffs=[]
return
self.bisect=bisect.bisect_left
self.fallback=fallback
s=sorted(data)
num=len(s)
cutoff_ranks=[math.ceil((num+1)/classes*c)-1 for c in range(1, classes)]
self.cutoffs=[s[i-1] for i in cutoff_ranks]
def __call__(self, value):
if self.cutoffs:
return self.bisect(self.cutoffs, value)
else:
return self.fallback