В чем разница между pandas.qcut и pandas.cut?
В документации сказано:
http://pandas.pydata.org/pandas-docs/dev/basics.html
"Непрерывные значения могут быть дискретизированы с использованием функций cut (ячейки, основанные на значениях) и qcut (ячейки, основанные на выборочных квантилях)".
Звучит очень абстрактно для меня... Я вижу различия в приведенном ниже примере, но что на самом деле делает / означает qcut (образец квантиля)? Когда бы вы использовали qcut против cut?
Благодарю.
factors = np.random.randn(30)
In [11]:
pd.cut(factors, 5)
Out[11]:
[(-0.411, 0.575], (-0.411, 0.575], (-0.411, 0.575], (-0.411, 0.575], (0.575, 1.561], ..., (-0.411, 0.575], (-1.397, -0.411], (0.575, 1.561], (-2.388, -1.397], (-0.411, 0.575]]
Length: 30
Categories (5, object): [(-2.388, -1.397] < (-1.397, -0.411] < (-0.411, 0.575] < (0.575, 1.561] < (1.561, 2.547]]
In [14]:
pd.qcut(factors, 5)
Out[14]:
[(-0.348, 0.0899], (-0.348, 0.0899], (0.0899, 1.19], (0.0899, 1.19], (0.0899, 1.19], ..., (0.0899, 1.19], (-1.137, -0.348], (1.19, 2.547], [-2.383, -1.137], (-0.348, 0.0899]]
Length: 30
Categories (5, object): [[-2.383, -1.137] < (-1.137, -0.348] < (-0.348, 0.0899] < (0.0899, 1.19] < (1.19, 2.547]]`
2 ответа
Для начала обратите внимание, что квантили - это самый общий термин для таких вещей, как процентили, квартили и медианы. Вы указали пять корзин в своем примере, поэтому вы спрашиваете qcut
для квинтилей.
Итак, когда вы просите квинтили с qcut
, корзины будут выбраны так, чтобы у вас было одинаковое количество записей в каждой корзине. У вас 30 записей, поэтому в каждой ячейке должно быть по 6 записей (ваш вывод должен выглядеть так, хотя точки останова будут отличаться из-за случайного отрисовки):
pd.qcut(factors, 5).value_counts()
[-2.578, -0.829] 6
(-0.829, -0.36] 6
(-0.36, 0.366] 6
(0.366, 0.868] 6
(0.868, 2.617] 6
И наоборот, для cut
вы увидите что-то более неровное
pd.cut(factors, 5).value_counts()
(-2.583, -1.539] 5
(-1.539, -0.5] 5
(-0.5, 0.539] 9
(0.539, 1.578] 9
(1.578, 2.617] 2
Это потому что cut
выберет ячейки для равномерного распределения в соответствии с самими значениями, а не частотой этих значений. Следовательно, поскольку вы вышли из случайной нормы, вы увидите более высокие частоты во внутренних корзинах и меньше во внешних. По сути, это будет табличная форма гистограммы (которую вы ожидаете получить в форме колокола с 30 записями).
- Команда cut создает интервалы с равным интервалом, но частота выборок в каждом интервале неодинакова
- Команда qcut создает интервалы разного размера, но частота выборок в каждом интервале одинакова.
>>> x=np.array([24, 7, 2, 25, 22, 29])
>>> x
array([24, 7, 2, 25, 22, 29])
>>> pd.cut(x,3).value_counts() #Bins size has equal interval of 9
(2, 11.0] 2
(11.0, 20.0] 0
(20.0, 29.0] 4
>>> pd.qcut(x,3).value_counts() #Equal frequecy of 2 in each bins
(1.999, 17.0] 2
(17.0, 24.333] 2
(24.333, 29.0] 2
Таким образом, qcut обеспечивает более равномерное распределение значений в каждом бине, даже если они кластеризуются в пространстве образца. Это означает, что вы с меньшей вероятностью будете иметь корзину, полную данных с очень близкими значениями, и другую корзину с 0 значениями. В общем, лучше выборка.
Pd.qcut распределяет элементы массива при делении на основе ((кол-во элементов в массиве)/(кол-во бункеров - 1)), затем делит это много нет. элементов поочередно в каждую ячейку.
Pd.cut распределяет элементы массива при делении на основе ((первый + последний элемент)/(кол-во бинов-1)), а затем распределяет элементы в соответствии с диапазоном значений, в которые они попадают.