2016-01-20 3 views
6

私はパンダのデータフレーム内の行のすべてのペアごとの組み合わせで機能(相関)を実行しようとしている:もちろん、Pythonのパンダ機能は、行のすべてのペアごとの組み合わせに適用

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) 

が、これは非常に遅く、 apply()などのようなものを使用して同等の処理を行う方法が不思議です。

注:私は、私が直接pandas corr()機能を備えたデータフレームの相関関係を見つけることができます知っている、しかし、それは関連するp値を返しません(私は、フィルタリングのために必要がある)

+1

あなたは[ 'pearsonr'](https://github.com/scipy/scipy/blob/v0.16.1/scipy/stats/stats.py#L2514)のソースを見ると、あなたが見つけます相関係数がある場合は、p値を計算するコードがほんの数行必要です。 '.apply(function)'で使うことができる 'function'を作るのは非常に難しいことではありません。 – Primer

+0

あなたのタイトルをより具体的なものに変更することを検討してください:) –

答えて

2

これはあなたにいくつかを取得する必要がありますスピードアップ。

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) 

使用applymapdat.corrに要素単位の操作を行います。プライマーのリンク内のドキュメントから変更機能Pearsonを定義します。

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) 

あなたはdatが大きい場合、この方法でスピードアップ見ていますが、それがあるため、要素ごとの操作でまだかなり遅いです:あなたはPearsonに相関係数rを渡しています。

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 
関連する問題