2017-12-26 17 views
0

Ich habe folgenden Datenrahmen:Kombinieren Reihe Iteration mit paarweise Multiplikation

   in_scenario_USA USA index_in 
month year        
4  1960    NaN   0 
5  1960    NaN   0 
6  1960   0.000000   1.0 
7  1960   0.000000   1.0 
8  1960   0.000000   1.0 
9  1960   0.000000   1.0 
10 1960   0.000000   1.0 
11 1960   0.000000   1.0 
12 1960   0.000000   1.0 
1  1961   0.000000   1.0 
2  1961   0.025536   1.0 
3  1961   0.003843   1.0 
4  1961   0.019139   1.0 
5  1961   0.000000   1.0 

Die erste Spalte ist die prozentuale Rendite von einem Monat. Basierend auf meinen Szenarien ist es entweder 0 oder eine Zahl. Ich würde meine zweite Spalte wie seinen ersten nicht Null-Wert zu haben, auf 1 zu bleiben und dann jedem nachfolgenden Wert kann mit der folgenden Formel erläutert:

USA index_in[i] = USA index_in[i-1] * (1 + in_scenario_USA)[i] 

so am Ende ist es so aussehen würde:

   in_scenario_USA USA index_in 
month year        
4  1960    NaN   0 
5  1960    NaN   0 
6  1960   0.000000   1.0 
7  1960   0.000000   1.0 
8  1960   0.000000   1.0 
9  1960   0.500000   1.5 
10 1960   0.500000   2.25 
11 1960   0.000000   2.25 
12 1960   0.000000   2.25 
1  1961   0.000000   2.25 
2  1961   -0.200000   1.8 
3  1961   0.100000   1.98 
4  1961   0.100000   2.178 
5  1961   0.000000   2.178 

Ich habe viele Loops ausprobiert, aber die, die ich am nächsten fühle, um genau zu sein, ist diese, aber ich bekomme am Ende nur NaN-Werte.

for i in range(0, len(df_merged[col + ' index_in'])): 
    if df_merged[col + ' index_in'].iloc[i] == 1 and (df_merged[col + ' index_in'].iloc[-i] == 0): 
     continue 
    else: 
     df_merged[col + ' index_in'].iloc[i] = np.multiply(df_merged[col + ' index_in'].iloc[i-1], df_merged['in_scenario_' + col].iloc[i]) 

Danke für Ihre Hilfe.

Antwort

2

Ich denke, Ihr Problem ist die NaN Werte in Ihren ersten paar Zeilen, die durch multipliziert werden und führen zu NaN-Werte hinzufügen. Versuchen Sie folgendes:

newcol = [] 
firstnonnan = True 
for index, row in df.iterrows(): 
    if row['in_scenario_USA'].isnull(): 
     newcol.append(row['USA_index_in']) 
    elif firstnonnan = True: 
     newcol.append(1) 
     firstnonnan = False 
    else: 
     newcol.append(newcol[-1]*(1+row['in_scenario_USA'])) 
df['USA index_in'] = newcol 

Im Grunde, Sie gehen durch den Datenrahmen zu durchlaufen und eine Liste erstellen Sie Ihre Spalte mit zu überschreiben. Wenn Sie einen NaN Wert haben, nehmen Sie den gleichen Wert, der bereits in dieser Spalte ist. Wenn Sie das erste Mal eine Nicht-NaN sehen, fügen Sie Ihrer Liste eine 1 hinzu. Danach verwenden Sie das letzte Element in der Liste als Ihren vorherigen Wert.

+0

funktioniert wie ein Charme. Ich danke dir sehr! –