2017-02-27 3 views
0

私はモンテカルロモデルを構築しており、毎月捕獲する新しいアイテムの数を月単位でモデル化する必要があります。毎月既知の平均値と標準偏差を持つアイテムをランダムに追加します。パンダのデータフレーム千鳥0の

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 

ルールは2017から03に追加1つの項目、= 1ので、全ての期間があったことです最初のレコードのために。次の5項目が2017-04に追加されたので、前のすべての期間は0になります。最後の4項目は2017-05に追加されたため、先月の1件のみです。これは何千回も実行されるモンテカルロシミュレーションになるので、手動で列/行を処理することはできません。どのように処理するかについてのベクトル化された提案ですか?

答えて

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