【问题标题】:Monte carlo simulation in python - problem with loopingpython中的蒙特卡罗模拟 - 循环问题
【发布时间】:2019-08-23 21:33:08
【问题描述】:

我正在为 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)

【问题讨论】:

    标签: python pandas montecarlo


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      也许 PANDAS 最重要的特性是对矢量化的内置支持:您可以处理整列数据,而不是循环遍历数据框。像列表推导式一样思考,最后不需要 for row in df 迭代。

      【讨论】:

      • 感谢您的 cmets 和投入。
      猜你喜欢
      • 2013-01-02
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 2012-04-26
      • 2015-02-10
      相关资源
      最近更新 更多