gpt4 book ai didi

python - 从 pandas DataFrame 定义 pyomo 中的参数

转载 作者:行者123 更新时间:2023-12-01 08:22:08 24 4
gpt4 key购买 nike

第一次使用 pyomo 用户。

我有一个定义模型的函数

def define_problem(SET_gen, SET_time, SET_buses, demand):                       

model = pyo.ConcreteModel()

#Define sets
model.SET_GEN = pyo.Set(initialize = SET_gen) #Set of generators
model.SET_TIME = pyo.Set(initialize = SET_time) #Set of hours
model.SET_BUSES = pyo.Set(initialize = SET_buses) #Set of buses

#Define parameters
model.DEMAND = pyo.Param(model.SET_BUSES, model.SET_TIME, initialize = demand_init)
...

函数中的参数“demand”是一个 pandas DataFrame

函数demand_init定义如下

def demand_init(model, bus, t, data = demand):
if(bus in set(data.columns)):
return data.loc[t,bus]
return 0.0

应该将每小时和每辆公交车的参数 model.DEMAND 定义为需求 DataFrame 中相应的“单元格”,如果公交车不在 DataFrame 中,则为 0。 编辑:在define_problem函数之外定义。

但它不起作用。如何从 pandas DataFrame 定义函数的参数?

EDIT: Thanks for the answers!

需求数据框如下所示:

      Bus1  Bus10  Bus11  Bus12  ...     Bus6  Bus7  Bus8   Bus9
Hour ...
1 0.0 9.00 3.50 6.10 ... 11.20 0.0 0.0 29.50
2 0.0 7.34 2.85 4.97 ... 9.13 0.0 0.0 24.06
3 0.0 6.45 2.51 4.37 ... 8.03 0.0 0.0 21.14
4 0.0 5.78 2.25 3.92 ... 7.20 0.0 0.0 18.95
5 0.0 5.56 2.16 3.77 ... 6.92 0.0 0.0 18.22

[5 rows x 14 columns]

应该进入demand_init函数的't'和'bus'是索引中的数字和数据帧中的列的名称。它们分别位于 model.SET_HOURS 和 model.SET_BUSES 集合中。

最佳答案

您似乎已经涵盖了这一点,因此我仅提供一些建议:

只需调用列 1,2 等并调用 总线,而不是调用每个列,这将使您的生活变得更加轻松” Bus1"

from pyomo import environ as pye
import pandas as pd
import numpy as np

n_bus = 5
n_hours = 10

demand_df = pd.DataFrame(
data = np.random.random(size=(n_hours, n_bus)),
columns = np.arange(1, n_bus+1),
index = np.arange(1, n_hours+1))

demand_df = demand_df.rename_axis('hour', axis=0)
demand_df = demand_df.rename_axis('bus', axis=1)

现在 DataFrame 看起来像

>>> demand_df.head()
bus 1 2 3 4 5
hour
1 0.249303 0.244917 0.348141 0.559970 0.414997
2 0.803017 0.940600 0.474955 0.976134 0.185487
3 0.776821 0.940770 0.482725 0.510914 0.186607
4 0.705604 0.871578 0.154195 0.943887 0.913865
5 0.039853 0.978370 0.320563 0.923042 0.591475

获取字典{(hour,bus):value}的简单方法是:

demand_d = demand_df.stack().to_dict()

现在,您似乎想将 0 定义为默认值。有三种方法(恕我直言,从最坏到最好):

  • 使用defaultdict:
from collections import defaultdict
demand_d =defaultdict(int, demand_df.stack().to_dict())
  • 确保所有列均填充 0 (.fillna(0))
  • 定义参数的默认值
model.DEMAND = pyo.Param(
model.SET_BUSES, model.SET_HOURS,
initialize = demand_d,
default = 0)

最后一点,AbstractModel 可能有助于大大减少手动数据提取的工作量。

关于python - 从 pandas DataFrame 定义 pyomo 中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54561728/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com