Do the Growing Deficits Indicate a Spending Problem, not a Revenue Problem?

On November 7, 2019, USA TODAY published an editorial by Kevin Brady titled New tax cuts would lock in the gains: Rep. Kevin Brady. It can be found on the USA TODAY web site at this link. In the editorial, Brady wrote the following:

As a result, tax revenue is at an all-time high. You heard that right. According to the Treasury Department, total federal receipts are up more than 4% this year. The bottom line: Washington doesn’t have a revenue problem, it has a spending problem.

To investigate the validity of this statement, the following Python code reads the Monthly Treasury Statements for the current issue and previous issues and plots the monthly receipts, oulays, and surplus/deficit starting in October of 2014.

In [36]:
# Monthly Treasury Statement (MTS) - Current Issue:
# https://www.fiscal.treasury.gov/fsreports/rpt/mthTreasStmt/current.htm (before 11/30/2018)
# https://www.fiscal.treasury.gov/reports-statements/mts/current.html (new)
# Monthly Treasury Statement (MTS) - Previous Issues:
# https://www.fiscal.treasury.gov/fsreports/rpt/mthTreasStmt/backissues.htm (before 11/30/2018)
# https://www.fiscal.treasury.gov/reports-statements/mts/previous.html (new)

import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import datetime
import os
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
pd.set_option('display.width', 120)
#pd.set_option('max_rows', 200)

# START OF VARIABLES TO UPDATE
month_index_last = 2 # 1 = October
year_last = 2020 # last fiscal year
yrmo_last = '1911'
moyr_last = '1119'
# variable for debts
cyear_last = 2019 # last calendar year
cmonth_last = 11 # 1 = January
debt_filename_last = 'mtsdebts_1704_1911.csv'
debt_filename_all  = 'mtsdebts_1503_1911.csv'
# (Note: manually update Jupyter URL and last month in final note below)
# END OF VARIABLES TO UPDATE
savefig_recout     = "mts" + yrmo_last + "recout12m.png"
savefig_recout15   = "mts" + yrmo_last + "recout12m15.png"
savefig_recoutgdp  = "mts" + yrmo_last + "recout12mgdp.png"
savefig_rec15      = "mts" + yrmo_last + "rec12m15.png"
savefig_rec15norm  = "mts" + yrmo_last + "rec12m15norm.png"
savefig_recgdpnorm = "mts" + yrmo_last + "rec12mgdpnorm.png"
savefig_recoth15   = "mts" + yrmo_last + "recoth12m15.png"
savefig_def        = "mts" + yrmo_last + "def12m.png"
if os.path.isfile(savefig_recout):
    os.remove(savefig_recout) # Opt.: os.system("rm "+strFile)
if os.path.isfile(savefig_recout15):
    os.remove(savefig_recout15)
if os.path.isfile(savefig_recoutgdp):
    os.remove(savefig_recoutgdp)
if os.path.isfile(savefig_rec15):
    os.remove(savefig_rec15)
if os.path.isfile(savefig_rec15norm):
    os.remove(savefig_rec15norm)
if os.path.isfile(savefig_recgdpnorm):
    os.remove(savefig_recgdpnorm)
if os.path.isfile(savefig_recoth15):
    os.remove(savefig_recoth15)
if os.path.isfile(savefig_def):
    os.remove(savefig_def)
xlabel_last = "Source: Monthly Treasury Statements (see http://econdataus.com/mts" + yrmo_last + ".html)"
# For 1018, had to change extention from .xls to .xlsx
#xlsx_files_last = "https://www.fiscal.treasury.gov/files/reports-statements/mts/mts" + moyr_last + ".xlsx"
# For 0319, had to change extention from .xlsx to .xls - UPDATE IF NEEDED
# For 0419, had to change extention from .xls to .xlsx - UPDATE IF NEEDED
xlsx_files_last = "https://www.fiscal.treasury.gov/files/reports-statements/mts/mts" + moyr_last + ".xlsx"

xlsx_files_yr = [
    'https://www.fiscal.treasury.gov/files/reports-statements/mts/mts0915.xls',
    'https://www.fiscal.treasury.gov/files/reports-statements/mts/mts0916.xls',
    'https://www.fiscal.treasury.gov/files/reports-statements/mts/mts0917.xls',
    'https://www.fiscal.treasury.gov/files/reports-statements/mts/mts0918.xls',
    'https://www.fiscal.treasury.gov/files/reports-statements/mts/mts0919.xlsx', #UPDATE
    xlsx_files_last
]
def joinyear(year):
    iyr = year - 2015
    #print("BEFORE "+xlsx_files_yr[iyr])
    xx = pd.read_excel(xlsx_files_yr[iyr], sheet_name='Table 7', index_col=0, skiprows=4)
    #print(" AFTER "+xlsx_files_yr[iyr])
    if year == 2020: # UPDATE for mts1019.xlsx
        xx = xx.iloc[[0,1,3,4,5,6,7,8,9,10,97,100], 0:12]
    elif year < 2099: # fix required for mts1118.xls # was 2019
        xx = xx.iloc[[0,1,3,4,5,6,7,8,9,10,99,102], 0:12]
    else:
        #xx = xx.iloc[[0,1,3,4,5,6,7,8,9,10,97,100], 0:12]
        xx = xx.iloc[[0,1,3,4,5,6,7,8,9,10,98,101], 0:12] # UPDATE for mts0319.xls
    years = [year-1,year-1,year-1,year,year,year,year,year,year,year,year,year]
    months = ['10','11','12','01','02','03','04','05','06','07','08','09']
    #months = [10,11,12,1,2,3,4,5,6,7,8,9]
    for i in range(0,12):
        years[i] = str(years[i])+"-"+months[i]+"-01"
    xx.columns = pd.to_datetime(years)
    xx.index = ['Individual','Corporation','Employment','Unemployment','Other Retirement',
                'Excise','Estate','Customs','Miscellaneous','Total Receipts','Total Outlays','Surplus/Deficit']
    if year >= year_last:
        xx = xx.iloc[:, 0:month_index_last]
    #print(xx)
    return(xx)

def joinyears(start_year, end_year):
    yy = joinyear(2015)
    for year in range(start_year+1, end_year+1):
        yy = yy.join(joinyear(year))
    return(yy.T)

def dofilter(ff, numeric=True, rollingsum=False, normalize=False, divisor=1000, adjust=pd.Series([])):
    #print(yy)
    #print(yy.T)
    first = 0
    for i in range(0,len(ff.columns)):
        #print(ff.iloc[:,i]) #DEBUG
        if (numeric):
            ff.iloc[:,i] = ff.iloc[:,i].str.replace(',','').astype(int)
        if (len(adjust) > 0):
            ff.iloc[:,i] = ff.iloc[:,i].mul(adjust)
            #zz = zz.mul(deflators, axis='index')
        if (rollingsum):
            ff.iloc[:,i] = ff.iloc[:,i].rolling(window=12).sum()
            first = 11
        if (normalize):
            ff.iloc[:,i] = ff.iloc[:,i] - ff.iloc[first,i]
        ff.iloc[:,i] = ff.iloc[:,i]/divisor
    #yy = yy.T
    #yy = yy.iloc[:,9:]
    return(ff)

yy0 = joinyears(2015, year_last) # year_last gives error

yy = yy0.copy()
zz = dofilter(yy)
#zz = zz.mul(deflators, axis='index')
#print(zz)
# CPIAUCNS.csv was downloaded from https://fred.stlouisfed.org/series/CPIAUCNS
cpiu = pd.read_csv('CPIAUCNS.csv', index_col=0)
CPIAUCNS = cpiu.loc['2014-10-01':,'CPIAUCNS']
cpi_deflators = CPIAUCNS[0] / CPIAUCNS

defs = zz.iloc[:,9:].copy()
print('Table 1. U.S. TREASURY RECEIPTS, OUTLAYS, AND DEFICITS: Monthly Amount ($billions)')
print(defs)
fig, ax = plt.subplots(1, 1, figsize=(12, 8))
ax.plot(defs)
ax.set_title('Figure 1. U.S. TREASURY RECEIPTS, OUTLAYS, AND DEFICITS: Monthly Amount')
ax.set_xlabel(xlabel_last)
ax.set_ylabel('Billions of Dollars')
ax.grid(zorder=0)
ax.legend(defs.columns)
Table 1. U.S. TREASURY RECEIPTS, OUTLAYS, AND DEFICITS: Monthly Amount ($billions)
            Total Receipts  Total Outlays  Surplus/Deficit
2014-10-01         212.719        334.432         -121.713
2014-11-01         191.436        248.254          -56.818
2014-12-01         335.327        333.463            1.864
2015-01-01         306.742        324.289          -17.546
2015-02-01         139.388        331.738         -192.350
2015-03-01         234.187        287.105          -52.918
2015-04-01         471.801        315.092          156.709
2015-05-01         212.386        296.454          -84.068
2015-06-01         342.933        292.447           50.487
2015-07-01         225.493        374.680         -149.187
2015-08-01         210.837        275.257          -64.420
2015-09-01         365.473        274.412           91.061
2015-10-01         211.046        347.604         -136.558
2015-11-01         204.968        269.517          -64.549
2015-12-01         349.631        364.075          -14.444
2016-01-01         313.579        258.416           55.163
2016-02-01         169.147        361.757         -192.610
2016-03-01         227.848        335.891         -108.043
2016-04-01         438.432        331.977          106.455
2016-05-01         224.604        277.111          -52.507
2016-06-01         329.572        323.320            6.252
2016-07-01         209.998        322.817         -112.819
2016-08-01         231.327        338.438         -107.112
2016-09-01         356.537        323.178           33.359
2016-10-01         221.692        267.523          -45.831
2016-11-01         199.875        336.544         -136.669
2016-12-01         319.204        346.541          -27.337
2017-01-01         344.069        292.812           51.257
2017-02-01         171.713        363.757         -192.044
2017-03-01         216.584        392.816         -176.233
...                    ...            ...              ...
2017-06-01         338.660        428.894          -90.233
2017-07-01         232.040        274.980          -42.939
2017-08-01         226.311        334.000         -107.689
2017-09-01         348.722        340.722            8.000
2017-10-01         235.341        298.555          -63.214
2017-11-01         208.374        346.922         -138.547
2017-12-01         325.797        348.989          -23.192
2018-01-01         361.038        311.801           49.237
2018-02-01         155.623        370.862         -215.239
2018-03-01         210.832        419.576         -208.744
2018-04-01         510.447        296.192          214.255
2018-05-01         217.075        363.871         -146.796
2018-06-01         316.278        391.136          -74.858
2018-07-01         225.266        302.131          -76.865
2018-08-01         219.115        433.263         -214.148
2018-09-01         343.559        224.443          119.116
2018-10-01         252.692        353.183         -100.491
2018-11-01         205.961        410.864         -204.903
2018-12-01         312.584        326.123          -13.539
2019-01-01         339.980        331.299            8.681
2019-02-01         167.265        401.243         -233.977
2019-03-01         228.811        375.756         -146.945
2019-04-01         535.545        375.240          160.304
2019-05-01         232.064        439.833         -207.768
2019-06-01         333.952        342.430           -8.477
2019-07-01         251.348        371.043         -119.695
2019-08-01         227.965        428.309         -200.344
2019-09-01         374.028        291.260           82.768
2019-10-01         245.521        379.988         -134.467
2019-11-01         225.185        434.024         -208.838

