Function 在数据帧中循环并创建用于优化的函数
我用python编写了一个小代码,效果很好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
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']))