我參考這篇文章,Get dot-product of dataframe with vector, and return dataframe, in Pandas,使用DataFrame.mul。
我的問題的代碼是這樣
使用DataFrame.mul時出錯,涉及到ndarray
df.mul(weight)
其中重量是具有形狀(17L,1L) 'numpy.ndarray' 的數據類型,並且打印結果是
[[ 2.37005330e-07]
[ 2.80515078e-07]
[ 2.80267682e-07]
[ 2.79124521e-07]
[ 2.01799847e-07]
[ 2.71495529e-07]
[ 2.81640566e-07]
[ 2.30099310e-07]
[ 1.95221059e-07]
[ 2.10244387e-07]
[ 2.82483251e-07]
[ 2.29050342e-07]
[ 9.99996381e-01]
[ 8.95340469e-08]
[ 3.90767576e-08]
[ 2.31231511e-07]
[ 2.79852240e-07]]
其中Df是一個形狀爲[20208 rows x 17列]的數據框對象,其打印結果類似於
12&88 17&123 ....
modified datetime
2015-09-07 09:19:00 1.000000 1.000000 ....
2015-09-07 09:30:00 1.000000 1.000000 ....
2015-09-07 09:31:00 1.000000 0.974714 ....
2015-09-07 09:32:00 1.000000 0.978203 ....
2015-09-07 09:33:00 1.000000 0.978203 ....
2015-09-07 09:34:00 1.000000 0.990576 ....
....
但是,當我執行df.mul(重量),它發生
ValueError: Shape of passed values is (1, 17), indices imply (17, 20208)
我試圖更簡單的陣列形狀(17L)並且沒有使用df.mul.so不知是否應該改變問題重量到ndarray到陣列,但對我來說很難。如何改變或者有沒有更好的主意來解決這個問題?非常感謝你的幫助!
這裏是我的原代碼
weight, means, stds = optimal_portfolio(result_framea.transpose())
c , b= test.pairs_trade(load_path, sNo_list[0])
result_frame = pd.DataFrame(index = c.index)
for i, sNo in enumerate(sNo_list):
c,b = test.pairs_trade(load_path, sNo)
result_frame[sNo[0]+'&'+sNo[1]] = c['returns']
df=result_frame.fillna(method='pad')
各地都很好,直到後df.mul(重量)的時刻。再次謝謝你!
你可以試試'df.mul(weight,axis = 0)'基本上它使用次軸來對齊由於廣播規則 – EdChum
我也嘗試axis = 1後axis = 0,仍然是相同的值錯誤。 –
但是當我隨機設置一個像數組一樣的新「權重」([1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1]) ,它可以工作。 –