[62 rows x 3 columns]
Out[36]:
<matplotlib.legend.Legend at 0x2103692bf98>

The reason for starting in October of 2014 is that this date is the start of fiscal year 2015, the first year for which the Treasury has spreadsheets posted on its site. In any event, the above plot clearly shows that receipts and surpluses peak in April of every year, presumedly due to taxpayers filing their returns. The plot also shows that the prior two months appeared to have had the largest monthly deficits since at least October of 2014. In fact, a ZeroHedge article mentions that the "March budget deficit of \$208.7 billion (in 2018) was 18% higher than \$176.2BN deficit recorded last March (in 2017), and was the biggest March budget deficit in US history."

In order to remove the monthly variations that occur each year, it makes sense to look at the 12-month rolling sum of these values. That is done for receipts and outlays in the following Python code and the resulting plot.

In [37]:
yy = yy0.copy()
allones = cpi_deflators.copy()
for i in range(len(allones)):
    allones[i] = 1
deflators = allones
zz = dofilter(yy, rollingsum=True, normalize=False, adjust=deflators)
#zz = zz.mul(deflators, axis='index')
dd = zz.iloc[:,9:11].copy()
#print(dd)
dd['% Chng Receipts'] = dd['Total Receipts'].pct_change(periods=12) * 100
dd['% Chng Outlays']  = dd['Total Outlays'].pct_change(periods=12) * 100
dd['Deflators']  = deflators
#dd.loc[:1] = dd[:1] * cpiu[0:3] / cpiu[:3]
#dd.loc[:2] = dd[:2] * cpiu[0:3] / cpiu[:3]
#dd.loc[:3] = dd[:3] * cpiu[0:3] / cpiu[:3]
print('Table 2. U.S. TREASURY RECEIPTS AND OUTLAYS: 12-Month Rolling Sum ($billions)')
print(dd)
dd = dd.iloc[:,0:2]
fig, ax = plt.subplots(1, 1, figsize=(12, 8))
ax.plot(dd)
ax.set_title('Figure 2. U.S. TREASURY RECEIPTS AND OUTLAYS: 12-Month Rolling Sum')
ax.set_xlabel(xlabel_last)
ax.set_ylabel('Billions of Dollars')
ax.grid(zorder=0)
ax.legend(dd.columns)
fig.savefig(savefig_recout)
Table 2. U.S. TREASURY RECEIPTS AND OUTLAYS: 12-Month Rolling Sum ($billions)
            Total Receipts  Total Outlays  % Chng Receipts  % Chng Outlays  Deflators
2014-10-01             NaN            NaN              NaN             NaN        1.0
2014-11-01             NaN            NaN              NaN             NaN        1.0
2014-12-01             NaN            NaN              NaN             NaN        1.0
2015-01-01             NaN            NaN              NaN             NaN        1.0
2015-02-01             NaN            NaN              NaN             NaN        1.0
2015-03-01             NaN            NaN              NaN             NaN        1.0
2015-04-01             NaN            NaN              NaN             NaN        1.0
2015-05-01             NaN            NaN              NaN             NaN        1.0
2015-06-01             NaN            NaN              NaN             NaN        1.0
2015-07-01             NaN            NaN              NaN             NaN        1.0
2015-08-01             NaN            NaN              NaN             NaN        1.0
2015-09-01        3248.722       3687.623              NaN             NaN        1.0
2015-10-01        3247.049       3700.795              NaN             NaN        1.0
2015-11-01        3260.581       3722.058              NaN             NaN        1.0
2015-12-01        3274.885       3752.670              NaN             NaN        1.0
2016-01-01        3281.722       3686.797              NaN             NaN        1.0
2016-02-01        3311.481       3716.816              NaN             NaN        1.0
2016-03-01        3305.142       3765.602              NaN             NaN        1.0
2016-04-01        3271.773       3782.487              NaN             NaN        1.0
2016-05-01        3283.991       3763.144              NaN             NaN        1.0
2016-06-01        3270.630       3794.017              NaN             NaN        1.0
2016-07-01        3255.135       3742.154              NaN             NaN        1.0
2016-08-01        3275.625       3805.335              NaN             NaN        1.0
2016-09-01        3266.689       3854.101         0.553048        4.514507        1.0
2016-10-01        3277.335       3774.020         0.932724        1.978629        1.0
2016-11-01        3272.242       3841.047         0.357636        3.196860        1.0
2016-12-01        3241.815       3823.513        -1.009806        1.887803        1.0
2017-01-01        3272.305       3857.909        -0.286953        4.641210        1.0
2017-02-01        3274.871       3859.909        -1.105548        3.849881        1.0
2017-03-01        3263.607       3916.834        -1.256678        4.016144        1.0
...                    ...            ...              ...             ...        ...
2017-06-01        3305.682       4015.338         1.071720        5.833421        1.0
2017-07-01        3327.724       3967.501         2.229984        6.021853        1.0
2017-08-01        3322.708       3963.063         1.437375        4.144918        1.0
2017-09-01        3314.893       3980.607         1.475623        3.282374        1.0
2017-10-01        3328.542       4011.639         1.562459        6.296178        1.0
2017-11-01        3337.041       4022.017         1.980263        4.711476        1.0
2017-12-01        3343.634       4024.465         3.140802        5.255690        1.0
2018-01-01        3360.603       4043.454         2.698343        4.809471        1.0
2018-02-01        3344.513       4050.559         2.126557        4.939236        1.0
2018-03-01        3338.761       4077.319         2.302790        4.097314        1.0
2018-04-01        3393.603       4100.334         3.438908        6.280401        1.0
2018-05-01        3370.260       4135.364         2.234609        5.770169        1.0
2018-06-01        3347.878       4097.606         1.276469        2.048844        1.0
2018-07-01        3341.104       4124.757         0.402077        3.963603        1.0
2018-08-01        3333.908       4224.020         0.337074        6.584730        1.0
2018-09-01        3328.745       4107.741         0.417872        3.193835        1.0
2018-10-01        3346.096       4162.369         0.527378        3.757317        1.0
2018-11-01        3343.683       4226.311         0.199039        5.079392        1.0
2018-12-01        3330.470       4203.445        -0.393703        4.447299        1.0
2019-01-01        3309.412       4222.943        -1.523268        4.439002        1.0
2019-02-01        3321.054       4253.324        -0.701418        5.005852        1.0
2019-03-01        3339.033       4209.504         0.008147        3.241959        1.0
2019-04-01        3364.131       4288.552        -0.868458        4.590309        1.0
2019-05-01        3379.120       4364.514         0.262888        5.541229        1.0
2019-06-01        3396.794       4315.808         1.461105        5.325109        1.0
2019-07-01        3422.876       4384.720         2.447454        6.302505        1.0
2019-08-01        3431.726       4379.766         2.934034        3.687151        1.0
2019-09-01        3462.195       4446.583         4.009018        8.248865        1.0
2019-10-01        3455.024       4473.388         3.255376        7.472163        1.0
2019-11-01        3474.248       4496.548         3.904826        6.394158        1.0

[62 rows x 5 columns]

The fourth column above shows the increase in the 12-month rolling receipts over the prior 12-month period. Hence, the 4.009018 for 2019-09-01 shows that receipts did increase more than 4 percent in fiscal year 2019 as Brady said (though just barely so). However, the 0.417872 for 2018-09-01 shows that receipts increased less than half of one percent in fiscal year 2018. In addition, these numbers are not corrected for inflation. The following code is the same as above except that the receipts and outlays are all corrected for inflation using the CPI-U from the Federal Reserve web site.

In [38]:
yy = yy0.copy()
deflators = cpi_deflators
zz = dofilter(yy, rollingsum=True, normalize=False, adjust=deflators)
#zz = zz.mul(deflators, axis='index')
dd = zz.iloc[:,9:11].copy()
#print(dd)
dd['% Chng Receipts'] = dd['Total Receipts'].pct_change(periods=12) * 100
dd['% Chng Outlays']  = dd['Total Outlays'].pct_change(periods=12) * 100
dd['Deflators']  = deflators
#dd.loc[:1] = dd[:1] * cpiu[0:3] / cpiu[:3]
#dd.loc[:2] = dd[:2] * cpiu[0:3] / cpiu[:3]
#dd.loc[:3] = dd[:3] * cpiu[0:3] / cpiu[:3]
print('Table 3. U.S. TREASURY RECEIPTS AND OUTLAYS: 12-Month Rolling Sum (billions of 2015 $)')
print(dd)
dd = dd.iloc[:,0:2]
fig, ax = plt.subplots(1, 1, figsize=(12, 8))
ax.plot(dd)
ax.set_title('Figure 3. U.S. TREASURY RECEIPTS AND OUTLAYS: 12-Month Rolling Sum (billions of 2015 $)')
ax.set_xlabel(xlabel_last)
ax.set_ylabel('Billions of 2015 Dollars')
ax.grid(zorder=0)
ax.legend(dd.columns)
fig.savefig(savefig_recout15)
Table 3. U.S. TREASURY RECEIPTS AND OUTLAYS: 12-Month Rolling Sum (billions of 2015 $)
            Total Receipts  Total Outlays  % Chng Receipts  % Chng Outlays  Deflators
