Python DataFrame列分配值错误:传递的项数错误

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.

我对Anaconda升级之前运行的脚本有问题(因此升级了pandas和numpy)

我有一个数据帧,我想使用其中一列,然后乘以另一个数据帧的一列中的值,将最终值输出到新数据帧中的一列。正如我所说,这段代码在升级到pandas 0.17之前一直有效

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只有一列(符号)定义给定股票符号中的位置。我在questionrunning
portfolio['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