All*_*enQ 6 python pandas ranking-functions
假设我有一个大熊猫系列的美元价值,并希望将其分为9组qcut.观察数#不能被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
Run Code Online (Sandbox Code Playgroud)
这是熊猫:
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
Run Code Online (Sandbox Code Playgroud)
其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)
Run Code Online (Sandbox Code Playgroud)
输出是:
array([27, 26, 26, 26, 27, 26, 26, 26, 26, 27])
Run Code Online (Sandbox Code Playgroud)
如果你想要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)
Run Code Online (Sandbox Code Playgroud)
输出是:
array([27, 27, 27, 26, 26, 26, 26, 26, 26, 26])
Run Code Online (Sandbox Code Playgroud)