我正在构建一个蒙特卡洛模型,并且需要模拟我每个月捕获的新项目数量。每个月我都会添加一个具有已知均值和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
规则是在2017-03中添加了1个项目,因此第一个记录的所有期间= 1。接下来的5个项目在2017-04中添加,因此所有之前的期间= 0.最后4个项目在2017-05中添加,因此它们在上个月仅为= 1。这将进入一个蒙特卡罗模拟,它将运行数千次,所以我无法手动迭代列/行 - 任何有关如何处理的矢量化建议?
答案 0 :(得分: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