1

我想实现一个函数,它可以在给定的整数样本上均匀地分布一定数量的等级。例如对于 [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
4

0 回答 0