假设我有一个大熊猫系列的美元价值,并希望使用qcut
离散为9组。观察数#不能被9整除.SQL Server的ntile
函数对于这种情况有一个标准的方法:它使9个组中的第一个 n 1观察大于剩下的(9- n )组。
我在熊猫中注意到,哪些组的 x 观察与 x + 1观察的分配似乎是随机的。我试图破译algos中的代码来弄清楚分位数函数如何处理这个问题,但无法弄明白。
我有三个相关的问题:
qcut
的行为?是随机哪个群体获得更多的观察结果?qcut
的行为与NTILE
类似(即,第一组获取 x + 1次观察)?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
答案 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])