Могу ли я передать значения из одного файла Python в другой? - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь запустить один файл из другого в цикле.FileA:

cov_matrix - ковариационная матрица, которую я импортирую из Bloomberg, а rets - это фрейм данных, также импортированный из Bloomberg.

max_vol = [8,9,10]

def func1(weights):
    return max_vol[i] - np.sqrt(np.dot(cov_matrix, weights))

def obj(weights):
    return np.sum(rets.T*weights)

cons = {'type':'ineq', 'fun': func1}
bnds = (0,6) in range 30

def minimixe()
    scipy.minimize(obj, initial_weights, bounds = bnds, method = 'SLSQP', constraints = cons}

Я хочу запустить функцию минимизации для нескольких значений max_vol.

Я попытался запустить всю программу в цикле for, но я получаю одинаковые результаты даже для разных значений max_vol.Поэтому я попытался вызвать весь файл A из другого файла B.

import fileA
    for i in range(8,10):
    fileA.minimize()

, но я получаю ошибку, что я не определен.

Я попытался передать i напрямую, чтобы свести к минимуму, но получил индекс спискаошибки диапазона для func1

def func1(weights):
    return max_vol[i] - np.sqrt(np.dot(cov_matrix, weights))

cons = {'type':'ineq', 'fun': func1}
bnds = (0,6) in range 30

def minimixe()
    scipy.minimize(obj, initial_weights, bounds = bnds, method = 'SLSQP', constraints = cons}

for i in range(8,10)
    minimize(i)    

Как я могу подойти к этому?

1 Ответ

1 голос
/ 18 июня 2019

Причина в том, что scipy.minimize вызывает func1 с аргументами по умолчанию, вы можете использовать functools.partial, чтобы добавить i в качестве позиционного аргумента и по-прежнему передавать его scipy.minimize:

from functools import partial

# add that argument here so you don't get a nameError
def func1(i, weights):
    return max_vol[i] - np.sqrt(np.dot(cov_matrix, weights))

# add the argument here so that you can call it in fileB
def minimize(i):
    # partial will return a new function with the first positional argument
    # specified already
    cons = {'type':'ineq', 'fun': partial(func1, i)}
    # now this can work as expected
    scipy.minimize(obj, initial_weights, bounds = bnds, method = 'SLSQP', constraints = cons}

Это позволяет передавать i в качестве первого позиционного аргумента func1, без необходимости scipy делать это явно. Теперь вы можете назвать это как:

import fileA

for i in range(8, 10):
    fileA.minimize(i)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...