Pandas DataFrame列分配ValueError:传递的项目数错误 [英] Pandas DataFrame column assignment ValueError: Wrong number of items passed

查看:471
本文介绍了Pandas DataFrame列分配ValueError:传递的项目数错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am having an issue with a script that was functioning prior to an upgrade of Anaconda (thus an upgrade of pandas and numpy)

我有一个DataFrame,我想使用其中的一列并乘以另一个DataFrame的一列中的值,然后将最终值输出到新DataFrame的一列中.正如我所说的那样,在我升级到熊猫0.17之前,该代码一直有效.

I have a DataFrame that I would like to use one column from and multiply by the values in a column of another DataFrame, outputting the final value to a column in a new DataFrame. As I said this code was working until I upgraded to 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()

尝试执行回portfolio['holdings'] = self.positions*self.bars['Close']并返回

ValueError:传递的项目数错误3509,放置位置表示1.

ValueError: Wrong number of items passed 3509, placement implies 1.

self.positions具有以下外观(其索引约为3600):

self.positions has this appearance (its index is around 3600):

    Symbol
1    int
2    int
3    int

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

self.bars.Close has this apperance (same index size as self.positions):

    Close
1   float
2   float
3   float

我在这里可以忽略一些明显的东西吗?我知道我传递的不是一个值,而是一个序列,但是我很困惑为什么我得到刊登位置蕴含1"的含义.

Am i overlooking something obvious here? I know I am passing a series and not a single value, but i am confused why i am getting "placement implies 1" out.

任何帮助将不胜感激.

Any help is greatly appreciated.

推荐答案

尝试按照以下内容调整乘法:

Try adjusting your multiplication along the lines of the below:

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

这篇关于Pandas DataFrame列分配ValueError:传递的项目数错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