2014-10-01             NaN            NaN              NaN             NaN   1.000000
2014-11-01             NaN            NaN              NaN             NaN   1.005429
2014-12-01             NaN            NaN              NaN             NaN   1.011162
2015-01-01             NaN            NaN              NaN             NaN   1.015943
2015-02-01             NaN            NaN              NaN             NaN   1.011550
2015-03-01             NaN            NaN              NaN             NaN   1.005565
2015-04-01             NaN            NaN              NaN             NaN   1.003525
2015-05-01             NaN            NaN              NaN             NaN   0.998436
2015-06-01             NaN            NaN              NaN             NaN   0.994951
2015-07-01             NaN            NaN              NaN             NaN   0.994884
2015-08-01             NaN            NaN              NaN             NaN   0.996295
2015-09-01     3258.185713    3698.935221              NaN             NaN   0.997848
2015-10-01     3256.153335    3711.515307              NaN             NaN   0.998297
2015-11-01     3268.729852    3731.540756              NaN             NaN   1.000409
2015-12-01     3280.633096    3759.828255              NaN             NaN   1.003839
2016-01-01     3283.263991    3689.349020              NaN             NaN   1.002182
2016-02-01     3311.642787    3716.027773              NaN             NaN   1.001358
2016-03-01     3303.331725    3762.230079              NaN             NaN   0.997065
2016-04-01     3264.949945    3775.468027              NaN             NaN   0.992360
2016-05-01     3274.886039    3753.363507              NaN             NaN   0.988361
2016-06-01     3258.354488    3780.904021              NaN             NaN   0.985126
2016-07-01     3241.224851    3726.671671              NaN             NaN   0.986722
2016-08-01     3259.215089    3786.072423              NaN             NaN   0.985817
2016-09-01     3245.165746    3830.081143        -0.399608        3.545505   0.983453
2016-10-01     3252.231221    3745.837647        -0.120452        0.924753   0.982228
2016-11-01     3243.808126    3807.288424        -0.762428        2.029930   0.983758
2016-12-01     3206.751732    3782.616779        -2.252046        0.606105   0.983436
2017-01-01     3228.897889    3809.930380        -1.655855        3.268364   0.977738
2017-02-01     3226.885022    3802.225837        -2.559387        2.319629   0.974672
2017-03-01     3210.632733    3849.876572        -2.806227        2.329642   0.973880
...                    ...            ...              ...             ...        ...
2017-06-01     3232.790835    3928.050336        -0.784557        3.891829   0.969292
2017-07-01     3250.651008    3876.239639         0.290821        4.013446   0.969962
2017-08-01     3241.462558    3865.601699        -0.544687        2.100575   0.967066
2017-09-01     3226.286157    3875.536516        -0.581776        1.186799   0.961972
2017-10-01     3235.068723    3900.151155        -0.527715        4.119599   0.962581
2017-11-01     3239.011922    3903.005463        -0.147857        2.514047   0.962557
2017-12-01     3238.877783    3898.323879         1.001825        3.058917   0.963123
2018-01-01     3248.308380    3910.706050         0.601149        2.645079   0.957905
2018-02-01     3229.343625    3909.809149         0.076191        2.829482   0.953581
2018-03-01     3219.008479    3926.450292         0.260875        1.988992   0.951429
2018-04-01     3260.347039    3941.885199         1.317729        4.125909   0.947662
2018-05-01     3231.962121    3966.251673         0.085532        3.534846   0.943737
2018-06-01     3201.709968    3919.070266        -0.961425       -0.228614   0.942236
2018-07-01     3188.879417    3937.009620        -1.900284        1.567756   0.942172
2018-08-01     3176.351211    4021.991303        -2.008703        4.045673   0.941649
2018-09-01     3164.026821    3905.327430        -1.929752        0.768691   0.940556
2018-10-01     3174.743951    3949.546705        -1.864714        1.266503   0.938897
2018-11-01     3168.198128    4002.669880        -2.186278        2.553530   0.942052
2018-12-01     3149.829502    3974.759815        -2.749356        1.960738   0.945071
2019-01-01     3124.683228    3988.589352        -3.805832        1.991541   0.943272
2019-02-01     3133.396493    4011.830874        -2.971103        2.609379   0.939302
2019-03-01     3146.521714    3963.602373        -2.251835        0.946200   0.934033
2019-04-01     3160.372220    4031.552787        -3.066386        2.274739   0.929113
2019-05-01     3170.666121    4095.940655        -1.896557        3.269812   0.927139
2019-06-01     3182.216170    4044.815556        -0.608856        3.208549   0.926955
2019-07-01     3202.576440    4103.522553         0.429525        4.229427   0.925409
2019-08-01     3207.218497    4091.921831         0.971784        1.738704   0.925455
2019-09-01     3229.957317    4150.157778         2.083753        6.269138   0.924731
2019-10-01     3219.228522    4169.140443         1.401202        5.559973   0.922622
2019-11-01     3233.074504    4182.739833         2.047737        4.498746   0.923117

[62 rows x 5 columns]

As can be seen in the graph above, real receipts generally declined following a local high reached in April of 2018 to the start of 2019. They then started to recover but have not yet reached that high of April of 2018. This is in fact the month of the last year that individual taxes were paid under the old tax rules. The fourth column above shows that real (inflation-corrected) receipts went down over 1.9 percent in fiscal year 2018 and rose just over 2 percent in fiscal year 2019. As a result, they are just about even over two years and down 1.26 percent from the high in April of 2018.

The fifth column shows that real outlays increased just 0.77 percent in fiscal year 2018 but 6.27 percent in fiscal year 2019. Combining those, real outlays have increased 3.09 percent at an annual rate over the last two fiscal years.

However, receipts and outlays have tended to rise with the GDP over the last 60 or more years. The following code is the same as above except that the receipts and outlays are all taken as a percent of GDP as shown at the Bureau of Economic Analysis web site. Since the BEA site shows quarterly GDP numbers, those numbers are applied to the corresponding months in the receipts and outlays numbers. For example, the GDP number for quarter 4 of 2014 is used for October, November, and December of 2014. Also, if the GDP number is not yet available, it is estimated by assuming that the GDP will grow by the same amount as the last recorded quarter.

In [39]:
#import pandas as pd
# pd.read_excel does not work for 2018Q3 and later - save and convert file to CSV
#xx = pd.read_excel('https://www.bea.gov/national/xls/gdplev.xlsx', skiprows=7)
#xx = pd.read_excel('gdplev.xlsx', skiprows=7) #UPDATE - Save GDP file locally
xx = pd.read_excel('gdplev_19q3.xlsx', skiprows=7) #UPDATE - Save GDP file locally
#xx = pd.read_csv('gdplev.csv', skiprows=7) #UPDATE - Save GDP file locally as a CSV file

aa = xx.iloc[0:90, 0:3] #UPDATE (0:90 = 2018, 90 = 98(row in file) - 7(skiprows) - 1(hdr))
aa.columns = ['Year','Current $bil','Chained 2009 $bil']
qq = xx.iloc[0:291, 4:7] #UPDATE (0:291 = 2019Q3, 289 = 297(row in file - 7(skiprows) - 1(hdr))
qq.columns = ['Quarter','Current $bil','Chained 2009 $bil']
# Must convert strings to floats if read from CSV file (comment out values are already floats)
#aa['Chained 2009 $bil'] = aa['Chained 2009 $bil'].str.replace(',', '')
#qq['Chained 2009 $bil'] = qq['Chained 2009 $bil'].str.replace(',', '')
#aa['Chained 2009 $bil'] = aa['Chained 2009 $bil'].astype(float)
#qq['Chained 2009 $bil'] = qq['Chained 2009 $bil'].astype(float)

aa['Pct_Change'] = aa.loc[:,'Chained 2009 $bil'].pct_change()*100
qq['Pct_Change'] = qq.loc[:,'Chained 2009 $bil'].pct_change()*100
#print(qq.head())
#print(qq.tail(23))
qq14q4 = qq.iloc[271:,]
#qq14q4['deflator'] = 100 / qq14q4['Current $bil'] #TEST
#print(qq14q4)
gdp_deflators = cpi_deflators.copy()
#gdp_deflator_est = 2*qq14q4.iloc[len(qq14q4)-1, 1] - qq14q4.iloc[len(qq14q4)-2, 1] # ESTIMATE NEXT GDP
gdp_deflators[:] = 100 / gdp_deflator_est # USE NEXT ESTIMATED GDP
#gdp_deflators[:] = 100 / qq14q4.iloc[len(qq14q4)-1, 1] # USE LAST ACTUAL GDP
#gdp_deflators.rename('GDP')
#gdp_deflators.rename(columns = {'CPIAUCNS':'GDP'}, inplace = True) 
j = 0
for i in range(len(qq14q4)):
    gdp_deflators[j]   = 100 / qq14q4.iloc[i,1]
    gdp_deflators[j+1] = 100 / qq14q4.iloc[i,1]
    gdp_deflators[j+2] = 100 / qq14q4.iloc[i,1]
    j = j+3
