pandas python DataFrameに大きな相関行列があります:df(342、342)。
対角線に沿った1を含まない、上の三角形のすべての数値の平均、sdなどを取得するにはどうすればよいですか?
ありがとうございました。
別の潜在的な一行の答え:
In [1]: corr
Out[1]:
a b c d e
a 1.000000 0.022246 0.018614 0.022592 0.008520
b 0.022246 1.000000 0.033029 0.049714 -0.008243
c 0.018614 0.033029 1.000000 -0.016244 0.049010
d 0.022592 0.049714 -0.016244 1.000000 -0.015428
e 0.008520 -0.008243 0.049010 -0.015428 1.000000
In [2]: corr.values[np.triu_indices_from(corr.values,1)].mean()
Out[2]: 0.016381
編集:パフォーマンスメトリクスを追加
私のソリューションのパフォーマンス:
In [3]: %timeit corr.values[np.triu_indices_from(corr.values,1)].mean()
10000 loops, best of 3: 48.1 us per loop
Theodros Zellekeの1行ソリューションのパフォーマンス:
In [4]: %timeit corr.unstack().ix[zip(*np.triu_indices_from(corr, 1))].mean()
1000 loops, best of 3: 823 us per loop
DSMのソリューションのパフォーマンス:
In [5]: def method1(df):
...: df2 = df.copy()
...: df2.values[np.tril_indices_from(df2)] = np.nan
...: return df2.unstack().mean()
...:
In [5]: %timeit method1(corr)
1000 loops, best of 3: 242 us per loop
これはちょっと楽しいです。これが本物のパンダ風であることを保証するものではありません。私はまだ自分自身を学ぶ「numpy+betterindexing」の段階にありpandas
ます。そうは言っても、このような何かが仕事を成し遂げるはずです。
まず、おもちゃの相関行列を作成して、次の操作を行います。
>>> import pandas as pd
>>> import numpy as np
>>> frame = pd.DataFrame(np.random.randn(1000, 5), columns=['a', 'b', 'c', 'd', 'e'])
>>> corr = frame.corr()
>>> corr
a b c d e
a 1.000000 0.022246 0.018614 0.022592 0.008520
b 0.022246 1.000000 0.033029 0.049714 -0.008243
c 0.018614 0.033029 1.000000 -0.016244 0.049010
d 0.022592 0.049714 -0.016244 1.000000 -0.015428
e 0.008520 -0.008243 0.049010 -0.015428 1.000000
次に、コピーを作成し、tril_indices_fromを使用して低いインデックスを取得し、それらをマスクします。
>>> c2 = corr.copy()
>>> c2.values[np.tril_indices_from(c2)] = np.nan
>>> c2
a b c d e
a NaN 0.06952 -0.021632 -0.028412 -0.029729
b NaN NaN -0.022343 -0.063658 0.055247
c NaN NaN NaN -0.013272 0.029102
d NaN NaN NaN NaN -0.046877
e NaN NaN NaN NaN NaN
これで、フラット化された配列で統計を実行できます。
>>> c2.unstack().mean()
-0.0072054178481488901
>>> c2.unstack().std()
0.043839624201635466