You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于GEKKO的两个Pandas DataFrame优化问题排查

问题排查与修正方案

错误原因分析

你遇到的invalid inequalities: z > x < y错误,核心问题出在变量边界的数组赋值和约束定义方式上:

  1. 变量边界不能是数组:p = m.Var(lb=0, ub=y2)和n = m.Var(lb=x2, ub=ex)中,y2、x2、ex都是NumPy数组,GEKKO变量的上下界必须是单个数值,数组会被解析为多个冲突的不等式,触发非法链式不等式错误。
  2. 约束定义方式错误:m.Equation()不能直接接收生成器表达式,需要用循环逐个添加等式,或使用m.Equations()(复数形式)批量添加。
  3. 逻辑匹配问题:当前代码用单个变量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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 04:15:38