2017-02-27 100 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