2017-12-31 123 views
1

, also stolpere ich über dieses Problem und kann stundenlang keine Lösung finden. Grundsätzlich habe ich die folgende zwei Liste, die ich in meine endgültige Lösung transformieren möchte: Ein Datenrahmen, der Daten als den Index und jedes Instrument als eine Spalte mit den jeweiligen Werten in dieser Spalte hat.Mache Listenwerte für Spalten in DataDrama

In meiner ersten Liste habe ich die folgende Struktur:

[ Instrument     Date 
0  IWVL.L 2017-12-29T00:00:00Z 
1  IWVL.L 2017-12-28T00:00:00Z 
2  IWVL.L 2017-12-27T00:00:00Z 
3  IWVL.L 2017-12-22T00:00:00Z 
4  IWVL.L 2017-12-21T00:00:00Z 
5  IWVL.L 2017-12-20T00:00:00Z, Instrument     Date 
0  IWMO.L 2017-12-29T00:00:00Z 
1  IWMO.L 2017-12-28T00:00:00Z 
2  IWMO.L 2017-12-27T00:00:00Z 
3  IWMO.L 2017-12-22T00:00:00Z 
4  IWMO.L 2017-12-21T00:00:00Z 
5  IWMO.L 2017-12-20T00:00:00Z, 

und so weiter (insgesamt 100 Einträge).

Meine zweite Liste hat die folgende Struktur:

[ Instrument Total Return 
0  IWVL.L  0.405743 
1  IWVL.L  -0.031201 
2  IWVL.L  0.046824 
3  IWVL.L  -0.140274 
4  IWVL.L  0.375469 
5  IWVL.L  0.156691, Instrument Total Return 
0  IWMO.L  0.294196 
1  IWMO.L  0.080300 
2  IWMO.L  -0.080235 
3  IWMO.L  -0.213504 
4  IWMO.L  0.321285 
5  IWMO.L  -0.120337, 

Jetzt möchte ich eine Struktur, die Daten als Index und die Instruments als separate Spalten (Erste Säule setzt: IWVL.K, Zweite Säule: IWMO.L usw.). Die Werte von Total Return werden dann für das spezifische Datum im Kollum aufgeführt. Es sieht aus wie dieses (Snippet für ersten beiden Instrumente):

   IWVL.L IWMO.L ... 
Date       
2017-12-29 0.405743 0.294196 ...  
2017-12-28 -0.031201 0.080300 ...  
2017-12-27 0.046824 -0.080235 ...  

froh wäre, wenn jemand hier helfen kann.

Oh und guten Silvester!

+0

Bitte zeigen Sie Ihre erwartete Ausgabe? –

+0

Hey Coldspeed - Ich habe den ursprünglichen Post bearbeitet - Schau mal –

+0

Wo ist 'IWMO.K'? –

Antwort

1

Wenn zwei Listen sind l1 und l2, und wenn die Elemente 1-1 entspricht, dann Ihre Lösung vereinfachen, indem concat und einen nachfolgenden pivot Betrieb.

i = pd.concat(l1, ignore_index=True) 
j = pd.concat(l2, ignore_index=True) 
df = pd.concat([i, j[['Total Return']]], axis=1)\ 
     .pivot('Date', 'Instrument', 'Total Return') 
df 

Instrument    IWMO.L IWVL.L 
Date          
2017-12-20T00:00:00Z -0.120337 0.156691 
2017-12-21T00:00:00Z 0.321285 0.375469 
2017-12-22T00:00:00Z -0.213504 -0.140274 
2017-12-27T00:00:00Z -0.080235 0.046824 
2017-12-28T00:00:00Z 0.080300 -0.031201 
2017-12-29T00:00:00Z 0.294196 0.405743 

Einzelheiten

Zuerst verketten wir jeden Datenrahmen in jeder Liste -

i = pd.concat(l1, ignore_index=True) 
i.head() 

    Instrument     Date 
0  IWVL.L 2017-12-29T00:00:00Z 
1  IWVL.L 2017-12-28T00:00:00Z 
2  IWVL.L 2017-12-27T00:00:00Z 
3  IWVL.L 2017-12-22T00:00:00Z 
4  IWVL.L 2017-12-21T00:00:00Z 

j = pd.concat(l2, ignore_index=True) 
j.head() 

    Instrument Total Return 
0  IWVL.L  0.405743 
1  IWVL.L  -0.031201 
2  IWVL.L  0.046824 
3  IWVL.L  -0.140274 
4  IWVL.L  0.375469 

Jetzt, da jeder Eintrag direkt entspricht, kombinieren Sie sie einfach durch Verbinden horizontal. Wir wollen nur die 'Total Return' Spalte von der zweiten, so schneiden dementsprechend eine Datenrahmen Säule aus -

k = j[['Total Return']] 
k.head() 

    Total Return 
0  0.405743 
1  -0.031201 
2  0.046824 
3  -0.140274 
4  0.375469 

Kombinieren k mit i -

v = pd.concat([i, k], axis=1) 

    Instrument     Date Total Return 
0  IWVL.L 2017-12-29T00:00:00Z  0.405743 
1  IWVL.L 2017-12-28T00:00:00Z  -0.031201 
2  IWVL.L 2017-12-27T00:00:00Z  0.046824 
3  IWVL.L 2017-12-22T00:00:00Z  -0.140274 
4  IWVL.L 2017-12-21T00:00:00Z  0.375469 
5  IWVL.L 2017-12-20T00:00:00Z  0.156691 
6  IWMO.L 2017-12-29T00:00:00Z  0.294196 
7  IWMO.L 2017-12-28T00:00:00Z  0.080300 
8  IWMO.L 2017-12-27T00:00:00Z  -0.080235 
9  IWMO.L 2017-12-22T00:00:00Z  -0.213504 
10  IWMO.L 2017-12-21T00:00:00Z  0.321285 
11  IWMO.L 2017-12-20T00:00:00Z  -0.120337 

nun der letzte Schritt der „Pivot“ Betrieb ist. Woher wissen wir, dass es sich dreht? Das ist nur ein fantastischer Name für die Neugestaltung Ihrer Daten. Sie möchten, dass eine Spalte zum Index im Ergebnis wird, eine weitere Spalte wird zu den Spalten im Ergebnis und die letzte Spalte wird zu den Werten. Dies ist die Beschreibung einer Pivotisierung (und ähnelt sehr dem SQL-Pivot-Idiom).

v.pivot(index='Date', columns='Instrument', values='Total Return') 

Instrument    IWMO.L IWVL.L 
Date          
2017-12-20T00:00:00Z -0.120337 0.156691 
2017-12-21T00:00:00Z 0.321285 0.375469 
2017-12-22T00:00:00Z -0.213504 -0.140274 
2017-12-27T00:00:00Z -0.080235 0.046824 
2017-12-28T00:00:00Z 0.080300 -0.031201 
2017-12-29T00:00:00Z 0.294196 0.405743 

Weitere Informationen finden Sie hier - How to pivot a dataframe.

+0

klappt wunderbar danke !!! –

+0

Seit im neu zu Python können Sie kurz erklären, was das \ .pivot ('Date', 'Instrument', 'Total Return') genau tut? –

+0

@ArthurVott Eine Erklärung hinzugefügt. Ich hoffe es hilft! –

Verwandte Themen