2017-02-27 1 views
0

Ich baue ein Monte-Carlo-Modell und muss modellieren, wie viele neue Objekte ich jeden Monat für eine bestimmte Anzahl von Monaten erstelle. Jeden Monat füge ich eine zufällige Anzahl von Elementen mit einem bekannten Mittelwert und stdev hinzu.Pandas Dataframe von gestaffelten Nullen

months = ['2017-03','2017-04','2017-05'] 
new = np.random.normal(4,3,size = len(months)).round() 
print new 

[ 1. 5. 4.] 

df_new = pd.DataFrame(zip(months,new),columns = ['Period','newPats']) 
print df_new 

    Period newPats 
0 2017-03  1.0 
1 2017-04  5.0 
2 2017-05  4.0 

Ich muss das in einem Element x Monat Datenrahmen zu transformieren, wobei der Wert eine Null bis zum Monat ist, dass der gegebene Punkt beginnt.

Hier ist die Form, die ich habe:

df_full = pd.DataFrame(np.ones((new.sum(), len(months))),columns = months) 

    2017-03 2017-04 2017-05 
0  1.0  1.0  1.0 
1  1.0  1.0  1.0 
2  1.0  1.0  1.0 
3  1.0  1.0  1.0 
4  1.0  1.0  1.0 
5  1.0  1.0  1.0 
6  1.0  1.0  1.0 
7  1.0  1.0  1.0 
8  1.0  1.0  1.0 
9  1.0  1.0  1.0 

und hier ist der Ausgang Ich brauche:

#perform transformation 
print df_out 

    2017-03 2017-04 2017-05 
0  1  1  1 
1  0  1  1 
2  0  1  1 
3  0  1  1 
4  0  1  1 
5  0  1  1 
6  0  0  1 
7  0  0  1 
8  0  0  1 
9  0  0  1 

Die Regel ist, dass es ein Element in 2017-03, so dass alle Perioden = 1 hinzugefügt wurde für die erste Aufzeichnung. Die nächsten 5 Elemente wurden in 2017-04 hinzugefügt, also alle vorherigen Perioden = 0. Die letzten 4 Elemente wurden 2017-05 hinzugefügt, also sind sie nur = 1 im letzten Monat. Dies geht in eine Monte-Carlo-Simulation, die tausende Male ausgeführt wird, sodass ich nicht manuell über die Spalten/Zeilen iterieren kann - irgendwelche vektorisierten Vorschläge für die Handhabung?

Antwort

0

Schlagen Sie alle dazu.

df_out = pd.DataFrame([new[:x+1].sum() * [1] + (new.sum() - new[:x+1].sum()) * [0] for x in range(len(months))]).transpose() 
df_out.columns = months 

print df_out 



2017-03 2017-04 2017-05 
0  1  1  1 
1  0  1  1 
2  0  1  1 
3  0  1  1 
4  0  1  1 
5  0  1  1 
6  0  0  1 
7  0  0  1 
8  0  0  1 
9  0  0  1