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

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

<figure><img src="/files/DXpmQnzAHNZUwJV8NcDb" alt=""><figcaption></figcaption></figure>

Вставьте следующий код и нажмите кнопку «Сохранить» ![](/files/SXNkNtCOIKkNTRwL5eu2)

```питон
Параметр класса 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.

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

<figure><img src="/files/1AmG1xdmyCuxpf0sguRm" alt=""><figcaption></figcaption></figure>

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

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

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

<figure><img src="/files/M3PoG5PYJ6UVbsC9uLJy" alt="" width="446"><figcaption></figcaption></figure>

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

<figure><img src="/files/0BMdSrJXyjMwdicHYUPH" alt="" width="271"><figcaption></figcaption></figure>

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

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

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

<figure><img src="/files/uJ9nqF6vir3Fl0xzFkL6" alt=""><figcaption></figcaption></figure>

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

<figure><img src="/files/GnVLKMcK9BiUwGeA2VMi" alt="" width="375"><figcaption></figcaption></figure>

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

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

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

<figure><img src="/files/BzDJj5KjC4WK6JGNj2Iy" alt=""><figcaption></figcaption></figure>

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

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

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

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

<figure><img src="/files/9bgc5gUxEfBUA3rVnhS4" alt="" width="423"><figcaption></figcaption></figure>

## Результаты

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

<figure><img src="/files/DmvdrzuYxfJatiTRTgwq" alt=""><figcaption><p>смоделированный объем (новое водохранилище)</p></figcaption></figure>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://water-strategy.gitbook.io/waterstrategy/russkii/uchebnye-posobiya/pywr-scenarios-reading-external-dataframe-and-adding-custom-rules/create-custom-rule-transcientdecisionparameter.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
