Анализ Монте-Карло Python Нефть и Газ Объемные - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь научить себя Python, и я хотел начать с изучения, как сделать анализ Монте-Карло (я по профессии ученый, который много использует MCA).Я пытаюсь написать программу, которая будет выполнять симуляцию Монте-Карло из 7 переменных, чтобы вычислить диапазон возможных результатов по заданной формуле.

Я Крайне новичок в python.У меня есть опыт работы с VBA, но я все еще изучаю Python.

Все примеры, которые я нахожу в Интернете, связаны с финансами, и, к сожалению, мне трудно каннаблизировать эти коды, поскольку они не очень соответствуют тому, что япытаясь сделать.

Я чувствую, что это должно быть очень простой вещью, так как уравнение довольно простое.Тем не менее, я не могу добиться успеха.Может ли кто-нибудь взглянуть на код, который у меня есть сейчас, и указать мне правильное направление?Если у вас есть нефинансовый пример анализа Монте-Карло, который легко понять новичку, пожалуйста, укажите мне это.Я хочу изучать python, но я нашел лучший способ, которым я учусь, - это смотреть на примеры других людей.

Я пытаюсь добиться списка из 7 переменных, каждая из которых имеет нормальное распределение.Я хотел бы, чтобы python выполнил 10 000 итераций по формуле, приведенной в коде ниже, вытягивая различный набор из 7 различных переменных при каждом вычислении.В конечном итоге я хотел бы напечатать значения P90, P50 и P10 для расчета.В настоящее время меня не волнует просмотр графиков (это будет позже).

Ниже приведен код, который я придумал до сих пор.Опять же, я ищу направление, как это сделать.Я знаю, что мой синтаксис, возможно, испорчен, но я действительно борюсь с этим.Любая помощь будет принята с благодарностью.

from scipy.stats import *
import numpy as np


n = 10000

for i in range(n):
    Area = norm(200,50)
    Thickness = norm(100,25)
    NTG = norm(.85,.2)
    POR = norm(.32,.02)
    GS = norm(.80,.2)
    BG= norm(.0024,.0001)
    Feather = 1
    return ((((Area*Thickness*NTG*POR*GS)/BG)*43560)*Feather)/1000000000


Result = ((((Area*Thickness*NTG*POR*GS)/BG)*43560)*Feather)/1000000000


print ('Result is ', Result, 'ft')

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Я не знаю, чего вы пытаетесь достичь, но могу предложить несколько предложений:

  • Похоже, что нет никакой ковариации между реализациями вашей симуляции, поэтому, чтобы ускорить вычисления и сделать код немного более понятным, вы можете извлечь данные из совместного многомерного нормального распределения.

  • Я ненавижу петли, поэтому векторизация лучше, когда это возможно.

Вот код

import numpy as np
import matplotlib.pyplot as plt

N = 10000
mean_vector = np.array([200, #Area
                        100, #Thickness
                        0.85, #NTG  
                        0.32, #POR
                        0.80, #GS
                        0.0024 #BG
                        ])

covariance = np.diag([50,
                      25,
                      0.2,
                      0.02,
                      0.2,
                      0.0001])

simulated = np.random.multivariate_normal(mean_vector, covariance, size = N)

area, thickness, ntg, por, gs, bg = simulated.T

result= (area*thickness*ntg*por*gs*43560)/bg

Массив result содержит результаты вашего моделирования. Теперь вы можете построить гистограмму или вычислить средние значения, если это необходимо.

0 голосов
/ 11 мая 2018

Есть несколько проблем с вашим кодом, по крайней мере:

  • Вы не можете поместить return вне функции

  • Ваши объекты - это случайные числа генераторы , а не случайные числа; Вы не можете умножить их

Предположительно, вы хотите что-то вроде этого:

n = 10000
Area = norm(200,50).rvs(n)
Thickness = norm(100,25).rvs(n)
NTG = norm(.85,.2).rvs(n)
POR = norm(.32,.02).rvs(n)
GS = norm(.80,.2).rvs(n)
BG= norm(.0024,.0001).rvs(n)
Feather = 1
Results = Area*Thickness*NTG*POR*GS/BG*43560*Feather/1000000000
print(Results)

Выход:

array([  43.88063752,   88.94160248,   46.89368561, ...,   87.32369654,
    210.16899452,   32.21191486])

Затем можно использовать массив Results для статистического анализа, такого как вычисления P10, P50 и P90.

Обратите внимание на отсутствие циклов, которых вы должны стараться избегать в числовом питоне. Это уже создало n результатов.

Должен сказать, я думаю, что сначала вы будете более продуктивно читать учебник по Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...