Dokumentacja mówi:
http://pandas.pydata.org/pandas-docs/dev/basics.html
„Wartości ciągłe można dyskretyzować za pomocą funkcji cut (pojemniki oparte na wartościach) i qcut (pojemniki oparte na kwantylach próbek)”
Brzmi dla mnie bardzo abstrakcyjnie ... Widzę różnice w poniższym przykładzie, ale co właściwie robi / oznacza qcut (kwantyl próbki)? Kiedy użyłbyś qcut zamiast cut?
Dzięki.
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]]`
Odpowiedzi:
Na początek zwróć uwagę, że kwantyle to najbardziej ogólne określenie na takie elementy, jak percentyle, kwartyle i mediany. W swoim przykładzie określiłeś pięć pojemników, więc prosisz
qcut
o kwintyle.Tak więc, gdy poprosisz o kwintyle z
qcut
, pojemniki zostaną wybrane tak, aby mieć taką samą liczbę rekordów w każdym pojemniku. Masz 30 rekordów, więc powinieneś mieć 6 w każdym koszu (twoje wyjście powinno wyglądać tak, chociaż punkty przerwania będą się różnić ze względu na losowanie):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
I odwrotnie, bo
cut
zobaczysz coś bardziej nierównego: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
Dzieje się tak, ponieważ
cut
wybierze pojemniki, które mają być równomiernie rozmieszczone zgodnie z samymi wartościami, a nie częstotliwością tych wartości. W związku z tym, ponieważ narysowałeś z losowej normy normalnej, zobaczysz wyższe częstotliwości w pojemnikach wewnętrznych, a mniej w zewnętrznych. Zasadniczo będzie to tabelaryczna forma histogramu (który, jak można się spodziewać, będzie miał kształt dzwonu z 30 rekordami).źródło
cut
lub możesz bardziej przejmować się najwyższym 5% i użyć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
źródło
Zatem qcut zapewnia bardziej równomierny rozkład wartości w każdym przedziale, nawet jeśli skupiają się w przestrzeni próbki. Oznacza to, że mniej prawdopodobne jest, że będziesz mieć pojemnik pełen danych z bardzo bliskimi wartościami i inny pojemnik z zerowymi wartościami. Ogólnie rzecz biorąc, jest to lepsze samplowanie.
źródło
Pd.qcut rozdziela elementy tablicy wykonując dzielenie na podstawie ((ilość elementów w tablicy) / (ilość koszy - 1)), a następnie dzieli tyle nie. elementów seryjnie w każdym koszu.
Pd.cut rozdziela elementy tablicy po dokonaniu podziału na podstawie ((pierwszy + ostatni element) / (liczba bins-1)), a następnie rozdziela elementy według zakresu wartości, w jakim się one mieszczą.
źródło