Pandas DataFrame Spalte Zuordnung ValueError: Falsche Anzahl der Elemente übergeben
Ich habe ein Problem mit einem Skript, das funktionierte vor einem upgrade von Anaconda (also ein upgrade von pandas und numpy)
Ich habe einen DataFrame, dass ich möchte eine Spalte aus und multipliziert die Werte einer Spalte eines anderen DataFrame, sodass der Letzte Wert einer Spalte in einer neuen DataFrame. Wie ich sagte, es war der code funktioniert, bis ich ein Upgrade auf 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()
Mein Fehler kommt beim ausführen returns = portfolio.backtest_portfolio()
Rückbezug auf portfolio['holdings'] = self.positions*self.bars['Close']
und gibt
ValueError: Falsche Anzahl der Elemente übergeben, 3509, Platzierung bedeutet 1.
selbst.Positionen hat dieser Auftritt (der index ist um 3600):
Symbol
1 int
2 int
3 int
selbst.bars.In der Nähe hat dieses Aussehen (gleiche index-Größe selbst.Positionen):
Close
1 float
2 float
3 float
Bin ich mit Blick auf etwas offensichtliches hier? Ich weiß, ich leite eine Serie und kein einzelner Wert, aber ich bin verwirrt, warum bin ich immer der "Platzierung bedeutet 1" aus.
Jede Hilfe wird sehr geschätzt.
- selbst.Positionen ist ein dataframe in form von
symbol index value
seine über 3600 Zeilen lang. - Haben Sie versucht, selbst.Positionen.Form und sich selbst.bars['close'].Form? Sieht aus wie Sie erstellen
portfolio
zweimal, übrigens. Ich würde vermuten, dassself.bars['Close']
ist nur die Auswahl eines einzelnen Elements, möglicherweise durchrow index
im Gegensatz zu einemcolumn
wie Sie vielleicht beabsichtigen. Vielleicht möchten Sie versuchenself.bars.loc[:, 'Close']]
statt. - ok. interessant. es sich von selbst.bars.Schließen.Form gibt (3559 ) aber wenn ich print(bars.head()) es hat alle erwarteten Werte. selbst.Positionen.die Form gibt den gleichen index-Wert mit 1 Spalte wie es sein sollte. (3559, 1)
- Versuchen Sie zu vermehren
self.bars.close
mit allencolumns
imself.positions
? Es ist ein bisschen Rätselraten ohne zu sehen, diedata
.. - Ja, bin ich. selbst.Positionen hat nur eine Spalte (symbol) definieren Sie die Positionen in einer bestimmten Lager-symbol. Ich habe eine kleine Probe des Datenformats, das in der Frage
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie, Ihre Multiplikation entlang der Linien der folgenden:
portfolio['holdings'] = position.symbol.mul(bar.close)
Ausgänge ein dataframe mit dem index übergeben durch, die als Spalten mit symbol am Ende. dh der Form (3559, 3560)axis=0
keyword-Ausrichtung auf index - vorausgesetzt, diese sind kompatibel?cash
: sieht aus wie einfloat
Wert von__init__
aber Sie werden dann versuchen, zu subtrahieren eineSeries
bei der Verwendung.sum(axis=1).cumsum()
. Vielleicht, dass die Linie solltesum(axis=1).sum()
so haben Sie auch eine Zahl gibt es?portfolio['cash']=self.initial_capital-pos_diff.mul(self.bars.Close, axis=0).cumsum()
. Dies scheint das problem gelöst haben.