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
Antwort
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()
Bitte versuchen Sie, eine Beschreibung und Links zu den Code zu sichern wenn möglich – Ram
Gibt es eine Möglichkeit, nur zu bekommen Schrittfunktion und nicht die Balken ausgefüllt? – robertevansanders
Das wäre 'histtype = 'step', was auch in der' pyplot.hist'-Dokumentation oben steht. –
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')
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))
Dies ist der einfachste Weg.
import pandas as pd
df = pd.Series([i for i in range(100)])
df.hist(cumulative='True')
Dies sollte die akzeptierte Antwort sein! –
Können Sie Ihr Problem definieren? Was ist die Eingabe und Ausgabe? scipy.stats hat die cdf-Funktionen, die Sie interessieren könnten. –
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
Eingabe ist Eine Serie, Ausgabe ist eine grafische Darstellung einer CDF-Funktion. – robertevansanders