матрицы не выровнены сообщение об ошибке

У меня есть следующий фрейм данных возврата

ret
Out[3]: 
Symbol            FX      OGDC       PIB       WTI
Date                                              
2010-03-02  0.000443  0.006928  0.000000  0.012375
2010-03-03 -0.000690 -0.007873  0.000171  0.014824
2010-03-04 -0.001354  0.001545  0.000007 -0.008195
2010-03-05 -0.001578  0.008796 -0.000164  0.015955

И следующие веса для каждого символа:

df3
Out[4]: 
  Symbol    Weight
0   OGDC  0.182022
1    WTI  0.534814
2     FX  0.131243
3    PIB  0.151921

Я пытаюсь получить взвешенную доходность за каждый день и пробовал:

port_ret = ret.dot(df3)

но я получаю следующее сообщение об ошибке:

ValueError: matrices are not aligned

Моя цель состоит в том, чтобы получить взвешенную доходность для каждой даты, например, 2010-03-02 будет выглядеть следующим образом:

weighted_ret = 0.000443*.131243+.006928*.182022+0.000*0.151921+0.012375*.534814 = 0.007937512

Я не уверен, почему я получаю эту ошибку, но был бы очень рад альтернативному решению взвешенной доходности.


person John    schedule 05.09.2016    source источник


Ответы (2)


У вас есть два столбца в вашей матрице весов:

df3.shape
Out[38]: (4, 2)

Установите индекс Symbol в этой матрице, чтобы получить правильный dot:

ret.dot(df3.set_index('Symbol'))
Out[39]:
              Weight
Date
2010-03-02  0.007938
2010-03-03  0.006430
2010-03-04 -0.004278
2010-03-05  0.009902
person Zeugma    schedule 05.09.2016

Проверьте форму матриц, на которых вы вызываете скалярный продукт. Скалярное произведение матриц A.dot(B) может быть вычислено, только если вторая ось A имеет тот же размер, что и первая ось B.
В вашем примере у вас есть дополнительный столбец с датой, который разрушает ваши вычисления. Вы должны просто избавиться от него в своих вычислениях. Попробуйте запустить port_ret = ret[:,1:].dot(df3[1:]) и проверьте, дает ли он желаемый результат.
В будущих случаях используйте функцию numpy.shape() для отладки матричных вычислений, это действительно полезный инструмент.

person fulaphex    schedule 05.09.2016
comment
когда я запускаю port_ret = ret[:,1:].dot(df3[1:]) я получаю TypeError: unhashable type: 'slice' - person John; 05.09.2016
comment
Что возвращают shape(ret) и shape(df3)? Сначала я думал, что это пустые массивы, но теперь я вижу, что это панды - person fulaphex; 05.09.2016
comment
In[15] np.shape(df3) Out[15]: (4, 2) In[17] np.shape(ret) Out[17]: (4, 4) - person John; 05.09.2016
comment
так что очевидно, что они разного размера, есть ли подход панд, который позволит достичь той же цели? - person John; 05.09.2016