2014-08-29 11 views
20

Czy jest jakiś sposób na zrobienie tego? Nie mogę wydawać się łatwym sposobem na połączenie serii pand z planowaniem CDF.Wykreślanie CDF z serii pand w pytonie

+1

można zdefiniować problemu? Jakie jest wejście i wyjście? scipy.stats mają funkcje cdf, które mogą Cię zainteresować. –

+3

Wystąpiła prośba o dodanie funkcji, ale jest to domena poza domeną pand. Użyj "seaborn" (http://web.stanford.edu/~mwaskom/software/seaborn/tutorial/plotting_distributions.html#basic-visualization-with-histograms) z 'kdeplot' z' cumulative = True' – TomAugspurger

+0

seria, wyjście to wykres funkcji CDF. – robertevansanders

Odpowiedz

40

wierzę funkcjonalność szukasz jest w metodzie hist obiektu Serii który owija funkcji hist() w matplotlib

Oto odpowiednia dokumentacja

In [10]: import matplotlib.pyplot as plt 

In [11]: plt.hist? 
... 
Plot a histogram. 

Compute and draw the histogram of *x*. The return value is a 
tuple (*n*, *bins*, *patches*) or ([*n0*, *n1*, ...], *bins*, 
[*patches0*, *patches1*,...]) if the input contains multiple 
data. 
... 
cumulative : boolean, optional, default : True 
    If `True`, then a histogram is computed where each bin gives the 
    counts in that bin plus all bins for smaller values. The last bin 
    gives the total number of datapoints. If `normed` is also `True` 
    then the histogram is normalized such that the last bin equals 1. 
    If `cumulative` evaluates to less than 0 (e.g., -1), the direction 
    of accumulation is reversed. In this case, if `normed` is also 
    `True`, then the histogram is normalized such that the first bin 
    equals 1. 

... 

Na przykład

In [12]: import pandas as pd 

In [13]: import numpy as np 

In [14]: ser = pd.Series(np.random.normal(size=1000)) 

In [15]: ser.hist(cumulative=True, normed=1, bins=100) 
Out[15]: <matplotlib.axes.AxesSubplot at 0x11469a590> 

In [16]: plt.show() 
+0

proszę spróbować dodać opis i linki do tworzenia kopii zapasowych kodu, jeśli to możliwe – Ram

+1

Czy istnieje sposób, aby po prostu uzyskać funkcja krokowa i nie masz wypełnionych pasków? – robertevansanders

+6

To byłoby 'histtype = 'step'', które również znajduje się w dokumentacji' pyplot.hist' skróconej powyżej –

13

Wykres funkcji dystrybucji CDF lub skumulowanego rozkładu jest po prostu wykresem, na osi X posortowane wartości, a na osi Y skumulowanym rozkładem. Tak więc, utworzyłbym nową serię z posortowanymi wartościami jako indeks i skumulowaną dystrybucją jako wartościami.

Najpierw utwórz przykładową serie:

import pandas as pd 
import numpy as np 
ser = pd.Series(np.random.normal(size=100)) 

posortować serii:

ser = ser.sort_values() 

Teraz przed postępowaniem, dołącz raz ostatni (i) wartość największą. Ten krok jest ważny zwłaszcza dla małych rozmiarach próbki w celu uzyskania obiektywnej CDF:

ser[len(ser)] = ser.iloc[-1] 

Utwórz nową serię z posortowanych wartości jako wskaźnika i dystrybuantę jak wartości:

cum_dist = np.linspace(0.,1.,len(ser)) 
ser_cdf = pd.Series(cum_dist, index=ser) 

Wreszcie, wykreślić funkcję jak etapów:

ser_cdf.plot(drawstyle='steps') 
+5

Dlaczego konieczne jest dołączenie ostatniej wartości? –

+1

'order' jest przestarzałe. Użyj 'ser.sort_values ​​()'. – Lukas

+0

@kadee 'ser [len (ser)] = ser.iloc [-1]' nie działa na pandach 0.19 – jlandercy

2

do mnie, to wydawało się, że po prostu sposób, aby to zrobić:

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 

heights = pd.Series(np.random.normal(size=100)) 

# empirical CDF 
def F(x,data): 
    return float(len(data[data <= x]))/len(data) 

vF = np.vectorize(F, excluded=['data']) 

plt.plot(np.sort(heights),vF(x=np.sort(heights), data=heights)) 
3

To jest najprostszy sposób.

import pandas as pd 
df = pd.Series([i for i in range(100)]) 
df.hist(cumulative='True') 

Image of cumulative histogram

+0

To powinna być zaakceptowana odpowiedź! –