以计算建模项目为重点的参数处理和验证库
paramtools的Python项目详细描述
paramtools
定义、更新和验证模型参数。
如何使用paramtools
子类paramtools.Parameters
并定义模型的parameters:
importparamtoolsclassTaxParams(paramtools.Parameters):defaults={"schema":{"labels":{"year":{"type":"int","validators":{"range":{"min":2013,"max":2027}}},"marital_status":{"type":"str","validators":{"choice":{"choices":["single","joint"]}}},},"additional_members":{"cpi_inflatable":{"type":"bool","number_dims":0},"cpi_inflated":{"type":"bool","number_dims":0}}},"standard_deduction":{"title":"Standard deduction amount","description":"Amount filing unit can use as a standard deduction.","cpi_inflatable":True,"cpi_inflated":True,"type":"float","value":[{"year":2024,"marital_status":"single","value":13673.68},{"year":2024,"marital_status":"joint","value":27347.36},{"year":2025,"marital_status":"single","value":13967.66},{"year":2025,"marital_status":"joint","value":27935.33},{"year":2026,"marital_status":"single","value":7690.0},{"year":2026,"marital_status":"joint","value":15380.0}],"validators":{"range":{"min":0,"max":9e+99}}},}params=TaxParams(initial_state={"year":[2024,2025,2026]},array_first=True)
查看状态:
params.view_state()# {'year': [2024, 2025, 2026]}
参数可通过实例属性获得:
params.standard_deduction# array([[13673.68, 27347.36],# [13967.66, 27935.33],# [ 7690. , 15380. ]])
查看标准演绎参数的标签:
params.from_array("standard_deduction")# [{'year': 2024, 'marital_status': 'single', 'value': 13673.68},# {'year': 2024, 'marital_status': 'joint', 'value': 27347.36},# {'year': 2025, 'marital_status': 'single', 'value': 13967.66},# {'year': 2025, 'marital_status': 'joint', 'value': 27935.33},# {'year': 2026, 'marital_status': 'single', 'value': 7690.0},# {'year': 2026, 'marital_status': 'joint', 'value': 15380.0}]
查询参数:
params.specification(year=2026,marital_status="single",use_state=False)# OrderedDict([('standard_deduction',# [{'value': 0.0, 'year': 2026, 'marital_status': 'single'}])])
调整默认值:
adjustment={"standard_deduction":[{"year":2026,"marital_status":"single","value":10000.0}],}params.adjust(adjustment)params.standard_deduction# array([[13673.68, 27347.36],# [13967.66, 27935.33],# [10000. , 15380. ]])
将标准扣除参数的所有值设置为0:
adjustment={"standard_deduction":0,}params.adjust(adjustment)params.standard_deduction# array([[0., 0.],# [0., 0.],# [0., 0.]])
无效输入错误:
adjustment["standard_deduction"]="higher"params.adjust(adjustment)# ---------------------------------------------------------------------------# ValidationError Traceback (most recent call last)# <ipython-input-7-d9ad03cf54d8> in <module># 1 adjustment["standard_deduction"] = "higher"# ----> 2 params.adjust(adjustment)# ~/Documents/ParamTools/paramtools/parameters.py in adjust(self, params_or_path, raise_errors)# 134# 135 if raise_errors and self._errors:# --> 136 raise self.validation_error# 137# 138 # Update attrs.# ValidationError: {'standard_deduction': ['Not a valid number: higher.']}
超出范围的输入错误:
adjustment["standard_deduction"]=[{"marital_status":"single","year":2025,"value":-1}]params.adjust(adjustment)# output:# ---------------------------------------------------------------------------# ValidationError Traceback (most recent call last)# <ipython-input-14-208948dfbd1d> in <module># 1 adjustment["standard_deduction"] = [{"marital_status": "single", "year": 2025, "value": -1}]# ----> 2 params.adjust(adjustment)# ~/Documents/ParamTools/paramtools/parameters.py in adjust(self, params_or_path, raise_errors, extend_adj)# 183# 184 if raise_errors and self._errors:# --> 185 raise self.validation_error# 186# 187 if self.label_to_extend is not None and extend_adj:# ValidationError: {# "standard_deduction": [# "standard_deduction[marital_status=single, year=2025] -1.0 < min 0 "# ]# }
如何安装paramtools
使用conda安装:
conda install -c conda-forge paramtools
从源安装:
git clone https://github.com/PSLmodels/ParamTools
cd ParamTools
conda env create
conda activate paramtools-dev
pip install -e .
# optionally run tests:
py.test -v
文档
完整的文档可在paramtools.org找到。
贡献
欢迎投稿!签出CONTRIBUTING.md开始。
学分
paramtools构建在优秀的marshmallowjson模式和验证框架之上。我鼓励每个人查看他们的回购协议和文件。paramtools是在Tax-Calculator's参数处理和验证引擎的基础上建模的,因为它的成熟度和复杂的功能。