2014-08-29 14 views
20

Gibt es eine Möglichkeit, dies zu tun? Ich kann nicht scheinen eine einfache Möglichkeit, Pandas-Serie mit dem Plotten einer CDF zu verbinden.Plotten CDF einer Pandas-Serie in Python

+1

Können Sie Ihr Problem definieren? Was ist die Eingabe und Ausgabe? scipy.stats hat die cdf-Funktionen, die Sie interessieren könnten. –

+3

Es gab eine Feature-Anfrage für diese, aber es ist außerhalb Pandas Domain. Verwenden Sie [seaborn] (http://web.stanford.edu/~mwaskom/software/seaborn/tutorial/plotting_distributions.html#basic-visualization-with-histograms) '' kdeplot' mit 'cumulative = True' – TomAugspurger

+0

Eingabe ist Eine Serie, Ausgabe ist eine grafische Darstellung einer CDF-Funktion. – robertevansanders

Antwort

40

Ich glaube, die Funktionalität Sie suchen in der hist Methode eines Series-Objekt ist, das die hist() Funktion in matplotlib wickelt

Hier ist die entsprechende Dokumentation

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. 

... 

Zum Beispiel

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

Bitte versuchen Sie, eine Beschreibung und Links zu den Code zu sichern wenn möglich – Ram

+1

Gibt es eine Möglichkeit, nur zu bekommen Schrittfunktion und nicht die Balken ausgefüllt? – robertevansanders

+6

Das wäre 'histtype = 'step', was auch in der' pyplot.hist'-Dokumentation oben steht. –

13

Eine CDF oder kumulative Verteilung Funktionsdiagramm ist im Grunde ein Diagramm mit auf der X-Achse die sortierten Werte und auf der Y-Achse die kumulative Verteilung. Also würde ich eine neue Serie mit den sortierten Werten als Index und der kumulativen Verteilung als Werte erstellen.

Zuerst ein Beispiel Serie erstellen:

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

Sortieren der Serie:

ser = ser.sort_values() 

Nun, bevor Sie fortfahren, fügen Sie wieder die letzte (und größte) Wert. Dieser Schritt ist wichtig, vor allem für kleine Probengrößen, um eine unvoreingenommene CDF zu erhalten:

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

Erstellen Sie eine neue Serie mit den sortierten Werten als Index und der kumulativen Verteilung als Werte:

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

Schließlich plotten die Funktion als Schritte:

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

Warum muss der letzte Wert angehängt werden? –

+1

'order' ist veraltet. Verwenden Sie 'ser.sort_values ​​()'. – Lukas

+0

@kadee 'ser [len (ser)] = ser.iloc [-1]' funktioniert nicht auf Pandas 0.19 – jlandercy

2

mir schien dies wie eine einfach Art und Weise, es zu tun:

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

Dies ist der einfachste Weg.

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

Image of cumulative histogram

+0

Dies sollte die akzeptierte Antwort sein! –