2017-12-24 2 views
1

Ein Freund mir einen Jupyter Notebook mit dem folgenden Code gesendet:Schleife mit 2 Elementen und einem Reißverschluss

for stock_df, allo in zip((aapl, cisco, ibm, amzn), [.3,.2,.4,.1]): 
    stock_df['Allocation'] = stock_df['NormedReturn']*allo 

verstehe ich die Ausgabe, wie es in jedem Datenrahmen ‚AAPL‘, eine neue Spalte ‚Zuweisung‘ erzeugt " cisco '... und wendet Gewichte auf die Normed Returns an. Allerdings verstehe ich die Syntax nicht genug, dass ich es selbst nochmal machen könnte.

Wie funktioniert das für Schleife auf 2 Elemente und den Reißverschluss bitte? (Ich dachte, dass die Elemente beim Zippen eine ähnliche Länge haben müssten, da sonst die Ausgabedaten abgeschnitten würden).

+0

Blick auf Python Dokument: https://docs.python.org/3.6/library/functions.html#zip –

+0

Es gibt eine schöne Erklärung auf 'zip' [hier] (https://stackoverflow.com/questions/1663807/How-to-iterate-through-two-lists-in-parallel). – deadbug

+0

Die Objekte, die Sie zippen, werden abgeschnitten, aber sie haben die gleiche Länge: '(aapl, cisco, ibm, amzn)' hat Länge 3, also '[.3, .2, .4, .1]'. –

Antwort

1

Dies sieht wie eine Art der Portfolio-Diversifizierung aus. Die aapl, cisco, ibm und amzn sind DataFrames, die mindestens ein NormedReturn-Feld enthalten.

aapl = pd.DataFrame({'NormedReturn':[1,2,3]}) 
cisco = pd.DataFrame({'NormedReturn':[4,5,6]}) 
ibm = pd.DataFrame({'NormedReturn':[7,8,9]}) 
amzn = pd.DataFrame({'NormedReturn':[10,11,12]}) 

Der Datenrahmen als auch könnte einzelne Werte werden enthalten, wie 'NormedReturn': [13], kein Problem.

Zip-Funktion Reißverschlüsse zusammen iterables. Es weist diesen Rückgaben die gegebenen Zuordnungsgewichte zu; 0,3 weigth zum AAPL Lager, 0,2 Gewicht auf die cisco Lager, etc:

for stock_df, allo in zip((aapl, cisco, ibm, amzn), [.3,.2,.4,.1]): 
    print stock_df, allo 

gibt uns die Aktienrenditen und die jeweilige Zuteilung Gewicht:

NormedReturn 
0    1 
1    2 
2    3 0.3 
    NormedReturn 
0    4 
1    5 
2    6 0.2 
    NormedReturn 
0    7 
1    8 
2    9 0.4 
    NormedReturn 
0   10 
1   11 
2   12 0.1 

schließlich die Zuordnung vervielfacht Serie zurückkehren, indem die Zuordnungsgewichte:

for stock_df, allo in zip((aapl, cisco, ibm, amzn), [.3,.2,.4,.1]): 
    stock_df['Allocation'] = stock_df['NormedReturn']*allo 
    print stock_df 

Gibt Ihre Zuordnung, dh Rückkehr * Gewicht Serie:

NormedReturn Allocation 
0    1   0.3 
1    2   0.6 
2    3   0.9 
    NormedReturn Allocation 
0    4   0.8 
1    5   1.0 
2    6   1.2 
    NormedReturn Allocation 
0    7   2.8 
1    8   3.2 
2    9   3.6 
    NormedReturn Allocation 
0   10   1.0 
1   11   1.1 
2   12   1.2 

Ich denke, danach muss dein Freund alle der NormedReturns und Allocations zusammen, die wie Ihr endgültiges Portfolio zurückgibt.

+0

Danke Fatih, wirklich gründliche und nützliche Antwort !!! :) – choubix

+0

Sie sind herzlich willkommen, @choubix! Bitte zögern Sie meine oder Joes Antwort als die akzeptierte Antwort zu markieren. Fröhliche Weihnachten! – FatihAkici

2

Das Schlüsselwort der Python-Syntax ist hier die zip()-Funktion.

Aus der Dokumentation, können wir sehen, dass dies:

Gibt einen Iterator von tuples, wo das i-th Tupel enthält das i-th Element aus jeder der Argument-Sequenzen oder iterables.

Also es ist bestanden iterables und 'zips' sie zusammen. Dies kann einfacher sein, mit einem Beispiel zu sehen:

>>> a = [1, 2, 3, 4] 
>>> b = [9, 8, 7, 6] 
>>> list(zip(a, b)) 
[(1, 9), (2, 8), (3, 7), (4, 6)] 

in Ihrem Code So, dies wird neben einem Verfahren namens ‚Tupel auspacken‘ verwendet, die wie etwas zu tun ist:

>>> i, j = 5, 6 
>>> i 
5 
>>> j 
6 

Dies ermöglicht sauberen Code, der über die Tupel iteriert, die von zip() zurückgegeben werden.Wenn Sie noch unsicher sind, was die Schleife macht, könnten wir ändern es die Variablen print (der Einfachheit halber ich konvertiert auch die Variablen in zip zu Strings übergeben):

for stock_df, allo in zip(('aapl', 'cisco', 'ibm', 'amzn'), [.3,.2,.4,.1]): 
    print(stock_df, allo) 

, die Sie aus der Ausgabe sehen gibt was wir erwartet hatten:

aapl 0.3 
cisco 0.2 
ibm 0.4 
amzn 0.1 

ich hoffe, dass Sie den Code aufräumt, so scheint es aus, wie Sie die Frage gestellt, die Sie bereits wissen, wie diese Variablen tatsächlich mit in der Schleife werde ich so behandelt wird nicht gehen in das hinein.

+0

Danke Joe! Klarer jetzt :) – choubix

+0

@choubix bitte akzeptieren (grau -> grüner Pfeil neben Antwort) danke :) –

Verwandte Themen