我想实现一个函数,它可以在给定的整数样本上统一分配一定数量的rank-classes。例如 [1,3,20,30,50,60]和3个类将分配数字
您知道此方法的标准实现吗?我想在没有额外库的情况下实现它。 理想情况下,它应该类似于SAS“RANK”的行为,但任何可接受的实现都可以。
我已经尝试了,但是有很多特殊情况要考虑(比样本数据更多的类,许多相等的样本数据整数,......)。我不确定如何在一个实现中明智地解决所有异常情况。
编辑: 评论指出我实际上想“将数据分成分位数”。输入是一些可订购数字列表,可能有重复数据。我想统一将bin类1分配给[maxbin]。我将在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