Python中的蒙特卡洛模拟-循环问题

时间:2019-08-23 21:33:08

标签: python pandas montecarlo

我正在为MC运行一个简单的python脚本。基本上,它会读取数据帧中的每一行,并选择两个变量的最大值和最小值。然后,如果模拟运行1000次,则在最小值和最大值之间选择一个随机值,然后计算乘积并将P50值写回到数据表中。

无论如何,所有行的P50输出都是相同的。对我要去哪里哪里有帮助吗?

import pandas as pd
import random
import numpy as np

data = [[0.075,0.085, 120, 150], [0.055, 0.075, 150, 350],[0.045,0.055,175,400]]
df = pd.DataFrame(data, columns = ['P_min','P_max','H_min','H_max'])
NumSim = 1000

for index, row in df.iterrows():
    outdata = np.zeros(shape=(NumSim,), dtype=float)
    for k in range(NumSim):
        phi = (row['P_min'] + (row['P_max'] - row['P_min']) * random.uniform(0, 1))
        ht = (row['H_min'] + (row['H_max'] - row['H_min']) * random.uniform(0, 1))
        outdata[k] = phi*ht
    df['out_p50'] = np.percentile(outdata,50)

print(df)

2 个答案:

答案 0 :(得分:1)

通过df['out_p50'] = np.percentile(outdata,50)表示您希望将整个列设置为给定值,而不是该列的特定行。因此,将生成并保存编号,但它们会保存到整列中,最后,您会在每行中看到最后生成的编号。

请使用df.loc[index, 'out_p50'] = np.percentile(outdata,50)指定要设置的特定行。

答案 1 :(得分:0)

是的-您正在将标量值写入整个列。您在每次迭代时都覆盖该值。如果需要,您可以简单地用df.loc指定行以进行快速修复。还可以考虑使用outdata.median而不是percentile

也许PANDAS的最重要功能是对矢量化的内置支持:您可以处理整个数据列,而不是遍历数据帧。就像列表理解一样,不需要在最后进行for row in df迭代。