#print(type(gdp_deflators))
#print(gdp_deflators)
In [40]:
yy = yy0.copy()
deflators = gdp_deflators
zz = dofilter(yy, rollingsum=True, normalize=False, adjust=deflators)
#zz = zz.mul(deflators, axis='index')
dd = zz.iloc[:,9:11].copy()
#print(dd)
dd['% Chng Receipts'] = dd['Total Receipts'].pct_change(periods=12) * 100
dd['% Chng Outlays']  = dd['Total Outlays'].pct_change(periods=12) * 100
dd['Deflators']  = deflators
#dd.loc[:1] = dd[:1] * cpiu[0:3] / cpiu[:3]
#dd.loc[:2] = dd[:2] * cpiu[0:3] / cpiu[:3]
#dd.loc[:3] = dd[:3] * cpiu[0:3] / cpiu[:3]
print('Table 4. U.S. TREASURY RECEIPTS AND OUTLAYS: 12-Month Rolling Sum (percent of GDP)')
print(dd)
dd = dd.iloc[:,0:2]
fig, ax = plt.subplots(1, 1, figsize=(12, 8))
ax.plot(dd)
ax.set_title('Figure 4. U.S. TREASURY RECEIPTS AND OUTLAYS: 12-Month Rolling Sum (percent of GDP) $)')
ax.set_xlabel(xlabel_last)
ax.set_ylabel('Percent of GDP')
ax.grid(zorder=0)
ax.legend(dd.columns)
fig.savefig(savefig_recoutgdp)
Table 4. U.S. TREASURY RECEIPTS AND OUTLAYS: 12-Month Rolling Sum (percent of GDP)
            Total Receipts  Total Outlays  % Chng Receipts  % Chng Outlays  Deflators
2014-10-01             NaN            NaN              NaN             NaN   0.005602
2014-11-01             NaN            NaN              NaN             NaN   0.005602
2014-12-01             NaN            NaN              NaN             NaN   0.005602
2015-01-01             NaN            NaN              NaN             NaN   0.005560
2015-02-01             NaN            NaN              NaN             NaN   0.005560
2015-03-01             NaN            NaN              NaN             NaN   0.005560
2015-04-01             NaN            NaN              NaN             NaN   0.005489
2015-05-01             NaN            NaN              NaN             NaN   0.005489
2015-06-01             NaN            NaN              NaN             NaN   0.005489
2015-07-01             NaN            NaN              NaN             NaN   0.005451
2015-08-01             NaN            NaN              NaN             NaN   0.005451
2015-09-01       17.933907      20.377227              NaN             NaN   0.005451
2015-10-01       17.892262      20.397865              NaN             NaN   0.005449
2015-11-01       17.936728      20.475772              NaN             NaN   0.005449
2015-12-01       17.963398      20.591595              NaN             NaN   0.005449
2016-01-01       17.959765      20.190989              NaN             NaN   0.005428
2016-02-01       18.102771      20.309858              NaN             NaN   0.005428
2016-03-01       18.037261      20.536516              NaN             NaN   0.005428
2016-04-01       17.800151      20.588335              NaN             NaN   0.005366
2016-05-01       17.839570      20.448064              NaN             NaN   0.005366
2016-06-01       17.725675      20.577724              NaN             NaN   0.005366
2016-07-01       17.613088      20.251781              NaN             NaN   0.005317
2016-08-01       17.693805      20.550871              NaN             NaN   0.005317
2016-09-01       17.597349      20.773425        -1.876660        1.944317   0.005317
2016-10-01       17.614582      20.287824        -1.551954       -0.539473   0.005265
2016-11-01       17.550061      20.591170        -2.155727        0.563584   0.005265
2016-12-01       17.325536      20.431875        -3.550899       -0.775657   0.005265
2017-01-01       17.416472      20.555118        -3.025052        1.803421   0.005211
2017-02-01       17.393194      20.487155        -3.919718        0.872960   0.005211
2017-03-01       17.285129      20.711009        -4.169880        0.849669   0.005211
...                    ...            ...              ...             ...        ...
2017-06-01       17.304583      21.033989        -2.375607        2.217276   0.005166
2017-07-01       17.371141      20.719611        -1.373676        2.310069   0.005099
2017-08-01       17.295076      20.623116        -2.253495        0.351542   0.005099
2017-09-01       17.177411      20.642037        -2.386372       -0.632482   0.005099
2017-10-01       17.191609      20.732273        -2.401268        2.190719   0.005020
2017-11-01       17.185299      20.701906        -2.078414        0.537783   0.005020
2017-12-01       17.140178      20.629278        -1.069852        0.966152   0.005020
2018-01-01       17.137835      20.649839        -1.599852        0.460815   0.004960
2018-02-01       17.014866      20.593625        -2.175149        0.519687   0.004960
2018-03-01       16.931887      20.627584        -2.043613       -0.402802   0.004960
2018-04-01       17.066890      20.660419        -1.270015        1.570098   0.004876
2018-05-01       16.883219      20.735659        -2.540652        0.888531   0.004876
2018-06-01       16.675687      20.426940        -3.634273       -2.886039   0.004876
2018-07-01       16.578145      20.480885        -4.565019       -1.152176   0.004819
2018-08-01       16.480172      20.865855        -4.711766        1.177024   0.004819
2018-09-01       16.357762      20.210177        -4.771666       -2.092134   0.004819
2018-10-01       16.385446      20.401373        -4.689282       -1.596061   0.004785
2018-11-01       16.324897      20.625764        -5.006614       -0.367800   0.004785
2018-12-01       16.185054      20.434276        -5.572429       -0.945266   0.004785
2019-01-01       16.005847      20.458116        -6.605200       -0.928445   0.004740
2019-02-01       16.026800      20.520549        -5.807075       -0.354846   0.004740
2019-03-01       16.065646      20.220584        -5.116036       -1.973085   0.004740
2019-04-01       16.086447      20.534827        -5.744707       -0.607884   0.004686
2019-05-01       16.115516      20.821774        -4.547137        0.415296   0.004686
2019-06-01       16.138352      20.519359        -3.222263        0.452434   0.004686
2019-07-01       16.220382      20.787004        -2.158042        1.494659   0.004646
2019-08-01       16.223427      20.688717        -1.557902       -0.848935   0.004646
2019-09-01       16.305285      20.960128        -0.320804        3.710755   0.004646
2019-10-01       16.226950      21.020264        -0.967297        3.033575   0.004606
2019-11-01       16.278566      21.053270        -0.283808        2.072680   0.004606

[62 rows x 5 columns]

Surprisingly, outlays appear to have remained fairly steady as a percent of GDP. They have run between 20 and 21 percent of GDP since at least October of 2014 though they did just reach 21.035 percent in October of 2019. During that same period, receipts have dropped from about 18 percent of GDP to just above 16 percent of GDP. Of course, it can be argued that both receipts and outlays need to be restrained to deal with the growing deficit. However, judging strictly be their percent of GDP, receipts have been a bigger contributor to the growing deficit, at least until the past few months.

Focusing on the receipts, the following Python code plots the 12-month rolling sum of the three largest contributors to real receipts. Those are individual income taxes, corporation income taxes, and employment taxes. Employment taxes consist chiefly of payroll taxes.

In [41]:
yy = yy0.copy()
deflators = cpi_deflators
zz = dofilter(yy, rollingsum=True, normalize=False, adjust=deflators)
zz = zz.mul(deflators, axis='index')
dd = zz.iloc[:,0:3].copy()
oo = zz.iloc[:,3:9]
dd['Other'] = oo.sum(axis=1, skipna=False)
dd['Deflators']  = deflators
print('Table 5. SOURCES OF U.S. TREASURY RECEIPTS: 12-Month Rolling Sum (billions of 2015 $)')
print(dd.iloc[11:,:])
fig, ax = plt.subplots(1, 1, figsize=(12, 8))
dd = dd.iloc[:,0:4]
ax.plot(dd)
ax.set_title('Figure 5. SOURCES OF U.S. TREASURY RECEIPTS: 12-Month Rolling Sum (billions of 2015 $)')
ax.set_xlabel(xlabel_last)
ax.set_ylabel('Billions of 2015 Dollars')
ax.grid(zorder=0)
ax.legend(dd.columns)
fig.savefig(savefig_rec15)
Table 5. SOURCES OF U.S. TREASURY RECEIPTS: 12-Month Rolling Sum (billions of 2015 $)
             Individual  Corporation   Employment       Other  Deflators
2015-09-01  1542.159582   343.814550  1011.371620  353.831135   0.997848
2015-10-01  1545.222353   338.000162  1015.681386  351.708725   0.998297
2015-11-01  1555.722295   339.794006  1022.026423  352.527070   1.000409
2015-12-01  1563.716869   333.024039  1028.256177  368.235122   1.003839
2016-01-01  1562.741036   332.105401  1029.470470  366.115865   1.002182
2016-02-01  1585.224896   331.268921  1029.480313  370.167912   1.001358
2016-03-01  1568.922286   332.363900  1021.403744  370.947353   0.997065
2016-04-01  1536.629135   322.868718  1018.154905  362.355299   0.992360
2016-05-01  1541.235704   318.761387  1017.070841  359.703034   0.988361
2016-06-01  1516.273108   305.857029  1027.399697  360.358567   0.985126
2016-07-01  1508.833127   304.260633  1033.773298  351.321599   0.986722
2016-08-01  1518.373255   302.808784  1036.566383  355.240696   0.985817
2016-09-01  1510.588742   292.388684  1037.890799  350.598541   0.983453
2016-10-01  1518.904606   290.048145  1037.286419  348.193502   0.982228
2016-11-01  1517.907393   287.507468  1038.952222  346.756807   0.983758
2016-12-01  1505.538477   281.845664  1045.317927  320.935036   0.983436
2017-01-01  1507.780611   281.906784  1042.145571  325.186211   0.977738
2017-02-01  1498.061242   286.750734  1044.002426  316.343612   0.974672
2017-03-01  1501.673608   266.425988  1042.340504  316.333911   0.973880
2017-04-01  1475.824425   287.577644  1044.524043  316.701268   0.971001
2017-05-01  1479.465265   288.563040  1047.637422  317.213401   0.970172
2017-06-01  1491.777596   283.696075  1044.767730  313.279848   0.969292
2017-07-01  1503.966007   284.203530  1047.911377  316.925499   0.969962
2017-08-01  1492.106409   283.521462  1045.911816  313.168487   0.967066
2017-09-01  1486.033984   277.808608  1041.219112  298.537557   0.961972
2017-10-01  1490.471098   279.286609  1044.592794  299.665533   0.962581
2017-11-01  1495.029162   276.536250  1047.505438  298.664024   0.962557
2017-12-01  1512.046121   265.972393  1044.252799  297.166298   0.963123
2018-01-01  1517.615691   266.357860  1038.885931  288.709918   0.957905
2018-02-01  1495.108467   261.040982  1033.857834  289.429549   0.953581
2018-03-01  1493.640173   253.104498  1030.887986  285.023748   0.951429
2018-04-01  1540.592548   235.017803  1025.738278  288.355715   0.947662
2018-05-01  1521.427175   231.221779  1020.930995  276.540824   0.943737
2018-06-01  1525.646870   212.194382  1001.735847  277.184353   0.942236
2018-07-01  1519.206469   207.738582  1001.582700  275.941635   0.942172
2018-08-01  1513.204680   203.343934  1002.045903  272.408603   0.941649
2018-09-01  1505.314380   183.045054  1002.335556  285.244746   0.940556
2018-10-01  1500.728529   186.404313  1000.935249  292.685418   0.938897
2018-11-01  1499.133334   187.659200  1005.279713  292.530981   0.942052
2018-12-01  1492.884987   172.873819  1015.868560  295.182177   0.945071
2019-01-01  1469.995470   168.320524  1016.539185  292.568912   0.943272
2019-02-01  1473.145169   168.806003  1014.955827  286.295018   0.939302
2019-03-01  1471.366798   171.028232  1011.989343  284.567403   0.934033
2019-04-01  1474.154350   171.576064  1009.510991  281.099269   0.929113
2019-05-01  1479.185834   168.999457  1009.872589  281.591789   0.927139
2019-06-01  1458.375719   179.828008  1031.104193  280.463688   0.926955
2019-07-01  1469.457085   181.748777  1030.660013  281.826644   0.925409
2019-08-01  1467.545011   183.571488  1032.348376  284.673834   0.925455
2019-09-01  1482.003573   198.319088  1033.339961  273.178089   0.924731
2019-10-01  1474.579598   196.530189  1032.640578  266.379666   0.922622
2019-11-01  1484.299270   198.520376  1034.888225  266.797184   0.923117

