Создать собственное правило — параметр TranscientDecision

Зарегистрировать настраиваемое правило — параметр TranscientDecision

Вставьте следующий код и нажмите кнопку «Сохранить»

Параметр класса TransientDecision (параметр):
    «"» Возвращает одно из двух значений в зависимости от текущего временного шага

    Этот «Параметр» можно использовать для моделирования дискретного события принятия решения
     это происходит в определенный день. До этой даты «до»
     возвращается значение, а после этой даты возвращается значение «после».

    параметры
    ----------
    decision_date: строка или панды. Timestamp
        Дата начала принятия решения.
    before_parameter: параметр
        Значение, которое следует использовать до даты принятия решения.
    after_parameter: Параметр
        Значение, которое будет использоваться после даты принятия решения.
    earliest_date: строка или пандас.Timestamp или нет
        Самая ранняя дата, на которую можно установить переменную. По умолчанию используется значение `model.timestepper.start`
    latest_date: строка или Pandas.Timestamp или нет
        Последняя дата, на которую можно установить переменную. По умолчанию используется значение `model.timestepper.end`
    decision_freq: частотная строка панд (по умолчанию «AS»)
        Решение возможных дат. Например, «AS» будет каждый раз создавать возможные даты
        год между «самым ранним»_дата` и `последнее_дата`. Используются функции `pandas`
        для внутренних расчетов дельта-дат.

    «"»

    def __инициалировать__(«я», «модель», «решение»)_дата, до_параметр, после_параметр, самый ранний_Дата = нет, последняя_Дата = нет, решение_freq='as', **kwargs):
        super (параметр временного решения, self).__инициалировать__(модель, **кварги)
        себя._решение_дата = Нет
        самостоятельное решение_дата = решение_дата

        если нет, то экземпляр (before_parameter, параметр):
            raise ValueError («Значение «до» должно быть экземпляром параметра. ')
        before_parameter.parents.add (сам)
        селф. раньше_параметр = до_параметр

        если нет, isinstance (after_parameter, параметр):
            raise ValueError ('Значение `after` должно быть экземпляром параметра. ')
        after_parameter.parents.add (сам)
        селф. после_параметр = после_параметр

        # Эти параметры чаще всего используются, если этот класс используется в качестве переменной.
        себя._самый ранний_дата = Нет
        сам. Самый ранний_дата = самая ранняя_дата

        себя._самый последний_дата = Нет
        self.latest_дата = последняя_дата

        самостоятельное решение_частота = решение_частота
        себя._выполнимый_даты = Нет
        self.целочисленный_размер = 1  # Этот параметр содержит одну целочисленную переменную

    def decision_date ():
        дегет (сам):
            возвращайся сам._решение_дата

        def fest («я», «значение»):
            если есть экземпляр (значение, PD.Timestamp):
                себя._решение_дата = значение
            еще:
                себя._решение_дата = pd.to_datetime (значение)

        вернуть местных жителей ()

    решение_дата = свойство (**дата_решения ()

    def arliest_date ():
        дегет (сам):
            если я сам._самый ранний_дата не равна нулю:
                возвращайся сам._самый ранний_дата
            еще:
                верните self.model.timestepper.start

        def fest («я», «значение»):
            если есть экземпляр (значение, PD.Timestamp):
                себя._самый ранний_дата = значение
            еще:
                себя._самый ранний_дата = pd.to_datetime (значение)

        вернуть местных жителей ()

    самый ранний_дата = свойство (**самая ранняя_дата ())

    def latest_date ():
        дегет (сам):
            если я сам._самый последний_дата не равна нулю:
                возвращайся сам._самый последний_дата
            еще:
                верните self.model.timestepper.end

        def fest («я», «значение»):
            если есть экземпляр (значение, PD.Timestamp):
                себя._самый последний_дата = значение
            еще:
                себя._самый последний_дата = pd.to_datetime (значение)

        вернуть местных жителей ()

    самый последний_дата = свойство (**последняя дата ())

    настройка по определению (самостоятельно):
        super (параметр временного решения, self) .setup ()

        # Теперь задайте допустимые даты использования этого объекта в качестве переменной.
        себя._выполнимый_даты = pd.date_диапазон (сам). Самый ранний_дата, self.latest_date,
                                                 freq=self.decision_freq)

    значение по умолчанию (self, ts, scenario_index):

        если оно равно «Нет»:
            v = self.before_параметр.get_значение (индекс_сценария)
        elif ts.datetime >= дата принятия самостоятельного решения:
            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_целое_переменные (self, значения):
        # Обновите дату принятия решения соответствующей возможной датой
        самостоятельное решение_дата = я._осуществимые даты [значения [0]]

    def get_целое_переменные (self):
        верните np.array ([self)._выполнимый_dates.get_loc (самостоятельное решение)_дата),], dtype=np.int)

    самосвалка (самовывоз):

        данные = {
            'самый ранний_«дата»: самая ранняя_формат date.iso (),
            'новейший_«дата»: self.latest_формат date.iso (),
            'решение_«дата»: самостоятельное решение_формат date.iso (),
            'решение_частота»: самостоятельное решение_частота
        }

        возвращать данные

    @classmethod
    заданная нагрузка (класс, модель, данные):

        перед_параметр = нагрузка_параметр (модель, data.pop ('before_parameter'))
        после_параметр = нагрузка_параметр (модель, data.pop ('after_parameter'))

        возвращаемый класс (модель), ранее_параметр = до_параметр, после_параметр = после_параметр, **данные)

Параметр временного решения.register ()

Теперь при запуске этой сети в WaterStrategy будет зарегистрирован параметр TranscientDecision.

Убедитесь, что после сохранения настраиваемого правила оно отображается слева, в данном случае в разделе Параметр раздел

Использование параметра TranscientDecision

В этом случае мы удвоим максимальный объем Новое водохранилище storage node начиная с 2045-__-01-01

Перейти к Новое водохранилище storage node и Редактировать Максимальная громкость

Выберите в Опции табуляция ПИВР_ПАРАМЕТР

Вставьте следующий код и нажмите Сохранить

{
  	«тип»: «Переходный параметр решения»,
	«после_параметр»:»__Новое водохранилище__:макс_громкость после»,
	«до_параметр»:»__Новое водохранилище__:макс_объем до»,
	«дата принятия решения»: «2045-01-01»,
	«последняя дата»: «2045-01-01»
}

Параметр TranscientDecision включает атрибуты «до»_параметрипосле_параметр`, который нам нужно будет создать следующим образом:

Откроется небольшое текстовое поле, когда мы сможем написать имя нашего нового PWR_ПАРАМЕТР, в данном случае __Новое водохранилище__:макс_объем до. Нажмите Введите. \

WaterStrategy откроет окно параметров, вставьте следующий код и Сохранить

**__Новое водохранилище__:макс_объем до: **

{
	«тип»: «Постоянный параметр»,
	«значение»: 120000
}

Повторите, чтобы создать максимальную громкость после параметра

**__Новое водохранилище__:макс_объем после: **

{
	«тип»: «Постоянный параметр»,
	«значение»: 240000
}

В качестве последнего шага требуется параметр «TranscientDecision» Начальная объемная пропорция для storage node, поскольку параметр наследует начальные значения от узла, в этом случае мы настроим на 0.99

Результаты

Как видно на следующем рисунке, мы комбинируем сценарии pywr с использованием изменения климата и увеличиваем объем выбранного нами водохранилища с 120.000 мл до 240.____000 мл за 1 января 2045 мл.

смоделированный объем (новое водохранилище)

Last updated

Was this helpful?