Python DataFrame列分配值错误:传递的项数错误
我对Anaconda升级之前运行的脚本有问题(因此升级了pandas和numpy) 我有一个数据帧,我想使用其中一列,然后乘以另一个数据帧的一列中的值,将最终值输出到新数据帧中的一列。正如我所说,这段代码在升级到pandas 0.17之前一直有效Python DataFrame列分配值错误:传递的项数错误,python,numpy,pandas,quantitative-finance,Python,Numpy,Pandas,Quantitative Finance,我对Anaconda升级之前运行的脚本有问题(因此升级了pandas和numpy) 我有一个数据帧,我想使用其中一列,然后乘以另一个数据帧的一列中的值,将最终值输出到新数据帧中的一列。正如我所说,这段代码在升级到pandas 0.17之前一直有效 class MarketOnClosePortfolio(Portfolio): def __init__(self, symbol, bars, signals, initial_capital=10000.0): self.
class MarketOnClosePortfolio(Portfolio):
def __init__(self, symbol, bars, signals, initial_capital=10000.0):
self.symbol = symbol
self.bars = bars
self.signals = signals
self.initial_capital = float(initial_capital)
self.positions = self.generate_positions()
def generate_positions(self):
positions = pd.DataFrame(index=signals.index).fillna(0.0)
positions[self.symbol] = signals['signal']*10
return positions
def backtest_portfolio(self):
portfolio = self.positions*self.bars['Close']
pos_diff = self.positions.diff()
portfolio = pd.DataFrame(index=signals.index)
portfolio['holdings'] = (self.positions*self.bars['Close'])
portfolio['cash'] = self.initial_capital - (pos_diff*self.bars['Close']).sum(axis=1).cumsum()
portfolio['total'] = portfolio['cash'] + portfolio['holdings']
portfolio['returns'] = portfolio['total'].pct_change()
return portfolio
if __name__ == "__main__":
portfolio = MarketOnClosePortfolio(symbol, bars, signals, initial_capital=10000.0)
returns = portfolio.backtest_portfolio()
当尝试执行returns=portfolio.backtest\u portfolio()
返回到portfolio['holdings']=self.positions*self.bar['Close']
并返回时,出现了我的错误
ValueError:传递的项目数错误3509,放置意味着1
self.positions具有以下外观(其索引约为3600):
self.bar.Close具有此外观(与self.positions的索引大小相同):
我是不是忽略了一些显而易见的东西?我知道我传递的是一个序列,而不是一个值,但我不明白为什么我会得到“placement暗示1”
非常感谢您的帮助 试着按照以下几行调整乘法:
position = pd.DataFrame({'symbol': [ 1,2,3,4,5]})
bar = pd.DataFrame({'close': np.random.random(5)})
position.symbol.mul(bar.close, axis=0)
0 0.184591
1 1.830434
2 0.343875
3 1.531412
4 2.257981
dtype: float64
@斯特凡。self.positions是一个数据帧,其形式为
符号索引值
约3600行。您是否尝试过self.positions.shape和self.bar['close'].shape?顺便说一句,看起来您要创建两次投资组合。我猜,self.bar['Close']
只选择了一个项目,可能是通过行索引
,而不是您想要的列
。可能需要尝试self.bar.loc[:,'Close']]
代替。确定。有趣。它self.bars.Close.shape返回(3559,),但当我打印(bars.head())时,它具有所有预期值。self.positions.shape返回与应有的索引值相同的1列索引值。(3559,1)您是否试图将self.bar.与self.positions中的所有列相乘。关闭?没有看到数据
,这只是一点猜测。是的,我是。self.positions只有一列(符号)定义给定股票符号中的位置。我在questionrunningportfolio['holdings']=position.symbol.mul(bar.close)
中添加了一个数据格式的小示例,该示例输出一个数据帧,其中索引作为末尾带有符号的列传递。形状的ie(35593560)尝试添加axis=0
关键字以确保索引对齐-假设它们兼容?谢谢!看来我们现在有进展了。更改axis=0解决了乘法问题,同时还在列中添加了相关符号的标题。然而,我的现金栏根本没有运作。只需过账原始现金价值,而不是价值减去购买股票的原始成本。我来看看我能做些什么。关于现金
:看起来它是\uuuu init\uuuu
中的浮点值,但是当使用.sum(axis=1.cumsum()
时,您试图减去一个序列。也许那一行应该是sum(axis=1).sum()
,所以你在那里也有一个数字?你总是很有帮助并且在线。谢谢所以我实际上完全删除了.sum(),而是使用了portfolio['cash']=self.initial\u capital-pos\u diff.mul(self.bar.Close,axis=0).cumsum()
。这似乎解决了问题。
Close
1 float
2 float
3 float
position = pd.DataFrame({'symbol': [ 1,2,3,4,5]})
bar = pd.DataFrame({'close': np.random.random(5)})
position.symbol.mul(bar.close, axis=0)
0 0.184591
1 1.830434
2 0.343875
3 1.531412
4 2.257981
dtype: float64