基于GEKKO的两个Pandas DataFrame优化问题排查
问题排查与修正方案
错误原因分析
你遇到的invalid inequalities: z > x < y错误,核心问题出在变量边界的数组赋值和约束定义方式上:
- 变量边界不能是数组:
p = m.Var(lb=0, ub=y2)和n = m.Var(lb=x2, ub=ex)中,y2、x2、ex都是NumPy数组,GEKKO变量的上下界必须是单个数值,数组会被解析为多个冲突的不等式,触发非法链式不等式错误。 - 约束定义方式错误:
m.Equation()不能直接接收生成器表达式,需要用循环逐个添加等式,或使用m.Equations()(复数形式)批量添加。 - 逻辑匹配问题:当前代码用单个变量
p、n对应多行数据,不符合"每个日期/列对独立优化"的需求,每行应该有对应的变量组。
修正后的代码
单一行的优化示例(对应原代码的i=0场景)
import gekko import numpy as np import pandas as pd # 模拟测试数据(替换为你的真实DataFrame) df1 = pd.DataFrame({'Value_0': [5], 'Value_1': [10]}) df2 = pd.DataFrame({'Value_0': [2], 'Value_1': [4]}) i = 0 # 初始化模型 m = gekko.GEKKO() # 提取单一行的数值(而非数组) y1 = df1['Value_'+str(i)].iloc[0] y2 = df1['Value_'+str(i+1)].iloc[0] x1 = df2['Value_'+str(i)].iloc[0] x2 = df2['Value_'+str(i+1)].iloc[0] # 计算斜率、截距、x交点 s = (y1 - y2)/(x1 - x2) c = (x1*y2 - x2*y1)/(x1 - x2) ex = -c/s # 定义变量,使用单个数值作为边界 p = m.Var(lb=0, ub=y2) n = m.Var(lb=x2, ub=ex) # 添加约束:线性插值关系 m.Equation(s * n + c == p) # 目标函数:最大化乘积n*p m.Maximize(n * p) # 求解 m.solve(disp=False) # 输出结果 print(f'p: {p.value[0]}') print(f'n: {n.value[0]}')
多行批量优化(遍历每个日期/行)
import gekko import numpy as np import pandas as pd # 模拟测试数据(替换为你的真实DataFrame) df1 = pd.DataFrame({'Value_0': [5, 8], 'Value_1': [10, 15]}) df2 = pd.DataFrame({'Value_0': [2, 3], 'Value_1': [4, 6]}) i = 0 results = [] for idx in range(len(df1)): # 初始化模型 m = gekko.GEKKO() # 提取当前行的数值 y1 = df1['Value_'+str(i)].iloc[idx] y2 = df1['Value_'+str(i+1)].iloc[idx] x1 = df2['Value_'+str(i)].iloc[idx] x2 = df2['Value_'+str(i+1)].iloc[idx] # 计算线性参数 s = (y1 - y2)/(x1 - x2) c = (x1*y2 - x2*y1)/(x1 - x2) ex = -c/s # 定义变量 p = m.Var(lb=0, ub=y2) n = m.Var(lb=x2, ub=ex) # 添加约束 m.Equation(s * n + c == p) # 最大化乘积 m.Maximize(n * p) # 求解 m.solve(disp=False) # 保存结果 results.append({ 'date': df1.index[idx], # 假设df1的索引是日期 'p': p.value[0], 'n': n.value[0], 'max_product': p.value[0] * n.value[0] }) # 转换为结果DataFrame results_df = pd.DataFrame(results) print(results_df)
关键修正点说明
- 将数组形式的边界替换为单个数值:通过
iloc[idx]提取单行数据,确保变量的上下界是标量。 - 约束添加方式:单个等式用
m.Equation(),批量等式用m.Equations()(若需批量处理)。 - 独立模型实例:每行优化创建单独的GEKKO模型,避免变量冲突,满足"每个日期独立优化"的需求。
内容的提问来源于stack exchange,提问作者OAP
相关产品推荐
相关产品推荐

