Exemple #1
0
def run_ccc_with_baseline_delta(base_params, reform_params, data=None):
    """
    Runner script that kicks off the calculations for Cost-of-Capital-Calculator

    Args:
        test_run: boolean, True if test run (doesn't use puf.csv)
        start_year: interger, tax year METRs computed for
        user_params: dictionary, user defined parametesr for Cost-of-Capital-Calculator

    Returns:
        ModelDiffs: tuple, contains 6 dataframes for output by asset and
                    industry for baseline, refor, and difference

    """
    base_output_by_asset, base_output_by_industry = \
        run_ccc(base_params, True, data=data)
    asset_row_grouping = {}
    subset = zip(*(getattr(base_output_by_asset, at)
                   for at in ('Asset', 'asset_category', 'mettr_c',
                              'mettr_nc')))
    for asset, cat, mettr_c, mettr_nc in subset:
        if cat != cat:  # A string column that may have NaN, so can't do isnan
            cat = asset  # These are some summary rows that don't have all info
        asset, cat = map(replace_unicode_spaces, (asset, cat))
        asset_row_grouping[cat] = asset_row_grouping[asset] =\
            {'major_grouping': cat, 'summary_c': mettr_c,
             'summary_nc': mettr_nc, }
    industry_row_grouping = {}
    subset = zip(*(getattr(base_output_by_industry, at)
                   for at in ('Industry', 'major_industry', 'mettr_c',
                              'mettr_nc')))
    for industry, cat, mettr_c, mettr_nc in subset:
        industry, cat = map(replace_unicode_spaces, (industry, cat))
        industry_row_grouping[cat] = industry_row_grouping[industry] =\
            {'major_grouping': cat, 'summary_c': mettr_c,
             'summary_nc': mettr_nc, }
    row_grouping = {
        'asset': asset_row_grouping,
        'industry': industry_row_grouping
    }
    reform_output_by_asset, reform_output_by_industry =\
        run_ccc(reform_params, False, data=data)
    changed_output_by_asset =\
        diff_two_tables(reform_output_by_asset, base_output_by_asset)
    changed_output_by_industry =\
        diff_two_tables(reform_output_by_industry, base_output_by_industry)

    # save output to csv - useful if run locally
    base_output_by_industry.to_csv('baseline_byindustry.csv', encoding='utf-8')
    reform_output_by_industry.to_csv('reform_byindustry.csv', encoding='utf-8')
    base_output_by_asset.to_csv('baseline_byasset.csv', encoding='utf-8')
    reform_output_by_asset.to_csv('reform_byasset.csv', encoding='utf-8')
    changed_output_by_industry.to_csv('changed_byindustry.csv',
                                      encoding='utf-8')
    changed_output_by_asset.to_csv('changed_byasset.csv', encoding='utf-8')

    return ModelDiffs(base_output_by_asset, reform_output_by_asset,
                      changed_output_by_asset, base_output_by_industry,
                      reform_output_by_industry, changed_output_by_industry,
                      row_grouping)
def test_diff_two_tables():
    '''
    Test of the diff_two_tables() function
    '''
    dict1 = {'var1': [1, 2, 3, 4, 5], 'var2': [2, 4, 6, 8, 10]}
    dict2 = {'var1': [1, 2, 3, 4, 5], 'var2': [2, 4, 6, 8, 10]}
    df1 = pd.DataFrame.from_dict(dict1)
    df2 = pd.DataFrame.from_dict(dict2)
    expected_dict = {'var1': [0, 0, 0, 0, 0], 'var2': [0, 0, 0, 0, 0]}
    expected_df = pd.DataFrame.from_dict(expected_dict)
    test_df = utils.diff_two_tables(df1, df2)
    pd.testing.assert_frame_equal(test_df, expected_df)
# specify baseline and reform Calculator objects for 2019 calculations
assets = Assets()
baseline_parameters = Specification(year=cyr)
calc1 = Calculator(baseline_parameters, assets)
reform_parameters = Specification(year=cyr)
reform_parameters.update_specification(business_tax_reform)
calc2 = Calculator(reform_parameters, assets)

# do calculations by asset and by industry
baseln_assets_df = calc1.calc_by_asset()
reform_assets_df = calc2.calc_by_asset()
baseln_industry_df = calc1.calc_by_industry()
reform_industry_df = calc2.calc_by_industry()

# generate dataframes with reform-minus-baseline differences
diff_assets_df = diff_two_tables(reform_assets_df, baseln_assets_df)
diff_industry_df = diff_two_tables(reform_industry_df, baseln_industry_df)

# save dataframes to disk as csv files in this directory
baseln_industry_df.to_csv('baseline_byindustry.csv', float_format='%.5f')
reform_industry_df.to_csv('reform_byindustry.csv', float_format='%.5f')
baseln_assets_df.to_csv('baseline_byasset.csv', float_format='%.5f')
reform_assets_df.to_csv('reform_byasset.csv', float_format='%.5f')
diff_industry_df.to_csv('changed_byindustry.csv', float_format='%.5f')
diff_assets_df.to_csv('changed_byasset.csv', float_format='%.5f')

