显示了一些典型的代码行(“model.add”等用于求解器输入,可以忽略): #(-1) 不是 -1,它在模型求解器中具有对前一周期的引用的含义。 #UKUS 的意思是“从到”。只需将前两个字符视为感兴趣的 VAR。 RUK 与英国一样受到关注。 #我不是在问如何重写代码,而是在问如何重构它。
model.add('YDrUK = (YUK + RUK(-1)*BdUKUK(-1) + XRUS*RUS(-1)*BsUKUS(-1))*(1 - thetaUK) + d(XRUS)*BsUKUS(-1)')
model.add('YDhsUK = YDrUK + d(XRUS)*BsUKUS(-1)') # 12.2 : Haig-Simons disposable income in the UK
model.add('VUK - VUK(-1) = YDrUK - CONSUK') # 12.3 : Wealth accumulation in the UK
# 12.4 : Disposable income in the US
model.add('YDrUS = (YUS + RUS(-1)*BdUSUS(-1) + XRUK*RUK(-1)*BsUSUK(-1))*(1 - thetaUS) + d(XRUK)*BsUSUK(-1)')
model.add('YDhsUS = YDrUS + d(XRUK)*BsUSUK(-1)') # 12.5 : Haig-Simons disposable income in the US
model.add('VUS - VUS(-1) = YDrUS - CONSUS') # 12.6 : Wealth accumulation in the US
model.add('TUK = thetaUK*(YUK + RUK(-1)*BdUKUK(-1) + XRUS*RUS(-1)*BsUKUS(-1))') # 12.7 : Taxes in the UK
model.add('TUS = thetaUS*(YUS + RUS(-1)*BdUSUS(-1) + XRUK*RUK(-1)*BsUSUK(-1))') # 12.8 : Taxes in the US
model.add('FcbUK = RUK(-1)*BcbdUKUK(-1) + RUS(-1)*BcbsUKUS(-1)*XRUS') # 12.11 : UK central bank profits
model.add('FcbUS = RUS(-1)*BcbdUSUS(-1)') # 12.12 : US central bank profits
model.add('BsUK = BsUK(-1) + GUK + RUK(-1)*BsUK(-1) - TUK - FcbUK') # 12.13 : UK Govt budget constraint
model.add('BsUS = BsUS(-1) + GUS + RUS(-1)*BsUS(-1) - TUS - FcbUS') # 12.14 : US Govt budget constraint
我想我也许能够将数组中的索引与每个变量关联起来,但我不知道该怎么做。 或者,我认为我可以编写一行来选择与索引相对应的国家/地区名称,以便进行图表和文件输出。这是显示国家名称及其针对每个国家的贸易或国民生产总值的图的数据。 我正在寻找的是易于维护以添加国家/地区和更改参数,以及总体上最小的 LOC。
您可以使用 f 字符串按照以下方式编写它(我在这里使用
print
而不是 model.add
):
from itertools import product
countries = ['UK', 'US', 'DE']
# Example for equation with one country:
for c in countries:
print(f'V{c} - V{c}(-1) = YDr{c} - CONS{c}')
# Example for equation with two countries:
for c1, c2 in product(countries, repeat=2):
if c1 == c2:
continue
print(f'YDhs{c1} = YDr{c1} + d(XR{c2})*Bs{c1}{c2}(-1)')
输出:
VUK - VUK(-1) = YDrUK - CONSUK
VUS - VUS(-1) = YDrUS - CONSUS
VDE - VDE(-1) = YDrDE - CONSDE
YDhsUK = YDrUK + d(XRUS)*BsUKUS(-1)
YDhsUK = YDrUK + d(XRDE)*BsUKDE(-1)
YDhsUS = YDrUS + d(XRUK)*BsUSUK(-1)
YDhsUS = YDrUS + d(XRDE)*BsUSDE(-1)
YDhsDE = YDrDE + d(XRUK)*BsDEUK(-1)
YDhsDE = YDrDE + d(XRUS)*BsDEUS(-1)