Bunu yapmanın bir yolu var mı? Bir CDF'yi çizmek için panda dizilerini aramanın kolay bir yolu göremiyorum.Python'da bir panda dizisinin CDF'sinin çizimi
cevap
ben aradığınız işlevselliği İşte
matplotlib
yılında hist() fonksiyonunu sarar bir Serisi nesnesinin hist yönteminde olduğuna inanıyoruz Örneğin için ilgili dokümantasyonIn [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.
...
var
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()
Mümkünse kodu yedeklemek için bazı açıklama ve linkler eklemeye çalışın lütfen – Ram
Sadece almak için bir yolu var mı adım fonksiyonu ve barlar dolu değil mi? – robertevansanders
Bu 'pyplot.hist' belgesinde de bulunan histtype = 'step'' olurdu –
Bir CDF veya birikimli dağılım işlevi grafiği temel olarak, X ekseni üzerinde sıralanmış değerleri ve Y ekseninde kümülatif dağılımı gösteren bir grafiktir. Bu yüzden, sıralanmış değerler ile indeks ve kümülatif dağılım değerleri olarak yeni bir dizi yaratacağım.
Önce bir örnek dizisi oluşturmak:
import pandas as pd
import numpy as np
ser = pd.Series(np.random.normal(size=100))
Sıralama serisi:
ser = ser.sort_values()
Şimdi, devam etmeden önce, yine geçen (ve en büyük) değeri ekleyin. Son olarak
cum_dist = np.linspace(0.,1.,len(ser))
ser_cdf = pd.Series(cum_dist, index=ser)
:
ser[len(ser)] = ser.iloc[-1]
değerleri olarak endeks olarak sıralanmış değerler ve kümülatif dağılımı ile yeni bir dizi oluşturun: Bu adım tarafsız bir CDF'yi almak için özellikle küçük örnek boyutları için önemlidir adımlar olarak işlev çizmek: bana göre
ser_cdf.plot(drawstyle='steps')
, bunu yapmak için bir basit yolu gibi görünüyordu:
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))
Bu en kolay yoldur.
import pandas as pd
df = pd.Series([i for i in range(100)])
df.hist(cumulative='True')
Bu kabul edilen cevap olmalı! –
Sorununuzu tanımlayabilir misiniz? Giriş ve çıkış nedir? scipy.stats, ilginizi çekebilecek cdf işlevlerine sahiptir. –
Bunun için bir özellik isteği vardı, ancak pandaların etki alanı dışında. [Seaborn] kullanın (http://web.stanford.edu/~mwaskom/software/seaborn/tutorial/plotting_distributions.html#basic-visualization-with-histograms) 'kdeplot' ile kümülatif = True ' – TomAugspurger
Giriş bir dizi, çıktı bir CDF işlevinin bir çizimidir. – robertevansanders