def generate_policy_revenues(): from taxcalc.growfactors import GrowFactors from taxcalc.policy import Policy from taxcalc.records import Records from taxcalc.gstrecords import GSTRecords from taxcalc.corprecords import CorpRecords from taxcalc.parameters import ParametersBase from taxcalc.calculator import Calculator """ for num in range(1, num_reforms): block_selected_dict[num]['selected_item']= block_widget_dict[num][1].get() block_selected_dict[num]['selected_value']= block_widget_dict[num][3].get() block_selected_dict[num]['selected_year']= block_widget_dict[num][2].get() print(block_selected_dict) """ f = open('reform.json') block_selected_dict = json.load(f) print("block_selected_dict from json",block_selected_dict) #print(block_selected_dict) # create Records object containing pit.csv and pit_weights.csv input data #print("growfactors filename ", growfactors_filename) #recs = Records(data=data_filename, weights=weights_filename, gfactors=GrowFactors(growfactors_filename=growfactors_filename)) #recs = Records(data=data_filename, weights=weights_filename, gfactors=GrowFactors(growfactors_filename=growfactors_filename)) #recs.increment_year1(3.0) #grecs = GSTRecords() f = open('global_vars.json') vars = json.load(f) print("data_filename: ", vars['cit_data_filename']) print("weights_filename: ", vars['cit_weights_filename']) print("growfactors_filename: ", vars['GROWFACTORS_FILENAME']) print("policy_filename: ", vars['DEFAULTS_FILENAME']) # create CorpRecords object using cross-section data #crecs1 = CorpRecords(data='cit_cross.csv', weights='cit_cross_wgts1.csv') crecs1 = CorpRecords(data=vars['cit_data_filename'], weights=vars['cit_weights_filename'], gfactors=GrowFactors(growfactors_filename=vars['GROWFACTORS_FILENAME'])) #crecs1 = CorpRecords(data=vars['cit_weights_filename'], weights=vars['cit_weights_filename']) # Note: weights argument is optional assert isinstance(crecs1, CorpRecords) assert crecs1.current_year == 2017 # create Policy object containing current-law policy pol = Policy(DEFAULTS_FILENAME=vars['DEFAULTS_FILENAME']) # specify Calculator objects for current-law policy #calc1 = Calculator(policy=pol, records=recs, corprecords=crecs1, # gstrecords=grecs, verbose=False) calc1 = Calculator(policy=pol, corprecords=crecs1, verbose=False) #calc1.increment_year1(3.8) assert isinstance(calc1, Calculator) assert calc1.current_year == 2017 np.seterr(divide='ignore', invalid='ignore') pol2 = Policy(DEFAULTS_FILENAME=vars['DEFAULTS_FILENAME']) years, reform=read_reform_dict(block_selected_dict) print("reform dictionary: ",reform) #reform = Calculator.read_json_param_objects('app01_reform.json', None) pol2.implement_reform(reform['policy']) #calc2 = Calculator(policy=pol2, records=recs, corprecords=crecs1, # gstrecords=grecs, verbose=False) calc2 = Calculator(policy=pol2, corprecords=crecs1, verbose=False) pit_adjustment_factor={} revenue_dict_cit={} revenue_amount_dict = {} calc1.calc_all() for year in range(2019, 2024): cols = [] calc1.advance_to_year(year) calc2.advance_to_year(year) # NOTE: calc1 now contains a PRIVATE COPY of pol and a PRIVATE COPY of recs, # so we can continue to use pol and recs in this script without any # concern about side effects from Calculator method calls on calc1. # Produce DataFrame of results using the calculator # First run the calculator for the corporate income tax calc1.calc_all() print("***** Year ", year) weighted_citax1 = calc1.weighted_total_cit('citax') citax_collection_billions1 = weighted_citax1/10**9 citax_collection_str1 = '{0:.2f}'.format(citax_collection_billions1) print("The CIT Collection in billions is: ", citax_collection_billions1) # Produce DataFrame of results using cross-section calc2.calc_all() weighted_citax2 = calc2.weighted_total_cit('citax') citax_collection_billions2 = weighted_citax2/10**9 citax_collection_str2 = '{0:.2f}'.format(citax_collection_billions2) # This is the difference in the collection due to the reform # This amount will now be allocated to dividends of PIT citax_diff_collection_billions2 = (citax_collection_billions2-citax_collection_billions1) citax_diff_collection_str2 = '{0:.2f}'.format(citax_diff_collection_billions2) print("The CIT Collection after reform billions is: ", citax_collection_billions2) print("The difference in CIT Collection in billions is: ", citax_diff_collection_billions2) # Process of allocation of difference in CIT profits to PIT # in the form of Dividends # Dividends in this case is reported as Income from Other Sources # TOTAL_INCOME_OS in the PIT form # First get the unadjusted amounts # Now calculate the adjusted amounts # contribution to PIT Dividends proportion_change_dividend = (weighted_citax1 - weighted_citax2)/weighted_citax1 new_dividend_proportion_of_old = (1 + proportion_change_dividend) pit_adjustment_factor[year]=new_dividend_proportion_of_old # Store Results revenue_dict_cit[year]={} revenue_dict_cit[year]['current_law']=citax_collection_str1 revenue_dict_cit[year]['reform']=citax_collection_str2 revenue_dict_cit[year]['difference']=citax_diff_collection_str2 print(revenue_dict_cit) print("new_dividend_proportion_of_old ", pit_adjustment_factor) # now update pit.csv with this proportion # start a new round of simulation for pit recs = Records(data=vars['pit_data_filename'], weights=vars['pit_weights_filename'], gfactors=GrowFactors(growfactors_filename=vars['GROWFACTORS_FILENAME'])) # create Policy object containing current-law policy pol = Policy(DEFAULTS_FILENAME=vars['DEFAULTS_FILENAME']) # specify Calculator objects for current-law policy #calc1 = Calculator(policy=pol, records=recs, corprecords=crecs1, # gstrecords=grecs, verbose=False) calc1 = Calculator(policy=pol, records=recs, verbose=False) #calc1.increment_year1(3.8) assert isinstance(calc1, Calculator) assert calc1.current_year == 2017 np.seterr(divide='ignore', invalid='ignore') pol2 = Policy(DEFAULTS_FILENAME=vars['DEFAULTS_FILENAME']) #years, reform=read_reform_dict(block_selected_dict) #print("reform dictionary: ", reform) #reform = Calculator.read_json_param_objects('app01_reform.json', None) pol2.implement_reform(reform['policy']) #calc2 = Calculator(policy=pol2, records=recs, corprecords=crecs1, # gstrecords=grecs, verbose=False) calc2 = Calculator(policy=pol2, records=recs, verbose=False) total_revenue_text={} reform_revenue_text={} revenue_dict_pit={} revenue_amount_dict = {} num = 1 first_time = True i=1 j=0 #rows = [] window = tk.Toplevel() window.geometry("800x400+140+140") display_table(window, revenue_dict_cit, revenue_dict_pit, header=True) #for year in range(years[0], years[-1]+1): for year in range(2019, 2024): cols = [] calc1.advance_to_year(year) calc2.advance_to_year(year) # NOTE: calc1 now contains a PRIVATE COPY of pol and a PRIVATE COPY of recs, # so we can continue to use pol and recs in this script without any # concern about side effects from Calculator method calls on calc1. # Produce DataFrame of results using the calculator # First run the calculator for the corporate income tax calc1.calc_all() weighted_pitax1 = calc1.weighted_total_pit('pitax') pitax_collection_billions1 = weighted_pitax1/10**9 pitax_collection_str1 = '{0:.2f}'.format(pitax_collection_billions1) print('\n\n\n') print(f'TAX COLLECTION FOR THE YEAR - {year} \n') print("The PIT Collection in billions is: ", pitax_collection_billions1) #total_revenue_text[year] = "PIT COLLECTION UNDER CURRENT LAW FOR THE YEAR - " + str(year)+" : "+str(pitax_collection_str1)+" bill" # Produce DataFrame of results using cross-section calc2.calc_all() weighted_pitax2 = calc2.weighted_total_pit('pitax') pitax_collection_billions2 = weighted_pitax2/10**9 pitax_collection_str2 = '{0:.2f}'.format(pitax_collection_billions2) pitax_diff_collection_billions2 = (pitax_collection_billions2-pitax_collection_billions1) pitax_diff_collection_str2 = '{0:.2f}'.format(pitax_diff_collection_billions2) # Now calculate the adjusted amounts # contribution to PIT Dividends print("Total Income from Other Sources (bill) no adjustment is ", calc2.weighted_total_pit('TOTAL_INCOME_OS')/10**9 ) calc2.adjust_pit(pit_adjustment_factor[year]) print("Total Income from Other Sources (bill) after adjustment is ", calc2.weighted_total_pit('TOTAL_INCOME_OS')/10**9 ) calc2.calc_all() weighted_pitax3 = calc2.weighted_total_pit('pitax') pitax_collection_billions3 = weighted_pitax3/10**9 pitax_collection_str3 = '{0:.2f}'.format(pitax_collection_billions3) pitax_diff_collection_billions3 = (pitax_collection_billions3-pitax_collection_billions1) pitax_diff_collection_str3 = '{0:.2f}'.format(pitax_diff_collection_billions3) pitax_diff_collection_billions4 = (pitax_collection_billions3-pitax_collection_billions2) pitax_diff_collection_str4 = '{0:.2f}'.format(pitax_diff_collection_billions4) #save the results revenue_dict_pit[year]={} revenue_dict_pit[year]['current_law']=pitax_collection_str1 revenue_dict_pit[year]['reform']={} revenue_dict_pit[year]['reform']['unadjusted']=pitax_collection_str2 revenue_dict_pit[year]['reform']['adjusted']=pitax_collection_str3 revenue_dict_pit[year]['difference']=pitax_diff_collection_str3 print('\n\n\n') print(f'TAX COLLECTION FOR THE YEAR UNDER REFORM - {year} \n') print("The PIT Collection in billions is: ", pitax_collection_billions2) print("The difference in PIT Collection in billions is: ", pitax_diff_collection_billions2) print('****AFTER ADJUSTMENT \n\n\n') print('TAX COLLECTION FOR THE YEAR UNDER REFORM WITH ADJUSTMENT \n') print("The PIT Collection in billions after adjusting for the impact of CIT is: ", pitax_collection_billions3) print("The difference in PIT Collection in billions after adjusting for the impact of CIT is: ", pitax_diff_collection_billions3) print("The impact of adjustment is: ", pitax_diff_collection_billions4) display_table(window, revenue_dict_cit, revenue_dict_pit, year=year, row=i) i=i+1 #reverse the adjustment to obtain baseline calc2.adjust_pit(1/pit_adjustment_factor[year]) display_table(window, revenue_dict_cit, revenue_dict_pit, footer=i) """
def generate_revenues(): from taxcalc.growfactors import GrowFactors from taxcalc.policy import Policy from taxcalc.records import Records from taxcalc.gstrecords import GSTRecords from taxcalc.corprecords import CorpRecords from taxcalc.parameters import ParametersBase from taxcalc.calculator import Calculator """ for num in range(1, num_reforms): block_selected_dict[num]['selected_item']= block_widget_dict[num][1].get() block_selected_dict[num]['selected_value']= block_widget_dict[num][3].get() block_selected_dict[num]['selected_year']= block_widget_dict[num][2].get() print(block_selected_dict) """ f = open('reform.json') block_selected_dict = json.load(f) print("block_selected_dict from json", block_selected_dict) #print(block_selected_dict) # create Records object containing pit.csv and pit_weights.csv input data #print("growfactors filename ", growfactors_filename) #recs = Records(data=data_filename, weights=weights_filename, gfactors=GrowFactors(growfactors_filename=growfactors_filename)) #recs = Records(data=data_filename, weights=weights_filename, gfactors=GrowFactors(growfactors_filename=growfactors_filename)) #recs.increment_year1(3.0) #grecs = GSTRecords() f = open('global_vars.json') vars = json.load(f) print("data_filename: ", vars['cit_data_filename']) print("weights_filename: ", vars['cit_weights_filename']) print("growfactors_filename: ", vars['GROWFACTORS_FILENAME']) print("policy_filename: ", vars['DEFAULTS_FILENAME']) # create CorpRecords object using cross-section data #crecs1 = CorpRecords(data='cit_cross.csv', weights='cit_cross_wgts1.csv') crecs1 = CorpRecords( data=vars['cit_data_filename'], weights=vars['cit_weights_filename'], gfactors=GrowFactors( growfactors_filename=vars['GROWFACTORS_FILENAME'])) #crecs1 = CorpRecords(data=vars['cit_weights_filename'], weights=vars['cit_weights_filename']) # Note: weights argument is optional assert isinstance(crecs1, CorpRecords) assert crecs1.current_year == 2017 # create Policy object containing current-law policy pol = Policy(DEFAULTS_FILENAME=vars['DEFAULTS_FILENAME']) # specify Calculator objects for current-law policy #calc1 = Calculator(policy=pol, records=recs, corprecords=crecs1, # gstrecords=grecs, verbose=False) calc1 = Calculator(policy=pol, corprecords=crecs1, verbose=False) #calc1.increment_year1(3.8) assert isinstance(calc1, Calculator) assert calc1.current_year == 2017 np.seterr(divide='ignore', invalid='ignore') calc1.calc_all() revenue_dict_cit = {} for year in range(2019, 2024): cols = [] calc1.advance_to_year(year) # NOTE: calc1 now contains a PRIVATE COPY of pol and a PRIVATE COPY of recs, # so we can continue to use pol and recs in this script without any # concern about side effects from Calculator method calls on calc1. # Produce DataFrame of results using the calculator # First run the calculator for the corporate income tax calc1.calc_all() print("***** Year ", year) weighted_citax1 = calc1.weighted_total_cit('citax') citax_collection_billions1 = weighted_citax1 / 10**9 citax_collection_str1 = '{0:.2f}'.format(citax_collection_billions1) print("The CIT Collection in billions is: ", citax_collection_billions1) # Store Results revenue_dict_cit[year] = {} revenue_dict_cit[year]['current_law'] = citax_collection_str1 # start a new round of simulation for pit recs = Records(data=vars['pit_data_filename'], weights=vars['pit_weights_filename'], gfactors=GrowFactors( growfactors_filename=vars['GROWFACTORS_FILENAME'])) # create Policy object containing current-law policy pol = Policy(DEFAULTS_FILENAME=vars['DEFAULTS_FILENAME']) # specify Calculator objects for current-law policy #calc1 = Calculator(policy=pol, records=recs, corprecords=crecs1, # gstrecords=grecs, verbose=False) calc1 = Calculator(policy=pol, records=recs, verbose=False) #calc1.increment_year1(3.8) assert isinstance(calc1, Calculator) assert calc1.current_year == 2017 np.seterr(divide='ignore', invalid='ignore') total_revenue_text = {} reform_revenue_text = {} revenue_dict_pit = {} revenue_amount_dict = {} num = 1 first_time = True i = 1 j = 0 #rows = [] window = tk.Toplevel() window.geometry("800x400+140+140") display_table(window, revenue_dict_cit, revenue_dict_pit, header=True) #for year in range(years[0], years[-1]+1): for year in range(2019, 2024): cols = [] calc1.advance_to_year(year) # NOTE: calc1 now contains a PRIVATE COPY of pol and a PRIVATE COPY of recs, # so we can continue to use pol and recs in this script without any # concern about side effects from Calculator method calls on calc1. # Produce DataFrame of results using the calculator # First run the calculator for the corporate income tax calc1.calc_all() weighted_pitax1 = calc1.weighted_total_pit('pitax') pitax_collection_billions1 = weighted_pitax1 / 10**9 pitax_collection_str1 = '{0:.2f}'.format(pitax_collection_billions1) print('\n\n\n') print(f'TAX COLLECTION FOR THE YEAR - {year} \n') print("The PIT Collection in billions is: ", pitax_collection_billions1) #total_revenue_text[year] = "PIT COLLECTION UNDER CURRENT LAW FOR THE YEAR - " + str(year)+" : "+str(pitax_collection_str1)+" bill" #save the results revenue_dict_pit[year] = {} revenue_dict_pit[year]['current_law'] = pitax_collection_str1 display_table(window, revenue_dict_cit, revenue_dict_pit, year=year, row=i) i = i + 1 display_table(window, revenue_dict_cit, revenue_dict_pit, footer=i) """