Function 在数据帧中循环并创建用于优化的函数

Function 在数据帧中循环并创建用于优化的函数,function,optimization,pandas,Function,Optimization,Pandas,我用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(coeffic

我用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])
但这一切都是硬编码的。我想在运行时生成它们

i、 我有一个csv文件,我会把它读入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\u csv


我必须做些什么才能使我的目标函数以
coeff*(DV1^power+DV2^power+DV3^power……DV10^power)
的形式出现,并将我的初始值数组x0作为投资值,即投资(0)、投资(1)…等等。

您可以使用以下类似的方法提高
数据框的一列

或者您可以像中一样执行
df['bar']**2

然后,您可以使用以下公式对一列的元素求和:

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

这应该足够让你开始了

我能够解决这个问题:

import pandas as pd
import numpy as np
from scipy.optimize import minimize
pd.set_option('display.mpl_style', 'default') 
“”“将输入文件读入数据帧”“”

“”“DV的子集”“”

“目标功能” “幂加法函数” “”“已为最大化添加了符号=1.0”“” “”“使用系数、幂的对应矩阵”“”

“定义边界”

“”“bnds=((df['LB'].values,df['UB'].values))”

“”“定义约束”“”

“”“使用最小二乘和法运行优化”“” “”“s.values是csv文件中“投资”列给出的初始估计值”“”

“”“打印结果”“”

但是我有一个新的问题,我已经创建了一个边界,它们是硬编码的,我不希望这样。我希望从数据帧或文件中读取它们 我的文件有两列

upperbound  Lowerbound
1.3               0.7
1.3               0.7
1.3               0.7.........
现在,我想在阅读一些数据帧之后形成我的边界,比如

bnds = ((df['Upperbound'],df['lowerbound']))
因此,将有文件中指定的多个对

dv= df['DV']
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))
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})
res = minimize(func, df['Inv'].values,args=(-1.0,),method='SLSQP',bounds=bnds,
           options={'disp': True})
print (res)
upperbound  Lowerbound
1.3               0.7
1.3               0.7
1.3               0.7.........
bnds = ((df['Upperbound'],df['lowerbound']))