2017-02-27 148 views
0

我正在建立一個蒙特卡羅模型,並且需要模擬每個月在一個給定的月份內我捕獲多少個新項目。每個月我都會添加一個隨機數量的已知平均值和stdev的項目。大熊貓交錯零的數據幀

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 

我需要將其轉換爲一個項目x月的數據框,其中值是一個零,直到給定的項目開始的月份。

這裏的形狀,我有:

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 

和這裏的輸出我需要:

#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 

的規則是,有1個項目在2017-03增加,因此,所有時段= 1爲第一個記錄。接下來的5個項目是在2017-04年添加的,因此之前的所有期間都爲0.最後的4個項目是在2017-05年新增的,所以它們在上個月只有1個。這將進入monte carlo模擬,將運行數千次,所以我不能手動迭代列/行 - 任何向量化的建議如何處理?

回答

0

打敗你一切吧。

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