2017-07-14 2 views
1

Ich versuche MatLab-Code in Python zu reproduzieren und stolpere mit einer MatLab-Matrix. Der Block von Code in Matlab ist unten:Numpy Array, Daten müssen 1-dimensional sein

for i = 1:Np 
    y = returns(:,i); 
    sgn = modified_sign(y); 
    X = [ones(Tp,1) sgn.*log(prices(:,i).*volumes(:,i))]; 

ich eine harte Zeit habe die Schaffung ‚X‘, ohne dass die „Daten bekommen Muss 1 Maßfehler seine Unten ist eine meiner Versuche, viele versucht, dies zu reproduzieren. Codeabschnitt:

lam = np.empty([Tp,Np]) * np.nan 
for i in range(0,Np): 
    y=returns.iloc[:,i] 
    sgn = modified_sign(y) 
    #X = np.array([[np.ones([Tp,1]),np.multiply(np.multiply(sgn,np.log(prices.iloc[:,i])),volumes.iloc[:,i])]]) 
    X = np.concatenate([np.ones([Tp,1]),np.column_stack(np.array([sgn*np.log(prices.iloc[:,i])*volumes[:,i]]))],axis=1) 

Tp und Np sind die Länge und die Breite der Preise Serie

crsp['PRC'].to_frame().shape = (9455,1) 
Tp, Np = crsp['PRC'].to_frame().shape 

Tr und Nr sind die Länge und die Breite der Renditen Serie

crsp['RET'].to_frame().shape = (9455,1) 
Tr, Nr = crsp['RET'].to_frame().shape 

Tv und Nv sind die Länge und die Breite der Volumenreihe

crsp['VOL'].to_frame().shape = (9455,1) 
Tv, Nv = crsp['VOL'].to_frame().shape 

Die Einer Array:

np.ones([Tp,1]) 

wäre (9455,1)

Probenvolumen Daten :

DATE VOLAVG 
1979-12-04 8880.9912591051 
1979-12-05 8867.545284586622 
1979-12-06 8872.264687564875 
1979-12-07 8876.922134551494 
1979-12-10 8688.765365448506 
1979-12-11 8695.279567657451 
1979-12-12 8688.865033222592 
1979-12-13 8684.095435684647 
1979-12-14 8684.534550736667 
1979-12-17 8879.694444444445 

Beispiel Preisdaten

DATE AVGPRC 
1979-12-04 25.723484200567693 
1979-12-05 25.839463450495863 
1979-12-06 26.001899852224145 
1979-12-07 25.917628864251874 
1979-12-10 26.501898917349788 
1979-12-11 26.448652367425804 
1979-12-12 26.475906537182407 
1979-12-13 26.519610746585908 
1979-12-14 26.788873713159944 
1979-12-17 26.38583047822484 

Sample Return Daten

DATE RET 
1979-12-04 0.008092780873338423 
1979-12-05 0.004498557619416754 
1979-12-06 0.006266692192175238 
1979-12-07 -0.0032462182943131523 
1979-12-10 0.022292999386413825 
1979-12-11 -0.002011180868938034 
1979-12-12 0.001029925340138238 
1979-12-13 0.0016493553247958206 
1979-12-14 0.010102153877941776 
1979-12-17 -0.015159499602784175 

Was ich letztlich zu erreichen versuchen, ist ein (9455,2) Array, in dem X.iloc [: 0] = 1 und X.iloc [:, 2] = log (Preis) * Volumen für jede Zeile.

Ich referenzierte das MatLab zu Numpy-Dokument online (https://docs.scipy.org/doc/numpy-dev/user/numpy-for-matlab-users.html) und prüfte verschiedene andere StackOverflow-Posts vergeblich.

Für Kontext ist Modified_sign eine externe Funktion, Preise ist ein DataFrame-Segment, wie es zurückgegeben wird. Np ist die Breite (Think df.shape [1]) des Preises DataFrame und Tp ist df.shape [0]. Dies erzeugt im Wesentlichen eine Spalte von 1s und log (Preis) * Volumen, die in einer Regression für jede Serie von Renditen verwendet werden, wobei jedes df (TxN) ist, wobei T Daten und N Wertpapiere sind. Jede Anleitung, die Sie zur Verfügung stellen können, wäre sehr willkommen.

+2

Da einige Variablen/Funktionen fehlen und wir das Problem nicht reproduzieren können, können Sie die Formen der Argumente vor dem Aufruf an np.concatenate ausgeben? – npit

+3

Noch besser: Fügen Sie einige "Spielzeug" -Daten hinzu, um Ihren Python-Code in ein [mcve] umzuwandeln. –

+0

Spielzeugdaten wie angefordert hinzugefügt –

Antwort

1

Das Problem ist, dass numpy 1D-Array (Vektoren) haben kann, während MATLAB nicht kann. Wenn Sie also das Array np.ones([Tp,1]) erstellen, erstellt es ein 2D-Array, in dem eine Dimension eine Größe von 1 hat. In MATLAB wird dies als "Vektor" betrachtet, in Numpy jedoch nicht.

Also, was Sie tun müssen, geben np.ones einen einzigen Wert. Dies führt zu einem Vektor (anders als in MATLAB, wo es zu einer 2D-Quadratmatrix führt). Dieselbe Regel gilt für np.zeros und jede andere Funktion, die Dimensionen als Eingaben verwendet.

dies sollte also funktionieren:

X = np.column_stack([np.ones(Tp), sgn*np.log(prices.iloc[:,1])*volumes.iloc[:,1]]) 

Davon abgesehen, werden Sie die meisten der Vorteil der Verwendung von Pandas zu verlieren, indem es auf diese Weise zu tun.Es wäre viel besser, die DataFrames zu einem zu kombinieren, indem Sie die Daten als Indizes verwenden und dann eine neue Spalte mit der Berechnung erstellen. Unter der Annahme, die Daten des Indizes sind, so etwas wie dies funktionieren soll (wenn die Daten Indizes set_index verwenden sind, um ihnen Indizes zu machen):

data = pd.concat([returns, prices, volumes], axis=1) 
data['sign'] = modified_sign(data['ret') 
data['X0'] = 1 
data['X1'] = data['sign']*np.log(data['AVGPRC'])*data['VOLAVG'] 

Natürlich würden Sie X0 und X1 mit informativen Namen ersetzen, und ich bin nicht Sicher, Sie brauchen sogar X0 mit diesem Ansatz, aber das würde Ihnen eine viel leichter zu arbeiten mit Datenstruktur.

Auch, wenn Ihre Daten Strings sind, sollten Sie sie in Pandas Daten konvertieren. Sie sind viel schöner zu arbeiten als Streicher.