2014-08-29 36 views
20

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

+1

Sorununuzu tanımlayabilir misiniz? Giriş ve çıkış nedir? scipy.stats, ilginizi çekebilecek cdf işlevlerine sahiptir. –

+3

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

+0

Giriş bir dizi, çıktı bir CDF işlevinin bir çizimidir. – robertevansanders

cevap

40

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ümantasyon

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. 

... 

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() 
+0

Mümkünse kodu yedeklemek için bazı açıklama ve linkler eklemeye çalışın lütfen – Ram

+1

Sadece almak için bir yolu var mı adım fonksiyonu ve barlar dolu değil mi? – robertevansanders

+6

Bu 'pyplot.hist' belgesinde de bulunan histtype = 'step'' olurdu –

13

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') 
+5

Son değeri eklemek neden gereklidir? –

+1

'order', kullanımdan kaldırılmıştır. Ser.sort_values ​​() 'işlevini kullanın. – Lukas

+0

@kadee 'ser [len (ser)] = ser.iloc [-1]' pandalar üzerinde çalışmaz 0.19 – jlandercy

2

, 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)) 
3

Bu en kolay yoldur.

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

Image of cumulative histogram

+0

Bu kabul edilen cevap olmalı! –