使用两个变量优化 cumprod()
Optimize for cumprod() with two variables
我正在尝试优化一个包含两个变量的函数。问题是我的函数有一个 pandas 数据帧 'df_main'
,其中有 3 列 param_1、param_2 和 returns,因此我想最大化输出低于定义,
def func(p1, p2):
return df_main[(df_main['param_1'] >= p1) & (df_main['param_2'] >= p2)]['returns'].add(1).cumprod().iloc[-1]
定义 returns returns 列在 param_1 和 param_2
列上应用过滤器后的累积乘积
我正在尝试以下操作,
import scipy.optimize as spo
spo.brute(func, ((0, 1, 0.1), (0, 1, 0.1)), finish=None)
导致,
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-322-4fb6b5111a14> in <module>
----> 1 spo.brute(func, ((0,1,0.1), (0,1,0.1)), finish=None)
e:\Anaconda3\lib\site-packages\scipy\optimize\optimize.py in brute(func, ranges, args, Ns, full_output, finish, disp)
2829 if (N == 1):
2830 grid = (grid,)
-> 2831 Jout = vecfunc(*grid)
2832 Nshape = shape(Jout)
2833 indx = argmin(Jout.ravel(), axis=-1)
e:\Anaconda3\lib\site-packages\numpy\lib\function_base.py in __call__(self, *args, **kwargs)
1970 vargs.extend([kwargs[_n] for _n in names])
1971
-> 1972 return self._vectorize_call(func=func, args=vargs)
1973
1974 def _get_ufunc_and_otypes(self, func, args):
e:\Anaconda3\lib\site-packages\numpy\lib\function_base.py in _vectorize_call(self, func, args)
2040 res = func()
2041 else:
-> 2042 ufunc, otypes = self._get_ufunc_and_otypes(func=func, args=args)
2043
2044 # Convert args to object arrays first
e:\Anaconda3\lib\site-packages\numpy\lib\function_base.py in _get_ufunc_and_otypes(self, func, args)
2000
2001 inputs = [arg.flat[0] for arg in args]
-> 2002 outputs = func(*inputs)
2003
2004 # Performance note: profiling indicates that -- for simple
e:\Anaconda3\lib\site-packages\scipy\optimize\optimize.py in _scalarfunc(*params)
2823 def _scalarfunc(*params):
2824 params = asarray(params).flatten()
-> 2825 return func(params, *args)
2826
2827 vecfunc = vectorize(_scalarfunc)
TypeError: func() missing 1 required positional argument: 'p2'
如何在使用 cumprod() 将两个参数用作数据框上的过滤器时强制使用它们? 3 列的 numpy 数组而不是数据框本身的应用程序应该也够了。
scipy.optimize.brute
可能将参数作为数组(形式为 np.array([p1,p2]))提供给您的函数。所以如果你改变你的功能来适应这个,那行得通吗?例如
def func(p_arr):
p1, p2 = p_arr
return df_main[(df_main['param_1'] >= p1) & (df_main['param_2'] >= p2)]['returns'].add(1).cumprod().iloc[-1]
我正在尝试优化一个包含两个变量的函数。问题是我的函数有一个 pandas 数据帧 'df_main'
,其中有 3 列 param_1、param_2 和 returns,因此我想最大化输出低于定义,
def func(p1, p2):
return df_main[(df_main['param_1'] >= p1) & (df_main['param_2'] >= p2)]['returns'].add(1).cumprod().iloc[-1]
定义 returns returns 列在 param_1 和 param_2
列上应用过滤器后的累积乘积我正在尝试以下操作,
import scipy.optimize as spo
spo.brute(func, ((0, 1, 0.1), (0, 1, 0.1)), finish=None)
导致,
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-322-4fb6b5111a14> in <module>
----> 1 spo.brute(func, ((0,1,0.1), (0,1,0.1)), finish=None)
e:\Anaconda3\lib\site-packages\scipy\optimize\optimize.py in brute(func, ranges, args, Ns, full_output, finish, disp)
2829 if (N == 1):
2830 grid = (grid,)
-> 2831 Jout = vecfunc(*grid)
2832 Nshape = shape(Jout)
2833 indx = argmin(Jout.ravel(), axis=-1)
e:\Anaconda3\lib\site-packages\numpy\lib\function_base.py in __call__(self, *args, **kwargs)
1970 vargs.extend([kwargs[_n] for _n in names])
1971
-> 1972 return self._vectorize_call(func=func, args=vargs)
1973
1974 def _get_ufunc_and_otypes(self, func, args):
e:\Anaconda3\lib\site-packages\numpy\lib\function_base.py in _vectorize_call(self, func, args)
2040 res = func()
2041 else:
-> 2042 ufunc, otypes = self._get_ufunc_and_otypes(func=func, args=args)
2043
2044 # Convert args to object arrays first
e:\Anaconda3\lib\site-packages\numpy\lib\function_base.py in _get_ufunc_and_otypes(self, func, args)
2000
2001 inputs = [arg.flat[0] for arg in args]
-> 2002 outputs = func(*inputs)
2003
2004 # Performance note: profiling indicates that -- for simple
e:\Anaconda3\lib\site-packages\scipy\optimize\optimize.py in _scalarfunc(*params)
2823 def _scalarfunc(*params):
2824 params = asarray(params).flatten()
-> 2825 return func(params, *args)
2826
2827 vecfunc = vectorize(_scalarfunc)
TypeError: func() missing 1 required positional argument: 'p2'
如何在使用 cumprod() 将两个参数用作数据框上的过滤器时强制使用它们? 3 列的 numpy 数组而不是数据框本身的应用程序应该也够了。
scipy.optimize.brute
可能将参数作为数组(形式为 np.array([p1,p2]))提供给您的函数。所以如果你改变你的功能来适应这个,那行得通吗?例如
def func(p_arr):
p1, p2 = p_arr
return df_main[(df_main['param_1'] >= p1) & (df_main['param_2'] >= p2)]['returns'].add(1).cumprod().iloc[-1]