diff --git a/MANIFEST.in b/MANIFEST.in index e74b337ce..0ed740b96 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -7,5 +7,3 @@ include taxcalc/policy_current_law.json include taxcalc/puf_weights.csv.gz include taxcalc/puf_ratios.csv include taxcalc/records_variables.json -include taxcalc/tmd_weights.csv.gz -include taxcalc/tmd_growfactors.csv diff --git a/Makefile b/Makefile index dcf83aeb9..778d70226 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ help: @echo "clean : remove .pyc files and local taxcalc package" @echo "package : build and install local package" @echo "pytest-cps : generate report for and cleanup after" - @echo " pytest -m 'not requires_pufcsv and not requires_tmdcsv and not pre_release'" + @echo " pytest -m 'not requires_pufcsv and not pre_release'" @echo "pytest : generate report for and cleanup after" @echo " pytest -m 'not pre_release'" @echo "pytest-all : generate report for and cleanup after" @@ -51,7 +51,7 @@ endef .PHONY=pytest-cps pytest-cps: @$(pytest-setup) - @cd taxcalc ; pytest -n4 --disable-warnings --durations=0 --durations-min=2 -m "not requires_pufcsv and not requires_tmdcsv and not pre_release" + @cd taxcalc ; pytest -n4 --disable-warnings --durations=0 --durations-min=2 -m "not requires_pufcsv and not pre_release" @$(pytest-cleanup) .PHONY=pytest @@ -103,7 +103,7 @@ define coverage-cleanup rm -f .coverage htmlcov/* endef -COVMARK = "not requires_pufcsv and not requires_tmdcsv and not pre_release" +COVMARK = "not requires_pufcsv and not pre_release" OS := $(shell uname -s) diff --git a/docs/usage/data.md b/docs/usage/data.md index b55e19239..13d387f33 100644 --- a/docs/usage/data.md +++ b/docs/usage/data.md @@ -61,13 +61,16 @@ file. The [tax-microdata repository](https://github.com/PSLmodels/tax-microdata-benchmarking) -produces an input variables file (`tmd.csv`) and a -`tmd_weights.csv.gz` file that is included in the Tax-Calculator +produces an input variables file (`tmd.csv`), a national weights file +(`tmd_weights.csv.gz`), and a variable growth factors file +(`tmd_growfactors.csv`) that can be used with the Tax-Calculator package beginning with the 3.6.0 release. The `tmd.csv` file is available only to Tax-Calculator users who have purchased their own -version of the 2015 IRS-SOI PUF. For those users, the -`Records.tmd_constructor()` method creates a `Records` class object -containing the `tmd` variables and weights. +version of the 2015 IRS-SOI PUF. For those users, those three files +are avaiable from the tax-microdata repository. These three tmd files +can be used with the Tax-Calculator Python API (using the +`Records.tmd_constructor()` static method) or with the Tax-Calculator +CLI tool, `tc`. ## Using other data with Tax-Calculator diff --git a/pytest.ini b/pytest.ini index f40bfdba7..c67875214 100644 --- a/pytest.ini +++ b/pytest.ini @@ -3,7 +3,6 @@ testpaths = taxcalc markers = requires_pufcsv - requires_tmdcsv pre_release compatible_data local diff --git a/taxcalc.egg-info/SOURCES.txt b/taxcalc.egg-info/SOURCES.txt index 1d6021c0a..c9bf6fd20 100644 --- a/taxcalc.egg-info/SOURCES.txt +++ b/taxcalc.egg-info/SOURCES.txt @@ -121,8 +121,6 @@ taxcalc/puf_weights.csv.gz taxcalc/records.py taxcalc/records_variables.json taxcalc/taxcalcio.py -taxcalc/tmd_growfactors.csv -taxcalc/tmd_weights.csv.gz taxcalc/utils.py taxcalc/utilsprvt.py taxcalc.egg-info/PKG-INFO @@ -214,7 +212,6 @@ taxcalc/tests/test_records.py taxcalc/tests/test_reforms.py taxcalc/tests/test_responses.py taxcalc/tests/test_taxcalcio.py -taxcalc/tests/test_tmdcsv.py taxcalc/tests/test_utils.py taxcalc/validation/CSV_INPUT_VARS.md taxcalc/validation/CSV_OUTPUT_VARS.md diff --git a/taxcalc/records.py b/taxcalc/records.py index a5e942561..7b5a9936a 100644 --- a/taxcalc/records.py +++ b/taxcalc/records.py @@ -6,6 +6,7 @@ # pylint --disable=locally-disabled records.py import os +from pathlib import Path import numpy as np import pandas as pd from taxcalc.data import Data @@ -116,9 +117,6 @@ class instance: Records PUF_RATIOS_FILENAME = 'puf_ratios.csv' CPS_WEIGHTS_FILENAME = 'cps_weights.csv.gz' CPS_RATIOS_FILENAME = None - TMD_WEIGHTS_FILENAME = 'tmd_weights.csv.gz' - TMD_GROWFACTORS_FILENAME = 'tmd_growfactors.csv' - TMD_RATIOS_FILENAME = None CODE_PATH = os.path.abspath(os.path.dirname(__file__)) VARINFO_FILE_NAME = 'records_variables.json' VARINFO_FILE_PATH = CODE_PATH @@ -226,9 +224,12 @@ def cps_constructor(data=None, exact_calculations=exact_calculations) @staticmethod - def tmd_constructor(data, # path to tmd.csv file or dataframe - gfactors=GrowFactors(TMD_GROWFACTORS_FILENAME), - exact_calculations=False): # pragma: no cover + def tmd_constructor( + data_path: Path, + weights_path: Path, + growfactors_path: Path, + exact_calculations=False + ): # pragma: no cover """ Static method returns a Records object instantiated with TMD input data. This works in a analogous way to Records(), which @@ -239,14 +240,18 @@ def tmd_constructor(data, # path to tmd.csv file or dataframe eliminate the need to specify all the details of the PUF input data. """ - weights = os.path.join(Records.CODE_PATH, Records.TMD_WEIGHTS_FILENAME) - return Records(data=data, - start_year=Records.TMDCSV_YEAR, - gfactors=gfactors, - weights=weights, - adjust_ratios=Records.TMD_RATIOS_FILENAME, - exact_calculations=exact_calculations) - + assert isinstance(data_path, Path) + assert isinstance(weights_path, Path) + assert isinstance(growfactors_path, Path) + return Records( + data=pd.read_csv(data_path), + start_year=Records.TMDCSV_YEAR, + weights=str(weights_path), + gfactors=GrowFactors(growfactors_filename=str(growfactors_path)), + adjust_ratios=None, + exact_calculations=exact_calculations, + ) + def increment_year(self): """ Add one to current year, and also does @@ -277,7 +282,7 @@ def _extrapolate(self, year): """ # pylint: disable=too-many-statements,no-member # put values in local dictionary - gfv = dict() + gfv = {} for name in GrowFactors.VALID_NAMES: gfv[name] = self.gfactors.factor_value(name, year) # apply values to Records variables diff --git a/taxcalc/taxcalcio.py b/taxcalc/taxcalcio.py index 5296de83c..9bd7f7d51 100644 --- a/taxcalc/taxcalcio.py +++ b/taxcalc/taxcalcio.py @@ -74,6 +74,8 @@ def __init__(self, input_data, tax_year, baseline, reform, assump, self.puf_input_data = False self.cps_input_data = False self.tmd_input_data = False + self.tmd_weights = None + self.tmd_gfactor = None if isinstance(input_data, str): # remove any leading directory path from INPUT filename fname = os.path.basename(input_data) @@ -90,6 +92,23 @@ def __init__(self, input_data, tax_year, baseline, reform, assump, if not self.cps_input_data and not os.path.isfile(input_data): msg = 'INPUT file could not be found' self.errmsg += 'ERROR: {}\n'.format(msg) + # if tmd_input_data is True, construct weights and gfactor paths + if self.tmd_input_data: # pragma: no cover + tmd_dir = os.path.dirname(input_data) + if 'TMD_AREA' in os.environ: + area = os.environ['TMD_AREA'] + wfile = f'{area}_tmd_weights.csv.gz' + inp = f'{fname[:-4]}_{area}-{str(tax_year)[2:]}' + else: # using national weights + wfile = 'tmd_weights.csv.gz' + self.tmd_weights = os.path.join(tmd_dir, wfile) + self.tmd_gfactor = os.path.join(tmd_dir, 'tmd_growfactors.csv') + if not os.path.isfile(self.tmd_weights): + msg = f'weights file {self.tmd_weights} could not be found' + self.errmsg += 'ERROR: {}\n'.format(msg) + if not os.path.isfile(self.tmd_gfactor): + msg = f'gfactor file {self.tmd_gfactor} could not be found' + self.errmsg += 'ERROR: {}\n'.format(msg) elif isinstance(input_data, pd.DataFrame): inp = 'df-{}'.format(str(tax_year)[2:]) else: @@ -123,7 +142,7 @@ def __init__(self, input_data, tax_year, baseline, reform, assump, elif isinstance(reform, str): self.specified_reform = True # split any compound reform into list of simple reforms - refnames = list() + refnames = [] reforms = reform.split('+') for rfm in reforms: # remove any leading directory path from rfm filename @@ -206,7 +225,7 @@ def __init__(self, input_data, tax_year, baseline, reform, assump, self.calc = None self.calc_base = None self.param_dict = None - self.policy_dicts = list() + self.policy_dicts = [] def init(self, input_data, tax_year, baseline, reform, assump, aging_input_data, exact_calculations): @@ -234,7 +253,7 @@ def init(self, input_data, tax_year, baseline, reform, assump, # get assumption sub-dictionaries paramdict = Calculator.read_json_param_objects(None, assump) # get policy parameter dictionaries from --reform file(s) - policydicts = list() + policydicts = [] if self.specified_reform: reforms = reform.split('+') for ref in reforms: @@ -252,9 +271,7 @@ def init(self, input_data, tax_year, baseline, reform, assump, self.errmsg += valerr_msg.__str__() # create GrowFactors base object that incorporates gdiff_baseline if self.tmd_input_data: - gfactors_base = GrowFactors( # pragma: no cover - Records.TMD_GROWFACTORS_FILENAME - ) + gfactors_base = GrowFactors(self.tmd_gfactor) # pragma: no cover else: gfactors_base = GrowFactors() gdiff_baseline.apply_to(gfactors_base) @@ -266,9 +283,7 @@ def init(self, input_data, tax_year, baseline, reform, assump, self.errmsg += valerr_msg.__str__() # create GrowFactors ref object that has all gdiff objects applied if self.tmd_input_data: - gfactors_ref = GrowFactors( # pragma: no cover - Records.TMD_GROWFACTORS_FILENAME - ) + gfactors_ref = GrowFactors(self.tmd_gfactor) # pragma: no cover else: gfactors_ref = GrowFactors() gdiff_baseline.apply_to(gfactors_ref) @@ -333,14 +348,20 @@ def init(self, input_data, tax_year, baseline, reform, assump, exact_calculations=exact_calculations ) elif self.tmd_input_data: - recs = Records.tmd_constructor( - data=input_data, + recs = Records( + data=pd.read_csv(input_data), + start_year=Records.TMDCSV_YEAR, + weights=self.tmd_weights, gfactors=gfactors_ref, + adjust_ratios=None, exact_calculations=exact_calculations ) # pragma: no cover - recs_base = Records.tmd_constructor( - data=input_data, + recs_base = Records( + data=pd.read_csv(input_data), + start_year=Records.TMDCSV_YEAR, + weights=self.tmd_weights, gfactors=gfactors_base, + adjust_ratios=None, exact_calculations=exact_calculations ) # pragma: no cover else: # if not {cps|tmd}_input_data but aging_input_data @@ -541,7 +562,7 @@ def write_doc_file(self): doc = Calculator.reform_documentation(self.param_dict, self.policy_dicts[1:]) doc_fname = self._output_filename.replace('.csv', '-doc.text') - with open(doc_fname, 'w') as dfile: + with open(doc_fname, 'w', encoding='utf-8') as dfile: dfile.write(doc) def write_sqldb_file(self, dump_varset, mtr_paytax, mtr_inctax, @@ -575,7 +596,7 @@ def write_tables_file(self): tab_fname = self._output_filename.replace('.csv', '-tab.text') # skip tables if there are not some positive weights if self.calc_base.total_weight() <= 0.: - with open(tab_fname, 'w') as tfile: + with open(tab_fname, 'w', encoding='utf-8') as tfile: msg = 'No tables because sum of weights is not positive\n' tfile.write(msg) return @@ -597,7 +618,7 @@ def write_tables_file(self): diff = nontax + change # using expanded_income under baseline policy diffdf = pd.DataFrame(data=np.column_stack(diff), columns=all_vars) # write each kind of distributional table - with open(tab_fname, 'w') as tfile: + with open(tab_fname, 'w', encoding='utf-8') as tfile: TaxCalcIO.write_decile_table(distdf, tfile, tkind='Reform Totals') tfile.write('\n') TaxCalcIO.write_decile_table(diffdf, tfile, tkind='Differences') @@ -730,7 +751,7 @@ def write_empty_graph_file(fname, title, reason): '{}\n' '{}\n' '\n').format(title, reason) - with open(fname, 'w') as gfile: + with open(fname, 'w', encoding='utf-8') as gfile: gfile.write(txt) def minimal_output(self): @@ -738,7 +759,7 @@ def minimal_output(self): Extract minimal output and return it as Pandas DataFrame. """ varlist = ['RECID', 'YEAR', 'WEIGHT', 'INCTAX', 'LSTAX', 'PAYTAX'] - odict = dict() + odict = {} scalc = self.calc odict['RECID'] = scalc.array('RECID') # id for tax filing unit odict['YEAR'] = self.tax_year() # tax calculation year diff --git a/taxcalc/tests/test_tmdcsv.py b/taxcalc/tests/test_tmdcsv.py deleted file mode 100644 index 6eb350f5c..000000000 --- a/taxcalc/tests/test_tmdcsv.py +++ /dev/null @@ -1,38 +0,0 @@ -""" -Tests of Tax-Calculator using tmd.csv input. - -Note that the tmd.csv file that is required to run this program has -been constructed in the PSLmodels tax-microdata repository using the -2015 IRS SOI PUF file and recent Census CPS data. If you have -acquired from IRS the 2015 SOI PUF file and want to execute this program, -contact the Tax-Calculator development team to discuss your options. - -Read Tax-Calculator/TESTING.md for details. -""" -# CODING-STYLE CHECKS: -# pycodestyle test_tmdcsv.py -# pylint --disable=locally-disabled test_tmdcsv.py - -import pytest -# pylint: disable=import-error -from taxcalc import Policy, Records, Calculator - - -@pytest.mark.requires_tmdcsv -def test_tmd_input(tmd_fullsample): - """ - Test Tax-Calculator using full-sample tmd.csv file. - """ - taxyear = 2022 - # create a Policy object with current-law policy parameters - pol = Policy() - # create a Records object containing all tmd.csv input records - recs = Records.tmd_constructor(data=tmd_fullsample) - # create a Calculator object using current-law policy and tmd records - calc = Calculator(policy=pol, records=recs) - calc.advance_to_year(taxyear) - calc.calc_all() - assert calc.data_year == Records.TMDCSV_YEAR - assert calc.current_year == taxyear - inctax = calc.weighted_total('iitax') - assert inctax > 0 diff --git a/taxcalc/tmd_growfactors.csv b/taxcalc/tmd_growfactors.csv deleted file mode 100644 index bea7ae2f0..000000000 --- a/taxcalc/tmd_growfactors.csv +++ /dev/null @@ -1,55 +0,0 @@ -YEAR,ATXPY,ASCHF,ABOOK,ACPIU,ACPIM,AWAGE,ASCHCI,ASCHCL,ASCHEI,ASCHEL,AINTS,ADIVS,ACGNS,ASOCSEC,AUCOMP,AIPD,ABENOTHER,ABENMCARE,ABENMCAID,ABENSSI,ABENSNAP,ABENWIC,ABENHOUSING,ABENTANF,ABENVET -2021,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2022,1.014347,1.742914,1.047552,1.072290,1.040311,1.175282,1.022527,1.022546,1.047553,1.047566,1.049118,1.003358,0.592565,0.855490,0.152665,1.022138,1.030159,1.048769,1.047573,0.999851,1.000000,1.002545,1.034942,1.000000,1.000000 -2023,1.050108,0.653145,1.091056,1.054020,1.004761,1.050035,1.013156,1.013121,1.091037,1.091047,1.026196,1.126711,1.052500,1.085497,0.748857,1.058072,1.030193,1.050822,1.048715,1.000448,1.000000,1.003807,1.034968,1.000000,1.000000 -2024,1.046242,0.895528,1.007166,1.025500,1.014070,1.040377,1.039700,1.039630,1.007187,1.007157,1.156028,1.023049,0.932271,1.052921,1.337549,1.054081,1.030334,1.048426,1.051767,0.997760,1.000000,1.002528,1.034951,1.000000,1.000000 -2025,1.040442,0.963117,1.020457,1.021980,0.958663,1.038977,1.037682,1.037745,1.020415,1.020444,1.091746,1.025380,0.977470,1.031721,1.154874,1.047914,1.030635,1.046248,1.052213,1.002245,1.000000,1.003783,1.034897,1.000000,1.000000 -2026,1.039294,0.987094,1.014705,1.020740,1.014023,1.035978,1.037783,1.037762,1.014711,1.014716,1.098184,1.019802,0.970235,1.030992,1.035291,1.046856,1.030633,1.072236,1.000000,0.999552,1.000000,1.002513,1.034808,1.000000,1.000000 -2027,1.037119,0.998822,1.017535,1.019460,1.013312,1.033569,1.034140,1.034138,1.017568,1.017583,1.066606,1.013266,0.993714,1.031791,1.045541,1.044372,1.030788,1.000000,1.000000,1.000000,1.000000,1.002506,1.034863,1.000000,1.000000 -2028,1.036799,1.006582,1.023966,1.019420,1.013356,1.033042,1.031594,1.031580,1.023985,1.023930,1.050716,1.021542,1.009158,1.033440,1.043558,1.043967,1.030942,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2029,1.035913,1.010333,1.028149,1.019660,1.013612,1.033365,1.030869,1.030888,1.028085,1.028143,1.030130,1.032091,1.018962,1.033664,1.045739,1.042825,1.031131,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2030,1.036423,1.010180,1.024121,1.019770,1.013855,1.033210,1.030563,1.030595,1.024170,1.024128,1.036979,1.032934,1.024538,1.034401,1.043738,1.043174,1.031330,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2031,1.036362,1.010259,1.024733,1.019910,1.014016,1.032812,1.031233,1.031240,1.024699,1.024734,1.039197,1.032793,1.027842,1.036645,1.038241,1.042951,1.031510,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2032,1.036409,1.009979,1.028000,1.019990,1.014306,1.032126,1.032334,1.032295,1.028004,1.027983,1.040140,1.032610,1.029719,1.036435,1.031319,1.042807,1.031644,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2033,1.035793,1.008195,1.028130,1.020020,1.014309,1.031481,1.033961,1.033991,1.028128,1.028110,1.031669,1.032460,1.030798,1.037554,1.028443,1.042009,1.031857,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2034,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2035,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2036,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2037,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2038,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2039,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2040,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2041,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2042,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2043,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2044,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2045,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2046,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2047,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2048,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2049,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2050,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2051,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2052,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2053,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2054,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2055,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2056,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2057,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2058,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2059,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2060,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2061,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2062,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2063,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2064,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2065,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2066,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2067,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2068,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2069,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2070,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2071,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2072,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2073,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 -2074,1.035385,1.008203,1.029710,1.020000,1.014443,1.030912,1.033294,1.033253,1.029705,1.029722,1.027096,1.032231,1.031308,1.037480,1.029528,1.041408,1.032059,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000,1.000000 diff --git a/taxcalc/tmd_weights.csv.gz b/taxcalc/tmd_weights.csv.gz deleted file mode 100644 index e92f8b47f..000000000 Binary files a/taxcalc/tmd_weights.csv.gz and /dev/null differ