我试图将理论模型与历史数据进行比较.我的计划是用Gekko将真实世界的数据从几个pandas数据框输入到方程中(跳到#方程#):

import pandas as pd
import pylab as plt
import numpy as np
from gekko import GEKKO

#DATA#
#oil supply
data = pd.read_html('https://www.eia.gov/dnav/pet/hist/LeafHandler.ashx?n=pet&s=mcrfpus2&f=m')
s=data[4]
sply = s.loc[s['Year'] >= 1984]
supplyvalues = sply.filter(items = ['Jan', 'Feb', 'Mar', 'Apr', 'May','Jun','Jul','Aug','Sep', 'Oct', 'Nov','Dec'])
val2 = supplyvalues.dropna()
protoval3 = supplyvalues.shift(1)
val3=protoval3.dropna()
#price of oil
p = pd.read_html('https://www.eia.gov/dnav/pet/hist/LeafHandler.ashx?n=PET&s=EMA_EPM0_PTG_NUS_DPG&f=M')
Op=p[4]
prc = Op.loc[Op['Year'] >= 1984]
pricevalues = prc.filter(items = ['Jan', 'Feb', 'Mar', 'Apr', 'May','Jun','Jul','Aug','Sep', 'Oct', 'Nov','Dec'])
val1 = pricevalues.dropna()

#EQUATION#
m=GEKKO()
tm = np.linspace(0,10,50)
t=m.Param(value = tm)
m.time = tm
m.options.IMODE=4

#forming equation
a,b,c = m.Array(m.Param,3)
a.value = val1.values
b.value = val2.values
c.value = val3.values
x = m.Var()
m.Equation(a == c-a*b)
m.solve(disp=False)

问题是,每次try 时,都会出现以下错误:

Exception: Data arrays must have the same length, and match time discretization in dynamic problems

我判断了数据帧的形状,它们是相等的,所以我不确定出了什么问题.有点烦,因为我觉得我真的很亲近.如果你能给我任何帮助,我将不胜感激!

p、 s:我还是一个编程初学者,所以如果你能描述一下你的新代码行的功能(如果你有),我也会非常感激.这是完全可选的!

推荐答案

参数val1val2val338x12个矩阵.

      Jan    Feb    Mar    Apr    May  ...    Aug    Sep    Oct    Nov    Dec
1   0.906  0.902  0.907  0.929  0.934  ...  0.892  0.897  0.905  0.899  0.880
3   0.846  0.836  0.871  0.924  0.944  ...  0.940  0.919  0.908  0.917  0.919
4   0.893  0.805  0.654  0.591  0.638  ...  0.555  0.562  0.532  0.532  0.542
5   0.597  0.621  0.627  0.649  0.663  ...  0.716  0.705  0.697  0.694  0.674
6   0.649  0.633  0.625  0.660  0.684  ...  0.718  0.700  0.680  0.676  0.661

需要进行一些修改才能给出成功的解决方案.

  1. 仅 Select 一个月或将年度数据与时间离散点对齐.
#forming equation
a,b,c = m.Array(m.Param,3)
a.value = val1['Jan'].values
b.value = val2['Jan'].values
c.value = val3['Jan'].values

如果需要多个月的模拟,则将每个参数放入值向量中.

  1. 将时间点与val1val2val3的输入对齐.
tm = np.linspace(0,10,38)
  1. 判断方程式.

每个月有38个时间点,因此时间离散化也需要这么多时间点.该方程看起来并不完整-动态模拟通常具有微分方程,如x.dt()==-x + a - b + c.

  1. 导入需要lxml个包.安装方式:
pip install lxml

这是一个成功解决问题的完整脚本,但不是预期的模拟.也许这是开发模拟问题的一个很好的起点.

import pandas as pd
import pylab as plt
import numpy as np
from gekko import GEKKO

#DATA#
#oil supply
data = pd.read_html('https://www.eia.gov/dnav/pet/hist/LeafHandler.ashx?n=pet&s=mcrfpus2&f=m')
s=data[4]
sply = s.loc[s['Year'] >= 1984]
supplyvalues = sply.filter(items = ['Jan', 'Feb', 'Mar', 'Apr', 'May','Jun','Jul','Aug','Sep', 'Oct', 'Nov','Dec'])
val2 = supplyvalues.dropna()
protoval3 = supplyvalues.shift(1)
val3=protoval3.dropna()
#price of oil
p = pd.read_html('https://www.eia.gov/dnav/pet/hist/LeafHandler.ashx?n=PET&s=EMA_EPM0_PTG_NUS_DPG&f=M')
Op=p[4]
prc = Op.loc[Op['Year'] >= 1984]
pricevalues = prc.filter(items = ['Jan', 'Feb', 'Mar', 'Apr', 'May','Jun','Jul','Aug','Sep', 'Oct', 'Nov','Dec'])
val1 = pricevalues.dropna()

print(np.shape(val1.values))

#EQUATION#
m=GEKKO(remote=False)
tm = np.linspace(0,10,38)
print(len(tm))
t=m.Param(value = tm)
m.time = tm
m.options.IMODE=4

#forming equation
a,b,c = m.Array(m.Param,3)
a.value = val1['Jan'].values
b.value = val2['Jan'].values
c.value = val3['Jan'].values
x = m.Var()
m.Equation(x == c-a*b)
m.solve(disp=True)

Python相关问答推荐

Excel图表-使用openpyxl更改水平轴与Y轴相交的位置(Python)

在Polars(Python库)中将二进制转换为具有非UTF-8字符的字符串变量

加速Python循环

如何将Docker内部运行的mariadb与主机上Docker外部运行的Python脚本连接起来

如何在Python脚本中附加一个Google tab(已经打开)

Odoo 16使用NTFS使字段只读

当我try 在django中更新模型时,模型表单数据不可见

使用特定值作为引用替换数据框行上的值

AES—256—CBC加密在Python和PHP中返回不同的结果,HELPPP

matplotlib + python foor loop

python sklearn ValueError:使用序列设置数组元素

巨 Python :逆向猜谜游戏

我对这个简单的异步者的例子有什么错误的理解吗?

从嵌套极轴列的列表中删除元素

Python将一个列值分割成多个列,并保持其余列相同

如何在Airflow执行日期中保留日期并将时间转换为00:00

我可以不带视频系统的pygame,只用于游戏手柄输入吗?''

如何写一个polars birame到DuckDB

利用SCIPY沿第一轴对数组进行内插

使用美汤对维基百科表格进行网络刮擦未返回任何内容