The fact that individual tax receipts are so much greater than corporate tax receipts makes it difficult to see the detail of the change in each. Following is the same Python code but with normalize set to True. This normalizes all sources of receipts to start at zero.

In [42]:
yy = yy0.copy()
deflators = cpi_deflators
zz = dofilter(yy, rollingsum=True, normalize=True, adjust=deflators)
zz = zz.mul(deflators, axis='index')
dd = zz.iloc[:,0:3].copy()
oo = zz.iloc[:,3:9]
dd['Other'] = oo.sum(axis=1, skipna=False)
dd['Deflators']  = deflators
print('Table 6. SOURCES OF U.S. TREASURY RECEIPTS: Real Change in 12-Month Rolling Sum (billions of 2015 $)')
print(dd.iloc[11:,:])
fig, ax = plt.subplots(1, 1, figsize=(12, 8))
dd = dd.iloc[:,0:4]
ax.plot(dd)
ax.set_title('Figure 6. SOURCES OF U.S. TREASURY RECEIPTS: Real Change in 12-Month Rolling Sum')
ax.set_xlabel(xlabel_last)
ax.set_ylabel('Billions of 2015 Dollars')
ax.grid(zorder=0)
ax.legend(dd.columns)
fig.savefig(savefig_rec15norm)
Table 6. SOURCES OF U.S. TREASURY RECEIPTS: Real Change in 12-Month Rolling Sum (billions of 2015 $)
            Individual  Corporation  Employment      Other  Deflators
2015-09-01    0.000000     0.000000    0.000000   0.000000   0.997848
2015-10-01    2.368975    -5.969066    3.854764  -2.281594   0.998297
2015-11-01    9.605558    -4.902766    8.059642  -2.211990   1.000409
2015-12-01   12.298787   -12.854634   10.812693  12.279728   1.003839
2016-01-01   13.883375   -13.202442   13.706149  10.747931   1.002182
2016-02-01   37.641014   -13.754942   14.551355  15.092233   1.001358
2016-03-01   27.973728   -11.180660   10.826333  17.394074   0.997065
2016-04-01    2.951846   -19.054759   12.346102  10.470331   0.992360
2016-05-01   13.738350   -21.784313   15.314933   9.235982   0.988361
2016-06-01   -6.223808   -33.573856   28.923152  11.038809   0.985126
2016-07-01  -16.131390   -35.720388   33.678463   1.435678   0.986722
2016-08-01   -5.191974   -36.860274   37.389222   5.675826   0.985817
2016-09-01   -9.322626   -46.465769   41.109895   1.872008   0.983453
2016-10-01    0.885825   -48.384369   41.746703  -0.098798   0.982228
2016-11-01   -2.476285   -51.452284   41.861570  -2.078092   0.983758
2016-12-01  -14.347710   -57.003176   48.553538 -27.785719   0.983436
2017-01-01   -3.299412   -54.978778   51.156397 -21.514070   0.977738
2017-02-01   -8.279656   -49.078271   56.121242 -29.269329   0.974672
2017-03-01   -3.443934   -69.130278   55.261616 -28.998346   0.973880
2017-04-01  -24.842838   -46.986461   60.363715 -27.609922   0.971001
2017-05-01  -19.920441   -45.715350   64.317559 -26.803750   0.970172
2017-06-01   -6.249232   -50.279361   62.339039 -30.425524   0.969292
2017-07-01    4.904943   -50.002483   64.804418 -27.017167   0.969962
2017-08-01   -2.479191   -49.686775   65.739935 -29.747334   0.967066
2017-09-01   -0.679607   -53.644616   66.209814 -42.572120   0.961972
2017-10-01    2.817247   -52.376239   68.966859 -41.659876   0.962581
2017-11-01    7.411497   -55.118530   71.903234 -42.653082   0.962557
2017-12-01   23.553472   -65.877460   68.076767 -44.351564   0.963123
2018-01-01   37.188035   -63.693954   67.999044 -50.957522   0.957905
2018-02-01   21.363786   -67.520907   67.353743 -48.704558   0.953581
2018-03-01   23.220297   -74.716147   66.564353 -52.347520   0.951429
2018-04-01   75.994582   -91.504884   65.232742 -47.679781   0.947662
2018-05-01   62.895123   -93.948552   64.403577 -58.102916   0.943737
2018-06-01   69.435838  -112.458493   46.730588 -56.926855   0.942236
2018-07-01   63.093671  -116.892391   46.641865 -58.147035   0.942172
2018-08-01   57.900365  -121.106794   47.635284 -61.494570   0.941649
2018-09-01   51.699203  -141.029091   49.032699 -48.270873   0.940556
2018-10-01   49.677016  -137.098279   49.313682 -40.241997   0.938897
2018-11-01   43.205411  -136.930557   50.460122 -41.515272   0.942052
2018-12-01   32.291985  -152.755988   57.989540 -39.934425   0.945071
2019-01-01   12.181930  -156.689619   60.482977 -41.909974   0.943272
2019-02-01   21.467945  -154.836088   62.923910 -46.775960   0.939302
2019-03-01   27.833066  -150.798320   65.298050 -46.635142   0.934033
2019-04-01   38.223872  -148.555391   67.806028 -48.358796   0.929113
2019-05-01   46.305612  -150.451964   70.168030 -47.166429   0.927139
2019-06-01   25.780794  -139.559807   91.586736 -48.229071   0.926955
2019-07-01   39.251949  -137.106250   92.709816 -46.317805   0.925409
2019-08-01   37.267406  -135.299695   94.350652 -43.487243   0.925455
2019-09-01   52.845639  -120.302472   96.076535 -54.726091   0.924731
2019-10-01   48.681539  -121.364603   97.515027 -60.776572   0.922622
2019-11-01   57.636173  -119.544976   99.260950 -60.534584   0.923117

As can be seen, real yearly individual income tax receipts have dropped a bit since the high reached in April of 2018, under the old tax rules. Real yearly employment tax receipts have risen slightly and real yearly corporation tax receipts have dropped sharply. It is interesting to note that most of the drop in corporation tax receipts have occurred since the passage of the Tax Cuts and Jobs Act of 2017 so that may be the most visible effect of the tax bill on receipts. The surge in individual tax receipts in April of 2018 likely has little to do with the tax bill since the taxes paid in April are based on the prior tax law. Regarding individual tax receipts, the Washington Times article does say the following:

Analysts said they’ll have a better idea of what’s behind the surge as more information rolls in, but for now said it looks like individual taxpayers are paying more because they have higher incomes.

“Those payments were mostly related to economic activity in 2017 and may reflect stronger-than-expected income growth in that year,” the analysts said in their monthly budget review. “Part of the strength in receipts also may reflect larger-than-anticipated payments for economic activity in 2018. The reasons for the added revenues will be better understood as more detailed information becomes available later this year.”

The following Python code likewise normalizes all sources of receipts to start at zero. However, it adjusts the data to the percent of GDP rather than the CPI rate.

In [43]:
yy = yy0.copy()
deflators = gdp_deflators
zz = dofilter(yy, rollingsum=True, normalize=True, adjust=deflators)
zz = zz.mul(deflators, axis='index')
dd = zz.iloc[:,0:3].copy()
oo = zz.iloc[:,3:9]
dd['Other'] = oo.sum(axis=1, skipna=False)
dd['Deflators']  = deflators
print('Table 7. SOURCES OF U.S. TREASURY RECEIPTS: Change in 12-Month Rolling Sum (percent of GDP)')
print(dd.iloc[11:,:])
fig, ax = plt.subplots(1, 1, figsize=(12, 8))
dd = dd.iloc[:,0:4]
ax.plot(dd)
ax.set_title('Figure 7. SOURCES OF U.S. TREASURY RECEIPTS: Change in 12-Month Rolling Sum (percent of GDP)')
ax.set_xlabel(xlabel_last)
ax.set_ylabel('Percent of GDP')
ax.grid(zorder=0)
ax.legend(dd.columns)
fig.savefig(savefig_recgdpnorm)
Table 7. SOURCES OF U.S. TREASURY RECEIPTS: Change in 12-Month Rolling Sum (percent of GDP)
            Individual  Corporation  Employment     Other  Deflators
