Python在观察值的#不能被容器的#整除的情况下表现出qcut行为

Python在观察值的#不能被容器的#整除的情况下表现出qcut行为,python,pandas,ranking-functions,Python,Pandas,Ranking Functions,假设我有一系列的美元价值,并希望使用qcut将其离散成9组。观测值的#不能被9整除。SQL Server的ntile函数有一种标准的方法来处理这种情况:它使9个组中的前n个组1观察值大于其余(9-n)组 我注意到在大熊猫身上,哪一组有x次观察和x+1次观察的分配似乎是随机的。我试着用algos来破译代码,以找出分位数函数是如何处理这个问题的,但没有弄明白 我有三个相关问题: 有谁能解释qcut的行为?哪些群体的观察次数较多是随机的吗 有没有办法强迫qcut的行为与NTILE类似(即,第一组获得x

假设我有一系列的美元价值,并希望使用
qcut
将其离散成9组。观测值的#不能被9整除。SQL Server的
ntile
函数有一种标准的方法来处理这种情况:它使9个组中的前n个组1观察值大于其余(9-n)组

我注意到在大熊猫身上,哪一组有x次观察和x+1次观察的分配似乎是随机的。我试着用algos来破译代码,以找出分位数函数是如何处理这个问题的,但没有弄明白

我有三个相关问题:

  • 有谁能解释
    qcut
    的行为?哪些群体的观察次数较多是随机的吗
  • 有没有办法强迫
    qcut
    的行为与
    NTILE
    类似(即,第一组获得x+1观察结果)
  • 如果#2的答案是否定的,那么对于一个类似于
    NTILE
    的函数有什么想法吗?(如果这是一项复杂的工作,只需对您的方法做一个概述就可以了。)
  • 下面是SQL Server的
    NTILE
    输出示例

    Bin |# Observations
    1   26
    2   26
    3   26
    4   26
    5   26
    6   26
    7   26
    8   25
    9   25
    
    这里是熊猫:

    Bin |# Observations
    1   26
    2   26
    3   26
    4   25 (Why is this 25 vs others?)
    5   26
    6   26
    7   25 (Why is this 25 vs others?)
    8   26
    9   26
    

    qcut
    的行为类似于此,因为它更精确。以下是一个例子:

    对于第i级,它从分位数(i-1)*10%开始:

    输出为:

    array([27, 26, 26, 26, 27, 26, 26, 26, 26, 27])
    
    array([27, 27, 27, 26, 26, 26, 26, 26, 26, 26])
    
    如果您想要分位数,您可以自己计算分位数:

    n = len(a)
    ngroup = 10
    
    counts = np.ones(ngroup, int)*(n//ngroup)
    counts[:n%ngroup] += 1
    
    q = np.r_[0, np.cumsum(counts / float(n))]
    q[-1] = 1.0
    r2 = pd.qcut(a, q)
    np.bincount(r2.labels)
    
    输出为:

    array([27, 26, 26, 26, 27, 26, 26, 26, 26, 27])
    
    array([27, 27, 27, 26, 26, 26, 26, 26, 26, 26])
    

    什么输入给出了这个结果?你能分享你的系列和熊猫代码吗?我想我能理解。第一级的qcut观测值是否总是较多(因为(i-1)对于第一级而言毫无意义)?此外,q[-1]=1的必要条件是确保范围以1结束,而不是任意接近1的分数?