Получить корреляцию между подмножеством столбцов в пандах - PullRequest
0 голосов
/ 30 апреля 2018

Итак, я знаком с более продвинутым индексированием Pandas и с использованием .apply() для столбцов / строк данных, но по какой-то причине я не могу понять, как получить матрицу дисперсии-ковариации для некоторых столбцов вручную, не возвращаясь к .corr().

Всякий раз, когда я пытаюсь выполнить следующее, чтобы разрезать нужные столбцы (все строки и все столбцы после «APPL R»),

a = np.cov(data1.loc[:,'AAPL R':])

Я получаю ответ как

array([[  7.27823733e-04,   2.26078140e-04,   1.99410574e-04, ...,
          9.57801851e-05,  -2.76751908e-04,   5.71509542e-05],
       [  2.26078140e-04,   1.26173616e-04,   2.17306383e-04, ...,
          3.30070375e-05,  -2.47989495e-05,   1.16819595e-05],
       [  1.99410574e-04,   2.17306383e-04,   1.92984210e-03, ...,
         -2.27400788e-04,  -4.46589343e-05,  -5.90865613e-05],
       ..., 
       [  9.57801851e-05,   3.30070375e-05,  -2.27400788e-04, ...,

Как я мог вручную получить простой вывод, подобный этому, в Pandas?

enter image description here

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Если вы настаиваете на том, чтобы не использовать DataFrame.corr():

  • Вы не отправляете правильные списки для функции numpy. Вы хотите, чтобы каждый столбец был отдельным списком, поэтому вы должны использовать transpose DataFrame.

  • Вам нужна корреляционная матрица, а не ковариационная матрица, поэтому вы должны использовать np.corrcoef(). (Если вам действительно нужна ковариационная матрица, тогда лучше использовать np.cov())

Вот df у меня в памяти другой вопрос.

             open   high    low  close  volume
date                                          
2017-11-01  44.66  44.75  42.19  42.93    3500
2017-11-03  44.66  44.75  42.19  42.93    3500
2017-11-06  43.15  43.75  40.60  41.02    9200
2017-11-07  43.15  43.75  40.60  41.02    9200
2017-11-08  43.15  43.75  40.60  41.02    9200
2017-11-09  43.15  43.75  40.60  41.02    9200
2017-11-10  43.15  43.75  40.60  41.02    9200
2017-11-13  41.60  43.21  40.03  42.36    3575
2017-11-14  41.60  43.21  40.03  42.36    3575
...

df.corr()
#            open      high       low     close    volume
#open    1.000000  0.891708  0.957078  0.351604  0.320314
#high    0.891708  1.000000  0.878307  0.610183  0.311939
#low     0.957078  0.878307  1.000000  0.559366  0.146151
#close   0.351604  0.610183  0.559366  1.000000 -0.132609
#volume  0.320314  0.311939  0.146151 -0.132609  1.000000

np.corrcoef(df.loc[:,'open':].values.T)
#array([[ 1.        ,  0.89170836,  0.95707833,  0.35160354,  0.32031362],
#       [ 0.89170836,  1.        ,  0.87830748,  0.61018322,  0.31193906],
#       [ 0.95707833,  0.87830748,  1.        ,  0.55936625,  0.14615072],
#       [ 0.35160354,  0.61018322,  0.55936625,  1.        , -0.13260909],
#       [ 0.32031362,  0.31193906,  0.14615072, -0.13260909,  1.        ]])
0 голосов
/ 30 апреля 2018

Использование corr из pandas

df=pd.DataFrame({'V1':[1,2,3],'V2':[3,2,1],'V3':[3,4,9]})
df.corr()
Out[431]: 
          V1        V2        V3
V1  1.000000 -1.000000  0.933257
V2 -1.000000  1.000000 -0.933257
V3  0.933257 -0.933257  1.000000
...