classe TransientDecisionParameter (Parameter): “"” Retorna um dos dois valores, dependendo do intervalo de tempo atual Este `Parâmetro` pode ser usado para modelar um evento de decisão discreto isso acontece em uma determinada data. Antes desta data, o `antes` o valor é retornado e, após essa data, o valor `depois` é retornado. Parâmetros ---------- decision_date: string ou pandas.Timestamp A data de ativação da decisão. before_parameter: Parâmetro O valor a ser usado antes da data da decisão. after_parameter: Parâmetro O valor a ser usado após a data da decisão. earliest_date: string ou pandas.Timestamp ou None Data mais antiga para a qual a variável pode ser definida. O padrão é `model.timestepper.start` latest_date: string ou pandas.Timestamp ou None Data mais recente para a qual a variável pode ser definida. O padrão é `model.timestepper.end` decision_freq: string de frequência de pandas (padrão 'AS') A resolução de datas viáveis. Por exemplo,'AS' criaria datas viáveis a cada ano entre `mais cedo_data` e `mais recente_encontro`. As funções `pandas` são usadas internamente para cálculos de data delta. “"” definitivamente __inicializá-lo__(eu, modelo, decisão)_data, antes_parâmetro, depois_parâmetro, mais antigo_Data = nenhuma, mais recente_Data = nenhuma, decisão_freq='as',**kwargs):super(TransientDecisionParameter, self).__inicializá-lo__(modelo, **kwargs) eu._decisão_data = Nenhuma autodecisão_data = decisão_data se não forisinstance (before_parameter, Parameter):raiseValueError('O valor `antes' deve ser uma instância de parâmetro. ') before_parameter.parents.add (self) sel. antes_parâmetro = antes_parâmetro se não forisinstance (after_parameter, Parameter):raiseValueError('O valor `after` deve ser uma instância de parâmetro. ') after_parameter.parents.add (self) self. depois_parâmetro = depois_parâmetro# Esses parâmetros são usados principalmente se essa classe for usada como variável. eu._mais cedo_data = Nenhuma self. mais antigo_data = mais antiga_data eu._mais recente_data = Nenhuma self.latest_data = mais recente_data autodecisão_freq = decisão_freq eu._viável_datas = Nenhuma self.integer_size =1# Esse parâmetro tem uma única variável inteiradefdecision_date ():deffget (self): devolva a si mesmo._decisão_datadeffset (self, valor):ifisinstance (valor, pd.timestamp): eu._decisão_data = valor senão: eu._decisão_data = pd.to_datetime (valor) retornar locais () decisão_data =propriedade (**data_de_decisão ()defearliest_date ():deffget (self): se eu mesmo._mais cedo_a data não é Nenhuma: devolva a si mesmo._mais cedo_data senão: retornar self.model.timestepper.startdeffset (self, valor):ifisinstance (valor, pd.timestamp): eu._mais cedo_data = valor senão: eu._mais cedo_data = pd.to_datetime (valor) retornar locais () mais cedo_data =propriedade (**data_anterior ()deflatest_date ():deffget (self): se eu mesmo._mais recente_a data não é Nenhuma: devolva a si mesmo._mais recente_data senão: retornar self.model.timestepper.enddeffset (self, valor):ifisinstance (valor, pd.timestamp): eu._mais recente_data = valor senão: eu._mais recente_data = pd.to_datetime (valor) retornar locais () mais recente_data =propriedade (**data_mais recente () configuração de definição (self):super(TransientDecisionParameter, self) .setup ()# Agora, configure as datas possíveis para quando esse objeto for usado como uma variável. eu._viável_datas = pd.date_intervalo (self.mais antigo)_data, self.latest_date, freq = self.decision_freq) valor def (self, ts, scenario_index): se ts for Nenhum: v = self.antes_parameter.get_valor (scenario_index)elif ts.datetime >= self.decision_date: v = self.after_parameter.get_valor (scenario_index) senão: v = self.antes_parameter.get_valor (scenario_index) retornar v definitivamente obter_inteira_lower_bounds (self): retornar np.array ([0,], dtype=np.int) definitivamente obter_inteira_limites superiores (self): retorna np.array ([len (self)._viável_datas) -1,], dtype=np.int) conjunto de definição_inteira_variáveis (self, valores):# Atualize a data da decisão com a data viável correspondente autodecisão_encontro = eu mesmo._datas_viáveis [valores [0]] definitivamente obter_inteira_variáveis (self):return np.array ([self._viável_datas.get_loc (autodecisão)_data),], dtype = np.int)defdump (self): dados = {'mais cedo_'data': self.mais cedo_formato data.iso (),'mais recente_'data': self.latest_formato data.iso (),'decisão_'data': autodecisão_formato data.iso (),'decisão_'frequência': autodecisão_freq } dados de retorno@classmethod carga definida (cls, modelo, dados): antes_parâmetro =carga_parâmetro (modelo, data.pop ('before_parameter')) depois_parâmetro =carga_parâmetro (modelo, data.pop ('after_parameter'))returncls (modelo), antes_parâmetro = antes_parâmetro, depois_parâmetro = depois_parâmetro, **dados)Parâmetro de decisão transitória.register ()
Agora, ao executar essa rede em WaterStrategy, um TranscientDecisionParameter será registrado.
Certifique-se de que, depois de salvar sua regra personalizada, ela seja exibida no lado esquerdo, neste caso em Parâmetro seção
Usando o TranscientDecisionParameter
Nesse caso, dobraremos o volume máximo de Novo reservatório storage node começando em 2045-01-01
Vá para Novo reservatório storage node e EditarVolume máximo
O TranscientDecisionParameter inclui atributos antes_parametro e depois_parameter que teremos que criar da seguinte forma:
Uma pequena caixa de texto se abrirá, quando pudermos escrever o nome do nosso novo POR_PARÂMETRO, neste caso
__Novo reservatório__:máximo_volume anterior. Clique Entrar. \
WaterStrategy abrirá a janela de parâmetros, colará o seguinte código e Salvar
Como última etapa, TranscientDecisionParameter precisa Proporção de volume inicial para o storage node, pois o parâmetro herda os valores iniciais do nó, neste caso, configuraremos para 0.99
Resultados
Como podemos ver na figura a seguir, estamos combinando cenários pywr usando a Mudança Climática e aumentando o volume do nosso reservatório selecionado de 120.000 Ml para 240.000 Ml em 1º de janeiro 2045.