Python Pandas qcut的行为与观察结果不能被#箱整除

时间:2013-12-22 05:19:04

标签: python pandas ranking-functions

假设我有一个大熊猫系列的美元价值,并希望使用qcut离散为9组。观察数#不能被9整除.SQL Server的ntile函数对于这种情况有一个标准的方法:它使9个组中的第一个 n 1观察大于剩下的(9- n )组。

我在熊猫中注意到,哪些组的 x 观察与 x + 1观察的分配似乎是随机的。我试图破译algos中的代码来弄清楚分位数函数如何处理这个问题,但无法弄明白。

我有三个相关的问题:

  1. 任何熊猫开发者都可以解释qcut的行为?是随机哪个群体获得更多的观察结果?
  2. 有没有办法强制qcut的行为与NTILE类似(即,第一组获取 x + 1次观察)?
  3. 如果#2的答案为否,那么对于函数的任何想法都会像NTILE那样? (如果这是一项复杂的工作,只需对您的方法进行概述就会有所帮助。)
  4. 以下是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
    

1 个答案:

答案 0 :(得分:2)

qcut表现得像这样,因为它更准确。这是一个例子:

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

import pandas as pd
import numpy as np

a = np.random.rand(26*10+3)
r = pd.qcut(a, 10)
np.bincount(r.labels)

输出是:

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

如果你想要NTILE,你可以自己计算分位数:

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, 27, 27, 26, 26, 26, 26, 26, 26, 26])