如何根据数据帧数据优化 objective 函数
How do I optimise an objective function based on dataframe data
我有一个 objective 函数,它采用时间序列数据的 numpy 数组,用于计算随时间数据的估计 return 投资。此函数如下所示:
def bwp(x, *processed):
pred,real = x
money = 1000
for i in range(0, len(processed)):
if processed[i, 3] > pred and processed[i-1,4] > real:
money = money + (money * processed[i, 4])
return money * -1
我想最小化这个函数,它既便宜又不连续,所以我想用暴力的方法来优化它。
我正在尝试使用以下代码对此进行优化:
def opt_2(processed):
bounds = (slice(-1, 1), slice(-1, 1))
resbrute = optimize.brute(bwp, ranges=bounds, args=processed, full_output=True, finish=optimize.fmin)
print(resbrute[0])
print(resbrute[1])
我收到错误:
File "<input>", line 5, in bwp
TypeError: tuple indices must be integers or slices, not tuple
我不确定 bwp 中是什么导致它崩溃
编辑:处理的输入是一个 numpy 数组而不是数据帧
编辑:
处理的数据样本是:
2.90381543e+03 2.91549000e+03 -1.16745703e+01 0.00000000e+00 0.00000000e+00 -8.35888672e+00
2.89545654e+03 2.92187000e+03 -2.64134570e+01 -2.87858747e-03 2.18831140e-03 -8.35888672e+00
2.89380762e+03 2.92918000e+03 -3.53723828e+01 -5.69487318e-04 2.50182246e-03 -1.64892578e+00
2.89789600e+03 2.92579000e+03 -2.78940039e+01 1.41280259e-03 -1.15732048e-03 4.08837891e+00
由于processed
是一个元组,你可能需要分解成N个变量如下:
def bwp(x, *processed):
pred, real = x
money = 1000
v1, v2, v3, ... vN = processed
...
您的问题缺少可重现的示例,因此请不要犹豫 print(processed)
了解 scipy.optimize.brute
给您的论据。
我真的不认为需要使用不同数量的位置函数参数。相反,只需通过以下方式传递整个 np.array processed
:
def bwp(x, processed):
pred, real = x
money = 1000
for i in range(0, processed.shape[0]):
if processed[i, 3] > pred and processed[i-1,4] > real:
money = money + (money * processed[i, 4])
return money * -1
def opt_2(processed):
bounds = [(-1, 1), (-1, 1)]
resbrute = optimize.brute(lambda x: bwp(x, processed), ranges=bounds, full_output=True, finish=optimize.fmin)
print(resbrute[0])
print(resbrute[1])
请注意,我假设 processed
是 np.array,形状为 (4, 6)
,如您的问题所示。
我有一个 objective 函数,它采用时间序列数据的 numpy 数组,用于计算随时间数据的估计 return 投资。此函数如下所示:
def bwp(x, *processed):
pred,real = x
money = 1000
for i in range(0, len(processed)):
if processed[i, 3] > pred and processed[i-1,4] > real:
money = money + (money * processed[i, 4])
return money * -1
我想最小化这个函数,它既便宜又不连续,所以我想用暴力的方法来优化它。
我正在尝试使用以下代码对此进行优化:
def opt_2(processed):
bounds = (slice(-1, 1), slice(-1, 1))
resbrute = optimize.brute(bwp, ranges=bounds, args=processed, full_output=True, finish=optimize.fmin)
print(resbrute[0])
print(resbrute[1])
我收到错误:
File "<input>", line 5, in bwp
TypeError: tuple indices must be integers or slices, not tuple
我不确定 bwp 中是什么导致它崩溃
编辑:处理的输入是一个 numpy 数组而不是数据帧
编辑: 处理的数据样本是:
2.90381543e+03 2.91549000e+03 -1.16745703e+01 0.00000000e+00 0.00000000e+00 -8.35888672e+00
2.89545654e+03 2.92187000e+03 -2.64134570e+01 -2.87858747e-03 2.18831140e-03 -8.35888672e+00
2.89380762e+03 2.92918000e+03 -3.53723828e+01 -5.69487318e-04 2.50182246e-03 -1.64892578e+00
2.89789600e+03 2.92579000e+03 -2.78940039e+01 1.41280259e-03 -1.15732048e-03 4.08837891e+00
由于processed
是一个元组,你可能需要分解成N个变量如下:
def bwp(x, *processed):
pred, real = x
money = 1000
v1, v2, v3, ... vN = processed
...
您的问题缺少可重现的示例,因此请不要犹豫 print(processed)
了解 scipy.optimize.brute
给您的论据。
我真的不认为需要使用不同数量的位置函数参数。相反,只需通过以下方式传递整个 np.array processed
:
def bwp(x, processed):
pred, real = x
money = 1000
for i in range(0, processed.shape[0]):
if processed[i, 3] > pred and processed[i-1,4] > real:
money = money + (money * processed[i, 4])
return money * -1
def opt_2(processed):
bounds = [(-1, 1), (-1, 1)]
resbrute = optimize.brute(lambda x: bwp(x, processed), ranges=bounds, full_output=True, finish=optimize.fmin)
print(resbrute[0])
print(resbrute[1])
请注意,我假设 processed
是 np.array,形状为 (4, 6)
,如您的问题所示。