Source code for policyengine_core.parameters.parameter_at_instant

import copy
import typing

from policyengine_core import commons
from policyengine_core.errors import ParameterParsingError
from policyengine_core.parameters.config import ALLOWED_PARAM_TYPES
from policyengine_core.parameters.helpers import _validate_parameter


[docs]class ParameterAtInstant: """ A value of a parameter at a given instant. """ _allowed_keys = set(["value", "metadata"]) def __init__( self, name: str, instant_str: str, data: dict = None, file_path: str = None, metadata: dict = None, ): """ :param str name: name of the parameter, e.g. "taxes.some_tax.some_param" :param str instant_str: Date of the value in the format `YYYY-MM-DD`. :param dict data: Data, usually loaded from a YAML file. """ self.name: str = name self.instant_str: str = instant_str self.file_path: str = file_path self.metadata: typing.Dict = {} # Accept { 2015-01-01: 4000 } if not isinstance(data, dict) and isinstance( data, ALLOWED_PARAM_TYPES ): self.value = data return if metadata is not None: self.metadata.update(metadata) # Inherit metadata from Parameter self.metadata.update(data.get("metadata", {})) self.validate(data) self.value: float = data["value"]
[docs] def validate(self, data: dict) -> None: _validate_parameter( self, data, data_type=dict, allowed_keys=self._allowed_keys ) try: value = data["value"] except KeyError: raise ParameterParsingError( "Missing 'value' property for {}".format(self.name), self.file_path, ) if not isinstance(value, ALLOWED_PARAM_TYPES): raise ParameterParsingError( "Value in {} has type {}, which is not one of the allowed types ({}): {}".format( self.name, type(value), ALLOWED_PARAM_TYPES, value ), self.file_path, )
def __eq__(self, other) -> bool: return ( (self.name == other.name) and (self.instant_str == other.instant_str) and (self.value == other.value) ) def __repr__(self) -> str: return "ParameterAtInstant({})".format({self.instant_str: self.value})
[docs] def clone(self) -> "ParameterAtInstant": clone = commons.empty_clone(self) clone.__dict__ = self.__dict__.copy() clone.metadata = copy.deepcopy(self.metadata) return clone