2015-09-01    0.000000     0.000000    0.000000  0.000000   0.005451
2015-10-01   -0.000013    -0.000186    0.000060 -0.000088   0.005449
2015-11-01    0.000143    -0.000156    0.000132 -0.000104   0.005449
2015-12-01    0.000132    -0.000441    0.000167  0.000304   0.005449
2016-01-01    0.000122    -0.000453    0.000221  0.000250   0.005428
2016-02-01    0.000804    -0.000468    0.000214  0.000367   0.005428
2016-03-01    0.000481    -0.000408    0.000060  0.000427   0.005428
2016-04-01   -0.000349    -0.000650    0.000069  0.000211   0.005366
2016-05-01   -0.000062    -0.000735    0.000129  0.000161   0.005366
2016-06-01   -0.000710    -0.001114    0.000499  0.000207   0.005366
2016-07-01   -0.001043    -0.001170    0.000595 -0.000089   0.005317
2016-08-01   -0.000767    -0.001205    0.000672  0.000023   0.005317
2016-09-01   -0.000936    -0.001511    0.000758 -0.000100   0.005317
2016-10-01   -0.000691    -0.001555    0.000732 -0.000168   0.005265
2016-11-01   -0.000834    -0.001643    0.000693 -0.000238   0.005265
2016-12-01   -0.001232    -0.001832    0.000855 -0.000993   0.005265
2017-01-01   -0.000990    -0.001769    0.000883 -0.000821   0.005211
2017-02-01   -0.001157    -0.001604    0.000999 -0.001056   0.005211
2017-03-01   -0.001056    -0.002195    0.000931 -0.001060   0.005211
2017-04-01   -0.001771    -0.001571    0.001023 -0.001026   0.005166
2017-05-01   -0.001684    -0.001538    0.001093 -0.001025   0.005166
2017-06-01   -0.001375    -0.001705    0.000973 -0.001143   0.005166
2017-07-01   -0.001115    -0.001680    0.000974 -0.001048   0.005099
2017-08-01   -0.001390    -0.001676    0.000955 -0.001146   0.005099
2017-09-01   -0.001425    -0.001830    0.000929 -0.001531   0.005099
2017-10-01   -0.001395    -0.001768    0.000934 -0.001497   0.005020
2017-11-01   -0.001332    -0.001843    0.000958 -0.001541   0.005020
2017-12-01   -0.000991    -0.002186    0.000793 -0.001601   0.005020
2018-01-01   -0.000755    -0.002117    0.000714 -0.001790   0.004960
2018-02-01   -0.001222    -0.002230    0.000644 -0.001750   0.004960
2018-03-01   -0.001226    -0.002438    0.000563 -0.001868   0.004960
2018-04-01   -0.000013    -0.002899    0.000428 -0.001743   0.004876
2018-05-01   -0.000433    -0.002979    0.000346 -0.002058   0.004876
2018-06-01   -0.000365    -0.003520   -0.000205 -0.002044   0.004876
2018-07-01   -0.000602    -0.003602   -0.000261 -0.002069   0.004819
2018-08-01   -0.000816    -0.003715   -0.000295 -0.002180   0.004819
2018-09-01   -0.001112    -0.004294   -0.000335 -0.001855   0.004819
2018-10-01   -0.001225    -0.004170   -0.000368 -0.001648   0.004785
2018-11-01   -0.001458    -0.004152   -0.000397 -0.001693   0.004785
2018-12-01   -0.001851    -0.004590   -0.000266 -0.001662   0.004785
2019-01-01   -0.002490    -0.004660   -0.000272 -0.001716   0.004740
2019-02-01   -0.002284    -0.004629   -0.000265 -0.001862   0.004740
2019-03-01   -0.002172    -0.004550   -0.000255 -0.001878   0.004740
2019-04-01   -0.002021    -0.004481   -0.000233 -0.001922   0.004686
2019-05-01   -0.001858    -0.004539   -0.000214 -0.001910   0.004686
2019-06-01   -0.002468    -0.004281    0.000284 -0.001949   0.004686
2019-07-01   -0.002152    -0.004190    0.000278 -0.001896   0.004646
2019-08-01   -0.002248    -0.004143    0.000281 -0.001837   0.004646
2019-09-01   -0.001925    -0.003786    0.000283 -0.002139   0.004646
2019-10-01   -0.002067    -0.003790    0.000284 -0.002289   0.004606
2019-11-01   -0.001881    -0.003743    0.000291 -0.002292   0.004606

As can be seen, yearly individual income tax receipts have dropped since the high reached in April of 2018, under the old tax rules, to a level below where they were prior to the tax cut. Yearly employment tax receipts is the only source of receipts that have remained fairly steady as a percent of GDP. However, yearly corporation tax receipts have dropped sharply. In any event, the following Python code shows the real 12-month rolling sum of the other contributors to receipts.

In [44]:
yy = yy0.copy()
deflators = cpi_deflators
zz = dofilter(yy, rollingsum=True, normalize=False, adjust=deflators)
zz = zz.mul(deflators, axis='index')
dd = zz.iloc[:,3:9]
print('Table 8. OTHER SOURCES OF U.S. TREASURY RECEIPTS: 12-Month Rolling Sum (billions of 2015 $)')
print(dd.iloc[11:,:])
fig, ax = plt.subplots(1, 1, figsize=(12, 8))
ax.plot(dd)
ax.set_title('Figure 8. OTHER SOURCES OF U.S. TREASURY RECEIPTS: 12-Month Rolling Sum (billions of 2015 $)')
ax.set_xlabel(xlabel_last)
ax.set_ylabel('Billions of 2015 Dollars')
ax.grid(zorder=0)
ax.legend(dd.columns)
fig.savefig(savefig_recoth15)
Table 8. OTHER SOURCES OF U.S. TREASURY RECEIPTS: 12-Month Rolling Sum (billions of 2015 $)
            Unemployment  Other Retirement     Excise     Estate    Customs  Miscellaneous
2015-09-01     51.183575          3.653813  98.256777  19.250820  35.066480     146.419670
2015-10-01     50.173692          3.672897  97.954076  19.968640  35.026502     144.912917
2015-11-01     51.880997          3.697279  98.422997  20.208471  35.008640     143.308686
2015-12-01     51.622942          3.793515  98.869395  20.462656  35.208930     158.277684
2016-01-01     51.196673          3.742419  98.044499  20.336027  35.133237     157.663011
2016-02-01     50.521327          3.784604  98.148105  20.621863  35.093615     161.998399
2016-03-01     50.313790          3.770568  97.712461  20.478770  35.165442     163.506321
2016-04-01     45.963114          3.754364  97.000817  20.250660  34.339124     161.047220
2016-05-01     48.148762          3.753972  95.952078  19.945985  34.057184     157.845053
2016-06-01     47.861021          3.755384  95.384859  20.280033  33.761953     159.315318
2016-07-01     46.320500          3.784947  94.703213  20.555486  33.258989     152.698464
2016-08-01     47.528498          3.817063  94.227053  21.006560  34.224330     154.437192
2016-09-01     47.681412          3.816178  92.718908  20.871455  34.045716     151.464871
2016-10-01     48.135036          3.820989  92.640850  20.034210  33.596000     149.966418
2016-11-01     46.747951          3.845304  92.335068  19.879613  33.610727     150.338144
2016-12-01     46.756721          3.864669  91.894323  19.580650  33.498201     125.340473
2017-01-01     48.798932          3.903985  90.253868  20.542908  33.154813     128.531704
2017-02-01     45.218678          3.877484  88.563525  20.218050  32.937266     125.528609
2017-03-01     45.096483          3.875352  89.322321  20.521148  32.650268     124.868338
2017-04-01     44.551729          3.873576  87.398157  21.385168  32.694640     126.797998
2017-05-01     43.865676          3.884669  88.443977  21.832841  32.618242     126.567996
2017-06-01     43.873313          3.976042  88.735053  21.581545  32.630558     122.483337
2017-07-01     45.811384          3.953858  90.318562  21.452361  32.724721     122.664612
2017-08-01     43.201423          3.940238  89.883929  21.359169  32.567862     122.215867
2017-09-01     42.869427          3.925890  78.443809  21.324379  32.383161     119.590892
2017-10-01     42.993291          3.930546  80.012529  21.580564  32.503115     118.645488
2017-11-01     42.579103          3.940577  79.871356  21.901410  32.631287     117.740291
2017-12-01     42.535588          3.956424  80.190325  21.681717  32.836906     115.965338
2018-01-01     42.631701          3.945391  80.623935  21.385999  32.805405     107.317487
2018-02-01     42.344083          3.932906  80.621346  22.197017  32.774549     107.559647
2018-03-01     42.237550          3.932117  80.471944  21.638545  33.021116     103.722476
2018-04-01     46.013875          3.928264  82.344310  20.024917  33.218074     102.826275
2018-05-01     41.012734          3.927933  81.089891  19.566628  33.507279      97.436359
2018-06-01     40.920310          3.930711  80.705150  19.634130  33.948074      98.045978
2018-07-01     40.862719          3.950419  80.420917  19.895010  34.724259      96.088312
2018-08-01     40.384421          3.946631  80.853158  19.989800  35.788933      91.445659
2018-09-01     40.208596          4.023847  84.832705  20.548394  36.895764      98.735438
2018-10-01     40.124704          4.028695  90.909981  20.775080  38.796762      98.050196
2018-11-01     39.863782          4.130644  91.337443  20.340792  41.693830      95.164489
2018-12-01     39.971058          4.138466  91.791616  20.335521  44.351182      94.594335
2019-01-01     37.951962          4.006883  92.072782  19.205605  47.283565      92.048115
2019-02-01     37.428333          4.102855  91.143187  18.324542  49.167929      86.128171
2019-03-01     37.116149          4.074006  90.497383  17.739116  50.655755      84.484996
2019-04-01     36.938629          4.075970  90.064011  17.316000  51.873878      80.830781
2019-05-01     35.838026          4.161607  89.990342  16.512861  53.407961      81.680992
2019-06-01     35.771465          4.112528  89.668210  16.035636  55.148588      79.727261
2019-07-01     35.538737          4.133032  89.529101  15.445988  56.973739      80.206047
2019-08-01     35.322319          4.154232  89.164776  15.370711  59.273374      81.388421
2019-09-01     35.247427          4.106192  85.359641  14.393933  61.093510      72.977386
2019-10-01     34.966240          4.118704  77.556996  14.107886  62.748618      72.881222
2019-11-01     34.892663          4.147204  77.448150  13.949440  63.230578      73.129149

