创建自定义规则-TranscientDesicionParameter
注册自定义规则-TranscientDesicionParameter
粘贴以下代码,然后单击 “保存” 按钮
类瞬态决策参数(参数):
“"” 根据当前的时间步返回两个值之一
这个 “参数” 可以用来对离散决策事件进行建模
那发生在给定的日期。在此日期之前,“之前”
返回值,并在此日期之后返回 “之后” 值。
参数
----------
decision_date:字符串或 Pandas.Timestamp
决定的触发日期。
before_parameter
在决策日期之前使用的值。
after_parameter:参数
决策日期之后要使用的值。
earliest_date:字符串或 Pandas.Timestamp 或 None
可以将变量设置为的最早日期。默认为 model.timestepper.start
latest_date:字符串或 Pandas.Timestamp 或 None
可以将变量设置为的最新日期。默认为 model.timestepper.end
decision_freq:熊猫频率字符串(默认为 'AS')
确定可行日期。例如,“AS” 每隔一段时间都会创建可行的日期
介于 “最早” 之间的年份_日期`和`最新_日期`。使用了 `pandas` 函数
内部用于增量日期计算。
“”
def __初始化__(自我、模特、决策_日期,之前_参数,之后_参数,最早_日期 = 无,最新_日期=无,决定_freq='as',**kwargs):
super(瞬态决策参数,自我)。__初始化__(型号,**kwargs)
自我。_决定_日期 = 无
自我决定_日期 = 决定_约会
如果不是 isinstance(before_parameter,参数):
raise ValueError('之前的值应该是参数实例。')
before_parameter.parameter.parameter.p
自我。之前_参数 = 之前_参数
如果不是 isinstance(after_parameter,参数):
raise ValueError('之后值应该是参数实例。')
after_parameter.parameter.parameter.param
自我。之后_参数 = 之后_参数
# 如果将该类用作变量,则主要使用这些参数。
自我。_最早_日期 = 无
最早的自己_日期 = 最早_约会
自我。_最新_日期 = 无
自我。最新_日期 = 最新_约会
自我决定_频率 = 决定_频率
自我。_可行_日期 = 无
self.integer_size = 1 # 此参数只有一个整数变量
def decision_date ():
def fget(自我):
回归自我。_决定_约会
def fset(自我,价值):
if 是实例(值,PD.Timestamp):
自我。_决定_日期 = 值
否则:
自我。_决定_日期 = pd.to_datetime(值)
返回本地人 ()
决定_日期 = 属性 (**决策日期 ()
def earliest_date ():
def fget(自我):
如果是自我。_最早_日期不是 “无”:
回归自我。_最早_约会
否则:
返回 self.model.timestepper.start
def fset(自我,价值):
if 是实例(值,PD.Timestamp):
自我。_最早_日期 = 值
否则:
自我。_最早_日期 = pd.to_datetime(值)
返回本地人 ()
最早_日期 = 属性 (**earliest_date ())
def latest_date ():
def fget(自我):
如果是自我。_最新_日期不是 “无”:
回归自我。_最新_约会
否则:
返回 self.model.timestepper.end
def fset(自我,价值):
if 是实例(值,PD.Timestamp):
自我。_最新_日期 = 值
否则:
自我。_最新_日期 = pd.to_datetime(值)
返回本地人 ()
最新_日期 = 属性 (**latest_date ())
def 设置(自我):
super(瞬态决策参数,自我).setup ()
# 现在设置此对象用作变量的可行日期。
自我。_可行_日期 = pd.date_范围(self.earliest_日期,self.latest_date,
freq=self.decision_freq)
def 值(self、ts、scenario_index):
如果 ts 为无:
v = self.before_参数.get_值(场景索引)
elif ts.datetime >= self.decision_date:
v = self.after_参数.get_值(场景索引)
否则:
v = self.before_参数.get_值(场景索引)
返回 v
def get_整数_lower_bounds(自我):
返回 np.array ([0,], dtype=np.int)
def get_整数_upper_bounds(自我):
返回 np.array ([len (self._可行_日期)-1,], dtype=np.int)
def 设置_整数_变量(自我、值):
# 使用相应的可行日期更新决策日期
自我决定_日期 = 自我._feasible_dates [值 [0]]
def get_整数_变量(自我):
返回 np.array ([self._可行_dates.get_loc (self.decision)_日期),], dtype=np.int)
def dump(自身):
数据 = {
'最早_日期': self.earliess_date.isoformat (),
'最新_日期': self.latest_date.isoformat (),
'决定_日期': self.decision_date.isoformat (),
'决定_频率': self.decision_频率
}
返回数据
@classmethod
def 负载(cls、模型、数据):
以前_参数 = 加载_参数(模型,data.pop('before_parameter'))
之后_参数 = 加载_参数(模型,data.pop('after_parameter'))
返回 cls(模型,之前_参数=之前_参数,之后_参数=之后_参数,**数据)
瞬态决策参数 .register ()
现在,在 WaterStrategy 中运行这个网络时,将注册 TranscientDecisionParameter。
保存自定义规则后,请确保它显示在左侧,在本例中为 参数 部分
使用 TranscientDesicion 参数
在这种情况下,我们将把最大音量增加一倍 新水库 storage node 从 2045-01-01-01-01
开始
前往 新水库 storage node 和 “编辑” 最大音量
在里面选择 选项 选项卡 PYWR_参数
粘贴以下代码,然后单击 保存
{
“类型”:“瞬态决策参数”,
“之后_参数”:”__新水库__:max_之后的音量”,
“之前_参数”:”__新水库__:max_之前的音量”,
“决策日期”:“2045-01-01-__1234567890____”,
“最新日期”:“2045-01-01-__1234567890____”
}
TranscientDesicion参数包含 “之前” 的属性_参数和
之后_参数`我们必须按如下方式创建:
当我们可以写下新名字时,会打开一个小文本框 PWR_参数,在本例中为
__新水库__:max_之前的音量。 点击 输入。\
WaterStrategy 将打开参数窗口,粘贴以下代码然后 保存
__新水库__:max_之前的音量:
{
“类型”:“常量参数”,
“值”:120000
}
重复操作以创建参数后的最大音量
__新水库__:max_之后的音量:
{
“类型”:“常量参数”,
“值”:240000
}
作为最后一步,TranscientDesicion参数
需要 初始体积比例 对于 storage node 作为参数继承节点的初始值,在这种情况下,我们将设置为 0.99
结果
正如我们在下图中看到的那样,我们正在使用气候变化合并pywr情景,并在1月1日将所选水库的体积从120.000增加到240.2__1234567890__________ml 2045。