首页 > 解决方案 > 如何使用字典中的数据初始化索引参数

问题描述

我正在使用两个块,一个使用 pandas 从 .csv 文件导入数据,另一个使用此信息来构造变量值。

第一个块工作正常,我可以用索引值构建一个表(在这种情况下是能源关税价格):

import pandas as pd

df_1 = pd.read_csv('time_tff_data.csv', sep=';', usecols=['time', 'tff'], index_col='time', header=0)

data_Tariff = {
    'tff':{'time': df_1['tff'].to_dict()} #Set of tariff prices
    }              

data = {None: dict(tariff=data_Tariff)}

问题是在另一个块上,即我需要使用数据的块上,我无法使用字典中的数据初始化参数。尽管我正在使用 Pyomo(用于优化),但我的问题不是关于 Pyomo 本身,而是关于如何使用存储在字典(self.tff)中的数据初始化参数:

from pyomo.environ import *
from data import data_Tariff
from pyomo.environ import SimpleBlock

class tariff(SimpleBlock):
     
    def __init__(self, *args, **kwds):
        super().__init__(*args, **kwds)
        self.time = Set()
        
        self.Tmax = Param(self.time, doc='Maximum tariff price',  default=1.06, multable=True)
        self.Tmin = Param(self.time, doc='Minimum tariff price',  default=0.39, multable=True)
        self.tff = Param(self.time, doc='Set of tariff prices',  default=data_Tariff['tff'], mutable=True)
        self.Tc = Var(self.time, doc='Tariff priority index', initialize=0)
        
        def _Tc(m, t):
            if tff is not None:
                return (m.Tc[t] == (m.Tmax-m.tff[t])/(m.Tmax-m.Tmin) for t in m.time)
            return Constraint.Skip
    
        self.Tc = Constraint(self.time, rule=_Tc, doc='Tariff priority index')

我的问题是:我如何从数据块中导入关税数据“tff[t]”,因为该集合是按时间 [t] 索引的?

标签: pandasdataframedictionarypyomo

解决方案


几个快速观察...

首先,您应该使用关键字initializenotdefault从集合中初始化。另外,我不明白你为什么要让它可变,所以你可以删除它。尝试:

self.tff    = Param(self.time, doc='Set of tariff prices',  initialize=data_Tariff['tff'])

这假设data_Tariff[tff]返回一个正确构造的字典,该字典由self.time

备份,我看到你还需要初始化self.time:

self.time = Set(initialize=data_Tariff[tff].keys())

你的约束...你的约束看起来不正确。for t in m.time当您使用集合调用规则时,会处理该部分。它将对 的每个值进行约束t。检查 tff... 可能没有必要,对吧?如果有必要,您需要将其引用为self.tff. 所以:

def _Tc(m, t):
    return m.Tc[t] == (m.Tmax-m.tff[t])/(m.Tmax-m.Tmin)

self.Tc = Constraint(self.time, rule=_Tc, doc='Tariff priority index')

此外,您的TmaxandTmin似乎只是常量(未编入索引)。如果是这种情况,您可以稍微简化一下,只需将它们视为常规 python 变量的常量,如果需要,将它们从模型声明中取出。


推荐阅读