Pandas DataFrame列赋值ValueError:传递的项数错误

时间:2016-01-05 19:52:58

标签: python numpy pandas quantitative-finance

我遇到的问题是在Anaconda升级之前运行的脚本(因此升级了大熊猫和numpy)

我有一个DataFrame,我希望使用一列,并乘以另一个DataFrame的列中的值,将最终值输出到新DataFrame中的列。正如我所说,这段代码一直在运行,直到我升级为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_portfolio()并返回portfolio['holdings'] = self.positions*self.bars['Close']并返回

时出现错误
  

ValueError:传递的项目数量错误3509,展示位置意味着1。

self.positions具有这种外观(其索引大约为3600):

    Symbol
1    int
2    int
3    int

self.bars.Close具有此外观(与self.positions相同的索引大小):

    Close
1   float
2   float
3   float

我是否忽视了一些明显的东西?我知道我正在传递一个系列,而不是一个单一的值,但我很困惑,为什么我得到"位置意味着1"出。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

尝试沿着下面的行调整乘法:

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