2014-09-09 3 views
-1

작은 코드를 파이썬으로 작성했으며 올바르게 작동합니다.데이터 프레임 반복 및 최적화를위한 함수 작성

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]) 

로서 초기 값을 포함하지만 모든 하드 코딩된다. 런타임에 양식을 만들고 싶습니다.

즉 I는 CSV 파일을, I는 CSV 파일의 dataframe 구조로 그것을 읽어는

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

당신과 같이 pow(exponent)를 사용하여 DataFrame의 열을 올릴 수 있습니다 :

>>> 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 

을 또는 당신은 다음과 같이 sum()를 사용하여 하나 개의 컬럼의 요소를 요약 할 수 df['bar'] ** 2this SO answer

같이 그냥 할 수있는 :

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

시작하기에 충분합니다.

"" ""

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

"" "DV의 일부를"

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

"" "가 dataframe에 입력 파일을 읽기"

0

나는 그것을 밖으로 작동 할 수 있었다
dv= df['DV'] 

"" "목표 기능" "" "" "전력 부가 기능" "" ""기호 = 1.0이 광고되었습니다. ("" "" "bnds의 ="를

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)) 

를 "경계를 정의하는" "" 는 ""의 "계수 행렬을 대응하는 전원이"

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

"" "사용되어"극대화 DED ([ 'LB'] df라고. 값 [ 'UB']. 값 DF)) "" "

" "" ""제약 조건을 정의하는 "

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'])) 

과 같으므로 파일에 지정된만큼의 쌍이 있습니다.

관련 문제