6

假设我有一个 pandas 的美元值系列,并想使用qcut. 观察的数量不能被 9 整除。ntile对于这种情况,SQL Server 的函数有一个标准方法:它使 9 个组中的前n个观察值大于其余 (9 -n ) 个组。

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

我有三个相关的问题:

  1. 那里有任何熊猫开发人员可以解释qcut的行为吗?哪些组获得更多的观察值是随机的吗?
  2. 有没有办法强制qcut行为类似于NTILE(即第一组得到x + 1 个观察值)?
  3. 如果对#2 的回答是否定的,关于函数的任何想法会表现得像NTILE吗?(如果这是一项复杂的工作,只需概述您的方法会有所帮助。)

下面是 SQL ServerNTILE输出的示例。

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
4

1 回答 1

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])
于 2013-12-22T08:24:28.313 回答