2014-09-09 3 views
-1

Я написал небольшой код в python, и он отлично работает.Цитирование через фрейм данных и создание функции для оптимизации

import numpy as np 
import pandas as pd 
from scipy.optimize import minimize 



"""define power and coefficients""" 

power = 0.6 
coefficient = 5.6 

"""define objective function""" 

def func(x,sign=1.0): 
    return sign*sum(coefficient*(x[0:]**power)) 

""" define constraints""" 

cons = ({'type': 'ineq', 'fun': lambda x: x[1] - 2 * x[1] + 2}, 
    {'type': 'ineq', 'fun': lambda x: -x[2] - 2 * x[1] + 6}, 
    {'type': 'ineq', 'fun': lambda x: -x[0] + 2 * x[1] + 2}) 

""" define bounds""" 

bnds = ((0.7, 1.3), (0.7, 1.3), (0.7,1.3)) 

"""initial values of the variables""" 

x0 = np.array([1.1, 3.9,5.6]) 

"""run the optimization algorithm""" 

res = minimize(func, x0, method='SLSQP',bounds = bnds,constraints=cons, 
      options={'disp': True}) 

"""print the results""" 

print(res.x) 

Этот код содержит целевую функцию

def func(x,sign=1.0): 
    return sign*sum(coefficient*(x[0:]**power)) 

и начальные значения, как

x0 = np.array([1.1, 3.9,5.6]) 

Но это все жестко. Я хочу сформировать их во время выполнения.

т.е. у меня есть файл CSV, я прочитал, что в dataframe Структура CSV файла

DV_Name Investment 
DV1  1.2 
DV2  1.2 
DV3  1.3 
DV4  1.2 
DV5  1.2 
DV6  4.5 
DV7  1.2 
DV8  2.7 
DV9  1.2 
DV10 1.2 

Я использовал pd.DataFrame.from_csv.

Что мне нужно сделать, чтобы моя целевая функция была в форме coeff*(DV1^power + DV2^power + DV3^power ......DV10^power) И мой массив начальных значений x0 как значения инвестиций, то есть инвестиций (0), инвестиций (1) ... и так далее.

ответ

0

Вы можете поднять колонку вашего DataFrame используя pow(exponent) как так:

>>> import pandas as pd 
>>> df = pd.DataFrame({'foo':[1,2,3,4], 'bar':[5,6,7,8]}) 
>>> df['foo'].pow(2) # raise all elements of the column 'foo' to the power 2 
0  1 
1  4 
2  9 
3 16 
Name: foo, dtype: int64 

Или вы можете просто сделать df['bar'] ** 2 как в this SO answer

Вы можете суммировать элементы одного столбца, используя sum(), как это :

>>> df['foo'].pow(2).sum() 
30 

Этого должно быть достаточно, чтобы вы начали!

0

Я был в состоянии работать это:

import pandas as pd 
import numpy as np 
from scipy.optimize import minimize 
pd.set_option('display.mpl_style', 'default') 

"" "Чтение входного файла в dataframe" ""

df = pd.DataFrame.from_csv('C:\Users\prashant.mudgal\Downloads\Test.csv') 

"" "подмножество DV" ""

dv= df['DV'] 

"" "Цель fucntion """ "" "Power-аддитивная функция" "" "" "знак = 1,0 было объявление Ded для максимизации "" " """ соответствующих матриц для коэффициента, мощности могут использовать "" "

def func(dv,sign=1.0) : 
return sign*(sum(df['Coefficient'].values[0:]*dv[0:]**df['Power'].values[0:])) 

""" определяют границы "" "

bnds = ((0.7, 1.3),(0.7, 1.3),(0.7,1.3),(0.7,1.3),(0.7,1.3),(0.7,1.3),(0.7,1.3), (0.7,1.3),(0.7,1.3)) 

""" bnds = ((DF [ 'LB']. значений, DF [ ''] UB. значения)) "" "

""" определить ограничения "" "

cons = ({'type': 'ineq', 'fun': lambda x: dv[1] - 2 * dv[1] + 2}, 
    {'type': 'ineq', 'fun': lambda x: -dv[2] - 2 * dv[1] + 6}, 
    {'type': 'ineq', 'fun': lambda x: -dv[0] + 2 * dv[1] + 2}) 

""" запустить optimiza с использованием суммы метода наименьших квадратов "" " " "" s.Значения являются начальными оценочными значениями, которые предоставляются инвестиционный столбцом в файле CSV «»»

res = minimize(func, df['Inv'].values,args=(-1.0,),method='SLSQP',bounds=bnds, 
      options={'disp': True}) 

„“„Печать результатов“„“

print (res) 

Но у меня есть новая проблема в границы, которые я создал, они жестко закодированы, и я не хочу этого. Я хочу, чтобы быть считаны из dataframe или файла Мой файл 2 колонки

upperbound Lowerbound 
1.3    0.7 
1.3    0.7 
1.3    0.7......... 

теперь я хочу, чтобы сформировать свою Боун ds после прочтения некоторого информационного кадра примерно

bnds = ((df['Upperbound'],df['lowerbound'])) 

поэтому будет столько пар, как указано в файле.

Смежные вопросы