2016-09-05 2 views
1

У меня есть следующее dataframe возвратовматрицы не выровнены сообщение об ошибке

ret 
Out[3]: 
Symbol   FX  OGDC  PIB  WTI 
Date            
2010-03-02 0.000443 0.006928 0.000000 0.
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.*.534814 = 0.007937512 

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

ответ

0

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

+0

когда я бегу port_ret = RET [:, 1 :]. dot (df3 [1:]) Я получаю TypeError: unhashable type: 'slice' – John

+0

Что возвращает 'shape (ret)' и 'shape (df3)'? Сначала я подумал, что это массивы numpy, но теперь я вижу, что это pandas – fulaphex

+0

В [15] np.shape (df3) Out [15]: (4, 2) В [17] np.shape (ret) Out [17]: (4, 4) – John

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 
+0

, который зафиксировал его. , .благодаря – John