2016-01-20 19 views
6

Bir pandalar dataframe içindeki tüm satırları ikili kombinasyonlara bir işlev (korelasyon) yönetmeye çalışıyorum: Tabii kiPython pandalar fonksiyon satırların tüm ikili kombinasyonları uygulanan

stats = dict() 
for l in itertools.combinations(dat.index.tolist(),2): 
    stats[l] = pearsonr(dat.loc[l[0],:], dat.loc[l[1],:]) # stores (r, p) 

bu oldukça yavaş ve Ben apply() veya başka bir şekilde kullanımı ile eşdeğer nasıl yapılır merak ediyorum.

Not: Ben ancak (ı filtreleme amaçlı gerekir) ilişkili p değeri

+1

sen kaynağında bakacak olursak [ 'pearsonr'] (https://github.com/scipy/scipy/blob/v0.16.1/scipy/stats/stats.py#L2514) bulacaksın korelasyon katsayısı varsa, p-değerini hesaplamak için sadece birkaç satırlık kod alması gerekir. '.apply (function)' ile kullanabileceğiniz '' 'işlevini yapmak çok zor olmamalıdır. – Primer

+0

, başlığınızı daha spesifik bir şeye dönüştürmeyi düşünür :) –

cevap

2

dönmez, doğrudan pandas corr() fonksiyonu ile dataframe korelasyon bulabilirsiniz biliyorum Bu sana biraz almalısınız hızlanma.

def Pearson(r, n=len(dat)): 
    r = max(min(r, 1.0), -1.0) 
    df = n - 2 
    if abs(r) == 1.0: 
     prob = 0.0 
    else: 
     t_squared = r**2 * (df/((1.0 - r) * (1.0 + r))) 
     prob = betai(0.5*df, 0.5, df/(df+t_squared)) 

    return (r,prob) 

kullanın applymapdat.corr üzerinde öğeye göre işlemleri yapar: Primer en linkte dokümanlardan modifiye bir işlev Pearson, tanımlayın.

np.random.seed(10) 
dat = pd.DataFrame(np.random.randn(5, 5)) 
dat[0] = np.arange(5) # seed two correlated cols 
dat[1] = np.arange(5) # ^^^ 

dat.corr().applymap(Pearson) 

    0 1 2 3 4 
0 (1.0, 0.0) (1.0, 0.0) (0.713010395675, 0.176397305541) (0.971681374885, 0.00569624513678) (0.0188249871501, 0.97603269768) 
1 (1.0, 0.0) (1.0, 0.0) (0.713010395675, 0.176397305541) (0.971681374885, 0.00569624513678) (0.0188249871501, 0.97603269768) 
2 (0.713010395675, 0.176397305541) (0.713010395675, 0.176397305541) (1.0, 0.0) (0.549623945218, 0.337230071385) (-0.280514871109, 0.647578381153) 
3 (0.971681374885, 0.00569624513678) (0.971681374885, 0.00569624513678) (0.549623945218, 0.337230071385) (1.0, 0.0) (0.176622737448, 0.77629170593) 
4 (0.0188249871501, 0.97603269768) (0.0188249871501, 0.97603269768) (-0.280514871109, 0.647578381153) (0.176622737448, 0.77629170593)  (1.0, 0.0) 

Sen dat büyük olduğunda bu yöntemle arttıran görüyorsunuz, ama bunun nedeni öğeye göre operasyonların hala oldukça yavaş: Sen Pearson için korelasyon katsayısı r geçiyoruz.

np.random.seed(10) 
dat = pd.DataFrame(np.random.randn(100, 100)) 

%%timeit 
dat.corr().applymap(Pearson) 

10 loops, best of 3: 118 ms per loop 

%%timeit 
stats = dict() 

for l in combinations(dat.index.tolist(),2): 
    stats[l] = pearsonr(dat.loc[l[0],:], dat.loc[l[1],:]) 

1 loops, best of 3: 1.56 s per loop 
İlgili konular