我参考这篇文章,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]) ,它可以工作。 –