As can be seen, real yearly receipts from excise taxes and other retirement taxes remained fairly flat. Real yearly receipts from estate taxes remained fairly flat until this year, when they started to decrease. This is likely due to the increase in the exemption under the 2017 tax cut Real yearly receipts from unemployment taxes have decreased slightly but receipts for miscellaneous sources have dropped sharply, being cut about in half since there high in early 2016. The one source of otehr receipts that has risen is real yearly receipts from custom taxes. This is likely due to the increased trade tariffs under Trump.

Due to the incresing gap between receipts and outlays, the deficit is continuing to grow. The following Python code plots the increase the 12-month rolling sum of the deficit.

In [45]:
yy = yy0.copy()
zz = dofilter(yy, rollingsum=True)
#zz = zz.mul(deflators, axis='index')
dd = zz.iloc[:,[11]]
print('Table 9. U.S. TREASURY SURPLUS/DEFICIT(-): 12-Month Rolling Sum ($billions)')
print(dd.iloc[11:,:])
fig, ax = plt.subplots(1, 1, figsize=(12, 8))
ax.plot(dd)
ax.set_title('Figure 9. U.S. TREASURY SURPLUS/DEFICIT(-): 12-Month Rolling Sum')
ax.set_xlabel(xlabel_last)
ax.set_ylabel('Billions of Dollars')
ax.grid(zorder=0)
ax.legend(dd.columns)
fig.savefig(savefig_def)
Table 9. U.S. TREASURY SURPLUS/DEFICIT(-): 12-Month Rolling Sum ($billions)
            Surplus/Deficit
2015-09-01         -438.899
2015-10-01         -453.744
2015-11-01         -461.475
2015-12-01         -477.783
2016-01-01         -405.074
2016-02-01         -405.334
2016-03-01         -460.459
2016-04-01         -510.713
2016-05-01         -479.152
2016-06-01         -523.387
2016-07-01         -487.019
2016-08-01         -529.711
2016-09-01         -587.413
2016-10-01         -496.686
2016-11-01         -568.806
2016-12-01         -581.699
2017-01-01         -585.605
2017-02-01         -585.039
2017-03-01         -653.229
2017-04-01         -577.256
2017-05-01         -613.172
2017-06-01         -709.657
2017-07-01         -639.777
2017-08-01         -640.354
2017-09-01         -665.713
2017-10-01         -683.096
2017-11-01         -684.974
2017-12-01         -680.829
2018-01-01         -682.849
2018-02-01         -706.044
2018-03-01         -738.555
2018-04-01         -706.728
2018-05-01         -765.101
2018-06-01         -749.726
2018-07-01         -783.652
2018-08-01         -890.111
2018-09-01         -778.995
2018-10-01         -816.272
2018-11-01         -882.628
2018-12-01         -872.975
2019-01-01         -913.531
2019-02-01         -932.269
2019-03-01         -870.470
2019-04-01         -924.421
2019-05-01         -985.393
2019-06-01         -919.012
2019-07-01         -961.842
2019-08-01         -948.038
2019-09-01         -984.386
2019-10-01        -1018.362
2019-11-01        -1022.297

As can be seen, the annual deficit has increased from just under \$600 billion per year when Trump took office to just over a trillion dollars per year now.

Looking at the Change in the Debt

On February 13, 2019, CNSNews.com released a story titled \$1,665,484,000,000: Feds Collect Record Individual Income Taxes in Calendar 2018--as Debt Climbed \$1,481,349,159,596.80. It states:

At the same time the Treasury was collecting record individual income taxes, the federal debt was climbing from \$20,492,746,546,193.75 at the close of 2017 to \$21,974,095,705,790.55 at the close of 2018. That was a one-year increase of \$1,481,349,159,596.80.

In order to verify these numbers, the following code takes data from the Monthly Treasury Statements since September of 2014.

In [46]:
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
from pathlib import Path

def joinyear6(month, year):
    yr = year % 100
    smo = ['00','01','02','03','04','05','06','07','08','09','10','11','12']
    filetype = '.xls'
    if year <= 2015 and month <= 4:
        filetype = '.xlsx'
    if year == 2016 and month == 2:
        filetype = '.xlsx'
    if year == 2018 and month == 7:
        filetype = '.xlsx'
    if year == 2018 and month >= 10:
        filetype = '.xlsx'
    if year == 2019 and month <= 2: # UPDATE IF NEEDED
        filetype = '.xlsx'
    if year == 2019 and month >= 4: # UPDATE IF NEEDED
        filetype = '.xlsx'
    filepath = "https://www.fiscal.treasury.gov/files/reports-statements/mts/mts"+smo[month]+str(yr)+filetype
    print("BEFORE "+filepath)
    if year < 2017:
        xx = pd.read_excel(filepath, sheet_name='Table 6', index_col=0, skiprows=6)
    elif year == 2017 and month <= 3:
        xx = pd.read_excel(filepath, sheet_name='Table 6', index_col=0, skiprows=6)
    elif year == 2018 and month == 11:
        xx = pd.read_excel(filepath, sheet_name='Table 6', index_col=0, skiprows=6)
    elif year >= 2019 and month >= 2 and month <= 3:
        xx = pd.read_excel(filepath, sheet_name='Table 6', index_col=0, skiprows=6)
    elif year >= 2019 and month >= 11 and month <= 11: # Debt Held by the Public on line 12 -> skiprows=6
        xx = pd.read_excel(filepath, sheet_name='Table 6', index_col=0, skiprows=6)
    else: # Debt Held by the Public on line 11 -> skiprows=5 - UPDATE IF NEEDED
        xx = pd.read_excel(filepath, sheet_name='Table 6', index_col=0, skiprows=5)
    
    #print(xx) #DEBUG
    #print(" AFTER "+filepath) #DEBUG
    xx = xx.iloc[4:7, 5]
    #print(xx[0]) #DEBUG
    xx[0] = int(xx[0].replace(',',''))/1000
    xx[1] = int(xx[1].replace(',',''))/1000
    xx[2] = int(xx[2].replace(',',''))/1000
    xx.index = ['Public','Intragov','Gross']
    dd = pd.DataFrame(xx).T
    dd.index = [str(year)+"-"+smo[month]+"-01"] # set index to date
    #print(dd) #DEBUG
    return(dd)

def joinyears6(start_month, start_year, end_month, end_year):
    month = start_month
    year = start_year
    yy = joinyear6(month, year)
    month = month + 1
    if month > 12:
        month = 1
        year = year + 1
    while year < end_year or (year == end_year and month <= end_month):
        xx = joinyear6(month, year)
        yy = yy.append(xx)
        month = month + 1
        if month > 12:
            month = 1
            year = year + 1
    return(yy)

filename = 'mtsdebts_1409_1502.csv'
print("BEFORE "+filename)
zz = pd.read_csv(filename, index_col=0)


filename = 'mtsdebts_1503_1612.csv'
csvfile = Path(filename)
if csvfile.is_file():
    print("BEFORE "+filename)
    yy = pd.read_csv(filename, index_col=0)
else:
    yy = joinyears6(3, 2015, 12, 2016)
    yy.to_csv(filename)

zz = zz.append(yy)
filename = 'mtsdebts_1701_1703.csv'
print("BEFORE "+filename)
yy = pd.read_csv(filename, index_col=0)
zz = zz.append(yy)

#filename = 'mtsdebts_1704_1812.csv'
filename = debt_filename_last
csvfile = Path(filename)
if csvfile.is_file():
    print("BEFORE "+filename)
    yy = pd.read_csv(filename, index_col=0)
else:
    #yy = joinyears6(4, 2017, 12, 2018)
    yy = joinyears6(4, 2017, cmonth_last, cyear_last)
    yy.to_csv(filename)

zz = zz.append(yy)
zz.index = pd.to_datetime(zz.index)
#zz.to_csv('mtsdebts_1503_1812.csv')
zz.to_csv(debt_filename_all)

#zz = pd.read_html(filepath) # for html format
#print(zz)
#print(zz.info())
BEFORE mtsdebts_1409_1502.csv
BEFORE mtsdebts_1503_1612.csv
BEFORE mtsdebts_1701_1703.csv
BEFORE mtsdebts_1704_1911.csv

The following table and graph of the Monthly Treasury Statement numbers show the increase in the national debt.

In [47]:
print('Table 10. U.S. DEBT HELD BY THE PUBLIC AND GROSS DEBT ($billions)')
zz0 = zz
zz0 = zz0.drop('Intragov', 1)
print(zz0)
fig, ax = plt.subplots(1, 1, figsize=(12, 8))
colors = ['C0','C3']
#ax.plot(zz0)
zz0[:].plot(ax = ax, color=colors)
ax.set_title('Figure 10. U.S. DEBT HELD BY THE PUBLIC AND GROSS DEBT')
ax.set_xlabel(xlabel_last)
ax.set_ylabel('Billions of Dollars')
ax.grid(zorder=0)
ax.legend(zz0.columns)
savefig_debts = "mts" + yrmo_last + "debts.png"
if os.path.isfile(savefig_debts):
    os.remove(savefig_debts)
fig.savefig(savefig_debts)
Table 10. U.S. DEBT HELD BY THE PUBLIC AND GROSS DEBT ($billions)
               Public      Gross
