RANK的标准实现

时间:2012-05-07 14:33:27

标签: ranking

我想实现一个函数,它可以在给定的整数样本上统一分配一定数量的rank-classes。例如 [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

0 个答案:

没有答案