如何通过Pandas或CSV读取器向Pyomo Concrete模型参数导入CSV数据?
用Pandas或CSV读取器将CSV数据导入Pyomo Concrete模型参数
方法一:使用Pandas(推荐,处理复杂数据更高效)
假设你有两个CSV文件:
time_set.csv:单列存储时间步,表头为Time,每行一个时间标识(如t1、t2)time_data.csv:第一列为时间步,后续列对应各参数(如demand、price)
步骤示例:
- 导入依赖库
import pandas as pd from pyomo.environ import ConcreteModel, Set, Param
- 读取时间集并创建Pyomo集合
# 读取时间集文件 time_df = pd.read_csv('time_set.csv') # 提取时间步列表 time_steps = time_df['Time'].tolist() # 初始化Concrete模型 model = ConcreteModel() # 创建时间集合 model.T = Set(initialize=time_steps)
- 读取参数数据并映射到Pyomo参数
# 读取参数数据文件,将时间列设为索引 data_df = pd.read_csv('time_data.csv').set_index('Time') # 为每个参数创建字典并导入模型 # 需求参数 model.demand = Param(model.T, initialize=data_df['demand'].to_dict()) # 价格参数 model.price = Param(model.T, initialize=data_df['price'].to_dict())
如果你的数据文件结构是参数为行、时间为列,只需转置数据后再转字典:
data_dict = data_df.T.to_dict('index') model.demand = Param(model.T, initialize=data_dict['demand'])
方法二:使用Python原生csv模块(无额外依赖)
如果不想引入Pandas,可直接用标准库读取:
步骤示例:
- 导入依赖库
import csv from pyomo.environ import ConcreteModel, Set, Param
- 读取时间集
time_steps = [] with open('time_set.csv', 'r') as f: reader = csv.reader(f) next(reader) # 跳过表头行 for row in reader: time_steps.append(row[0]) model = ConcreteModel() model.T = Set(initialize=time_steps)
- 读取参数数据并构建字典
demand_dict = {} price_dict = {} with open('time_data.csv', 'r') as f: # 按列名读取 reader = csv.DictReader(f) for row in reader: t = row['Time'] # 转换数据类型为浮点数(Pyomo参数默认支持数值类型) demand_dict[t] = float(row['demand']) price_dict[t] = float(row['price']) # 将字典导入模型参数 model.demand = Param(model.T, initialize=demand_dict) model.price = Param(model.T, initialize=price_dict)
注意事项
- 确保时间集文件中的时间标识与数据文件中的完全匹配,否则Pyomo会抛出索引不存在的错误
- 若参数是多维度(如时间+设备集),只需将数据整理为元组键的字典(如
{(t1, dev1): value}),再传入Param的initialize参数 - 处理非数值型数据时,需根据Pyomo参数的类型要求做对应转换
内容的提问来源于stack exchange,提问作者Pwrpyth
相关产品推荐
相关产品推荐