2014-09-01  12784.971  17824.071
2014-10-01  12857.056  17937.160
2014-11-01  12922.682  18005.549
2014-12-01  13023.951  18141.444
2015-01-01  12984.930  18082.293
2015-02-01  13074.036  18155.854
2015-03-01  13090.399  18152.056
2015-04-01  13053.681  18152.560
2015-05-01  13052.706  18152.852
2015-06-01  13076.413  18151.998
2015-07-01  13135.044  18151.323
2015-08-01  13119.752  18151.150
2015-09-01  13123.847  18150.618
2015-10-01  13060.656  18152.982
2015-11-01  13588.988  18827.323
2015-12-01  13672.521  18922.179
2016-01-01  13657.154  19012.828
2016-02-01  13785.188  19125.455
2016-03-01  13924.877  19264.939
2016-04-01  13841.194  19187.387
2016-05-01  13886.302  19265.452
2016-06-01  13932.742  19381.591
2016-07-01  13998.219  19427.695
2016-08-01  14104.113  19510.296
2016-09-01  14173.423  19573.445
2016-10-01  14286.500  19805.715
2016-11-01  14443.699  19948.065
2016-12-01  14434.841  19976.827
2017-01-01  14376.138  19937.261
2017-02-01  14411.380  19959.594
...               ...        ...
2017-06-01  14366.185  19844.554
2017-07-01  14360.944  19844.909
2017-08-01  14381.561  19844.533
2017-09-01  14673.428  20244.900
2017-10-01  14751.445  20442.474
2017-11-01  14918.735  20590.392
2017-12-01  14814.720  20492.747
2018-01-01  14803.169  20493.730
2018-02-01  15150.588  20855.672
2018-03-01  15428.009  21089.643
2018-04-01  15335.127  21068.200
2018-05-01  15426.913  21145.215
2018-06-01  15466.563  21195.070
2018-07-01  15569.492  21313.061
2018-08-01  15785.388  21458.850
2018-09-01  15761.154  21516.058
2018-10-01  15843.328  21702.370
2018-11-01  16044.317  21850.094
2018-12-01  16101.666  21974.096
2019-01-01  16101.226  21982.423
2019-02-01  16250.897  22115.526
2019-03-01  16204.391  22027.880
2019-04-01  16192.789  22027.668
2019-05-01  16202.282  22026.424
2019-06-01  16188.421  22023.283
2019-07-01  16211.184  22022.369
2019-08-01  16596.815  22460.467
2019-09-01  16809.091  22719.402
2019-10-01  16981.310  23008.410
2019-11-01  17105.420  23076.199

[63 rows x 2 columns]

As can be seen above, the gross federal debt rose to nearly \$22 trillion at the end of 2018. This is the "federal debt" referenced in the CNSNews.com article. Also shown is the Debt Held by the Public which rose to over \$16 trillion. The difference between these to measures of the debt is the Intragovernmental Holdings. This is described on Wikipedia as follows:

In the United States, intragovernmental holdings are primarily composed of the Medicare Trust Fund, the Social Security Trust Fund, and Federal Financing Bank securities. A small amount of marketable securities are held by government accounts.

An interesting thing apparent in the graph is how the debt totals went flat for most of 2015 and 2017. This was caused by the debt ceiling, explained by this article as follows:

On March 15, 2015, the nation reached the debt ceiling of \$18.113 trillion. In response, the Treasury Secretary stopped issuing new debt. He took extraordinary measures to keep the debt from exceeding the limit. For example, he stopped payments to federal employee retirement funds. He also sold investments held by those funds. He kept the debt under the limit until Congress passed the Bipartisan Budget Act of 2015 on November 15. The ceiling remained suspended until March 15, 2017. That means the Treasury Department could not allow the statutory debt limit to go one penny higher than the \$19.808 trillion it was on that day.

Treasury kept the debt under that ceiling until September 8, 2017.

As explained earlier in that article, that was the day that "President Trump signed a bill increasing the debt ceiling to December 8, 2017".

The following graph looks at the 12-month rolling change in these debts, along with the 12-month rolling sum of the deficit shown earlier.

In [48]:
zzdiff = zz.diff()
zzdiff = -zzdiff.iloc[1:,]
zzdiff['Deficit'] = defs.iloc[0:,2]
zzrs = zzdiff.rolling(window=12).sum()
zzrs = zzrs.iloc[11:,]
#print(zz)
#print(zzdiff)

print('Table 11. U.S. DEBTS AND DEFICIT: 12-Month Rolling Change ($billions)')
print(zzrs)
fig, ax = plt.subplots(1, 1, figsize=(12, 8))
colors = ['C0','C2','C3','C1']
#ax.plot(zzrs)
#zzrs[['Public','Intragov','Gross','Deficit']].plot(ax = ax, color=colors)
zzrs[:].plot(ax = ax, color=colors)
ax.set_title('Figure 11. U.S. DEBTS AND DEFICIT: 12-Month Rolling Change')
ax.set_xlabel(xlabel_last)
ax.set_ylabel('Billions of Dollars')
ax.grid(zorder=0)
ax.legend(zzrs.columns)
savefig_debts12m = "mts" + yrmo_last + "debts12m.png"
if os.path.isfile(savefig_debts12m):
    os.remove(savefig_debts12m)
fig.savefig(savefig_debts12m)
Table 11. U.S. DEBTS AND DEFICIT: 12-Month Rolling Change ($billions)
              Public  Intragov     Gross   Deficit
2015-09-01  -338.876    12.330  -326.547  -438.899
2015-10-01  -203.600   -12.221  -215.822  -453.744
2015-11-01  -666.306  -155.466  -821.774  -461.475
2015-12-01  -648.570  -132.164  -780.735  -477.783
2016-01-01  -672.224  -258.309  -930.535  -405.074
2016-02-01  -711.152  -258.448  -969.601  -405.334
2016-03-01  -834.478  -278.404 -1112.883  -460.459
2016-04-01  -787.513  -247.314 -1034.827  -510.713
2016-05-01  -833.596  -279.004 -1112.600  -479.152
2016-06-01  -856.329  -373.265 -1229.593  -523.387
2016-07-01  -863.175  -413.197 -1276.372  -487.019
2016-08-01  -984.361  -374.786 -1359.146  -529.711
2016-09-01 -1049.576  -373.251 -1422.827  -587.413
2016-10-01 -1225.844  -426.890 -1652.733  -496.686
2016-11-01  -854.711  -266.031 -1120.742  -568.806
2016-12-01  -762.320  -292.328 -1054.648  -581.699
2017-01-01  -718.984  -205.450  -924.433  -585.605
2017-02-01  -626.192  -207.947  -834.139  -585.039
2017-03-01  -444.804  -136.677  -581.481  -653.229
2017-04-01  -452.150  -206.592  -658.742  -577.256
2017-05-01  -412.674  -167.816  -580.490  -613.172
2017-06-01  -433.443   -29.520  -462.963  -709.657
2017-07-01  -362.725   -54.490  -417.214  -639.777
2017-08-01  -277.448   -56.788  -334.237  -640.354
2017-09-01  -500.005  -171.450  -671.455  -665.713
2017-10-01  -464.945  -171.812  -636.759  -683.096
2017-11-01  -475.036  -167.291  -642.327  -684.974
2017-12-01  -379.879  -136.040  -515.920  -680.829
2018-01-01  -427.031  -129.437  -556.469  -682.849
2018-02-01  -739.208  -156.869  -896.078  -706.044
2018-03-01 -1058.328  -184.895 -1243.223  -738.555
2018-04-01 -1041.783  -180.287 -1222.071  -706.728
2018-05-01 -1127.937  -171.337 -1299.273  -765.101
2018-06-01 -1100.378  -250.137 -1350.516  -749.726
2018-07-01 -1208.548  -259.603 -1468.152  -783.652
2018-08-01 -1403.827  -210.490 -1614.317  -890.111
2018-09-01 -1087.726  -183.433 -1271.158  -778.995
2018-10-01 -1091.883  -168.013 -1259.896  -816.272
2018-11-01 -1125.582  -134.120 -1259.702  -882.628
2018-12-01 -1286.946  -194.404 -1481.349  -872.975
2019-01-01 -1298.057  -190.636 -1488.693  -913.531
2019-02-01 -1100.309  -159.546 -1259.854  -932.269
2019-03-01  -776.382  -161.855  -938.237  -870.470
2019-04-01  -857.662  -101.807  -959.468  -924.421
2019-05-01  -775.369  -105.839  -881.209  -985.393
2019-06-01  -721.858  -106.356  -828.213  -919.012
2019-07-01  -641.692   -67.616  -709.308  -961.842
2019-08-01  -811.427  -190.190 -1001.617  -948.038
2019-09-01 -1047.937  -155.405 -1203.344  -984.386
2019-10-01 -1137.982  -168.059 -1306.040 -1018.362
2019-11-01 -1061.103  -165.002 -1226.105 -1022.297

As can be seen in the table and graph above, the 12-month changes in the public and gross debts were generally larger (negatively) than the 12-month rolling sum of the deficit. However, the change in the debts reached a minimum in October of 2015 and August of 2017. Non-coincidently, these were the final months of the debt crises after which the debts caught up and continued their prior trends. Since it's been well over a year since the 2017 debt ceiling crisis ended, the latest 12-month rolling changes should not be much affected by it. It's not surprising that the change in the gross federal debt is larger since it includes intergovernmental debt. However, it does seem strange that the change in the Debt Held by the Public is so much larger, at over \$1.287 trillion. This would seem to merit further investigation.

In any event, one likely factor in the increasing debts and deficits is the Tax Cuts and Jobs Act of 2017. The [aforementioned CNSNews.com article] (https://www.cnsnews.com/news/article/terence-p-jeffrey/1665484000000-feds-collect-record-individual-income-taxes-calendar) concluded:

Even as inflation-adjusted individual income taxes increased from calendar year 2017 to calendar year 2018, total federal tax collections declined.

In calendar 2017, total federal tax collections in constant December 2018 dollars were \$3,407,503,740,000. In calendar year 2018, they were \$3,330,470,000,000—a decline of \$77,033,740,000 from 2017.

Corporation income tax collections declined significantly from calendar year 2017 to calendar year 2018. In calendar 2017, the Treasury collected \$290,978,980,000 in corporation income taxes (in constant December 2018 dollars). In calendar 2018, the Treasury collected \$195,790,000,000 in corporation income taxes—a drop of \$95,188,980,000.

That was a decline in corporation income tax revenue of 32.7 percent.

Note: The Jupyter Notebook from which this post is generated can be found at http://econdataus.com/mts1911.ipynb. It is identical to the one at http://econdataus.com/mts1804.ipynb except that data on the debt was added in December 2018 and it has been updated through November 2019. Links to additional Jupyter Notebooks can be found at http://econdataus.com/jupyter.html.