# create and show in browser a range plot
p = calc1.range_plot(calc2)
show(p)
    def summary_table(self, calc, output_variable='mettr',
                      include_land=True, include_inventories=True,
                      output_type='csv', path=''):
        '''
        Create table summarizing the output_variable under the baseline
        and reform policies.

        Parameters
        ----------
        calc : Calculator object
            calc represents the reform while self represents the baseline
        output_variable : string
            specifies which output variable to summarize in the table
        include_land : boolean
            specifies whether to include land in overall calculations
        include_inventories : boolean
            specifies whether to include inventories in overall calculations
        output_type : string
            specifies the type of file to save table to:
                - 'csv'
                - 'tex'
                - 'excel'
                - 'json'
        path : string
            specifies path to save file with table to
        Returns
        -------
        table saved to disk
        '''
        var_dict = {'mettr': 'Marginal Effective Total Tax Rate',
                    'metr': 'Marginal Effective Tax Rate',
                    'rho': 'Cost of Capital',
                    'ucc': 'User Cost of Capital',
                    'tax_wedge': 'Tax Wedge',
                    'z': 'NPV of Depreciation Deductions'}
        self.calc_base()
        calc.calc_base()
        base_df = self.__assets.df
        reform_df = calc.__assets.df
        dfs = [base_df, reform_df]
        dfs_out = []
        for df in dfs:
            if not include_land:
                df = df.drop(df[df.asset_name == 'Land'].index,
                             inplace=True)
            if not include_inventories:
                df = df.drop(df[df.asset_name == 'Inventories'].index,
                             inplace=True)
            # Compute overall separately by tax treatment
            treat_df = pd.DataFrame(df.groupby(
                ['tax_treat']).apply(self.__f)).reset_index()
            treat_df = self.calc_other(treat_df)
            # Compute overall values, across corp and non-corp
            # just making up a column with same value in all rows so can
            # continute to use groupby
            df['include'] = 1
            all_df = pd.DataFrame.from_dict(
                df.groupby(['include']).apply(self.__f).to_dict())
            # set tax_treat to corporate b/c only corp and non-corp
            # recognized in calc_other()
            all_df['tax_treat'] = 'corporate'
            all_df = self.calc_other(all_df)
            all_df['tax_treat'] = 'all'
            # Put df's together
            dfs_out.append(pd.concat([treat_df, all_df],
                                     ignore_index=True, copy=True,
                                     sort=True).reset_index())
        base_tab = dfs_out[0]
        reform_tab = dfs_out[1]
        # print('reform table = ', reform_tab)
        diff_tab = diff_two_tables(base_tab, reform_tab)
        table_dict = {
            '': ['Overall', 'Corporations', '   Equity Financed',
                 '   Debt Financed', 'Pass-Through Entities',
                 '   Equity Financed', '   Debt Financed'],
            var_dict[output_variable]: [
                reform_tab[
                    reform_tab['tax_treat'] ==
                    'all'][output_variable + '_mix'].values[0],
                reform_tab[
                    reform_tab['tax_treat'] ==
                    'corporate'][output_variable + '_mix'].values[0],
                reform_tab[
                    reform_tab['tax_treat'] ==
                    'corporate'][output_variable + '_e'].values[0],
                reform_tab[
                    reform_tab['tax_treat'] ==
                    'corporate'][output_variable + '_d'].values[0],
                reform_tab[
                    reform_tab['tax_treat'] ==
                    'non-corporate'][output_variable + '_mix'].values[0],
                reform_tab[
                    reform_tab['tax_treat'] ==
                    'non-corporate'][output_variable + '_e'].values[0],
                reform_tab[
                    reform_tab['tax_treat'] ==
                    'non-corporate'][output_variable + '_d'].values[0]],
            'Change from Baseline (pp)': [
                diff_tab[
                    diff_tab['tax_treat'] ==
                    'all'][output_variable + '_mix'].values[0],
                diff_tab[
                    diff_tab['tax_treat'] ==
                    'corporate'][output_variable + '_mix'].values[0],
                diff_tab[
                    diff_tab['tax_treat'] ==
                    'corporate'][output_variable + '_e'].values[0],
                diff_tab[
                    diff_tab['tax_treat'] ==
                    'corporate'][output_variable + '_d'].values[0],
                diff_tab[
                    diff_tab['tax_treat'] ==
                    'non-corporate'][output_variable + '_mix'].values[0],
                diff_tab[
                    diff_tab['tax_treat'] ==
                    'non-corporate'][output_variable + '_e'].values[0],
                diff_tab[
                    diff_tab['tax_treat'] ==
                    'non-corporate'][output_variable + '_d'].values[0]]}
        # Make df with dict so can use pandas functions
        table_df = pd.DataFrame.from_dict(table_dict, orient='columns')
        if output_type == 'tex':
            table_df.to_latex(buf=path, index=False, na_rep='',
                              float_format=lambda x: '%.2f' % x)
        elif output_type == 'csv':
            table_df.to_csv(path_or_buf=path, index=False, na_rep='',
                            float_format="%.2f")
        elif output_type == 'json':
            table_df.to_json(path_or_buf=path, double_precision=2)
        elif output_type == 'excel':
            table_df.to_excel(excel_writer=path, index=False, na_rep='',
                              float_format="%.2f")
        else:
            print('Please enter a valid output format')
            assert(False)