我想实现一个函数,它可以在给定的整数样本上均匀地分布一定数量的等级。例如对于 [1,3,20,30,50,60] 和 3 个类,它将分配数字
- 1 -> 1
- 3 -> 1
- 20 -> 2
- 30 -> 2
- 50 -> 3
- 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