File size: 5,358 Bytes
180d8ec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53da1d8
180d8ec
 
 
 
 
 
 
 
 
 
 
53da1d8
180d8ec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9ca4933
180d8ec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38803fd
180d8ec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# %%
# imports
import gradio as gr
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# %%
# import data
data = pd.read_excel("graph_data.xlsx",
                     sheet_name = "Sheet1",
                     header = 0
)

# clean data
# rename year column
data = data.rename(columns = {"Unnamed: 0": "Year"})
# drop rows without data
# data = data.drop([0,1,2,3,4,5,6,7,8,9,10,11])
# keep columns of interest
data = data[[
    "Year",
    "Total Revenues",
    "Debt Balance",
    "Revenues ex SS OASDI",
    "Average Rate on Federal Debt", 
    "Net Interest / Revenues (Baseline)", 
    "Net Interest / Revenues ex SS OASDI (Baseline)"
    ]]

print(data)


# %%
baseline_interest_rate = 3.67

def plot_interest_coverage(interest_rate):

    # calculate the yearly increase in the interest rate based on the projected interest rate in 2054
    yearly_increase = (interest_rate - baseline_interest_rate) / (2054 - 2025) / 100

    # add a projected average rate on federal debt column
    data["Average Rate on Federal Debt (Projected)"] = np.where(
        data["Year"].astype(int) < 2026, 
        data["Average Rate on Federal Debt"], 
        data["Average Rate on Federal Debt"] + (yearly_increase * (data["Year"].astype(int) - 2025)))
    
    # add a projected interest / revenues column
    data["Net Interest / Revenues (Projected)"] = np.where(
        data["Year"].astype(int) < 2026, 
        data["Net Interest / Revenues (Baseline)"], 
        data["Average Rate on Federal Debt (Projected)"] * data["Debt Balance"] / data["Total Revenues"])
    
    # add a projected interest / revenues ex SS OASDI column
    data["Net Interest / Revenues ex SS OASDI (Projected)"] = np.where(
        data["Year"].astype(int) < 2026, 
        data["Net Interest / Revenues ex SS OASDI (Baseline)"], 
        data["Average Rate on Federal Debt (Projected)"] * data["Debt Balance"] / data["Revenues ex SS OASDI"])

    # Create the plot
    plt.figure(figsize = (10, 4.8))
    # plot average rate on federal debt
    plt.plot(
        data["Year"], 
        data["Average Rate on Federal Debt"], 
        color = "Green", 
        label = "Average Rate on Federal Debt"
    )
    # plot average rate on federal debt projected
    plt.plot(
        data["Year"], 
        data["Average Rate on Federal Debt (Projected)"], 
        color = "Green", 
        label = "Average Rate on Federal Debt (Projected)",
        linestyle = "--"
    )
    # plot interest / revenues (baseline)
    plt.plot(
        data["Year"], 
        data["Net Interest / Revenues (Baseline)"], 
        color = "Blue", 
        label = "Net Interest / Revenues (Baseline)"
    )
    # plot interest / revenues (projected)
    plt.plot(
        data["Year"], 
        data["Net Interest / Revenues (Projected)"], 
        color = "Blue", 
        label = "Net Interest / Revenues (Projected)",
        linestyle = "--"
    )
    # plot interest / revenues ex ss oasdi (baseline)
    plt.plot(
        data["Year"], 
        data["Net Interest / Revenues ex SS OASDI (Baseline)"], 
        color = "Orange", 
        label = "Net Interest / Revenues ex SS OASDI (Baseline)"
    )
    # plot interest / revenues ex ss oasdi (projected)
    plt.plot(
        data["Year"], 
        data["Net Interest / Revenues ex SS OASDI (Projected)"], 
        color = "Orange", 
        label = "Net Interest / Revenues ex SS OASDI (Projected)",
        linestyle = "--"
    )
    plt.title("Interest as Share of Revenues Through 2054")
    plt.legend(loc = "upper left")
    plt.ylim(0, 1.05)
    plt.yticks(np.arange(0, 1.1, 0.1))
    plt.xticks(range(1940,2055,4), rotation = 45)
    plt.axvline(x = 2024, color = "black")
    plt.grid(True, axis = 'y', linestyle = '--', linewidth = 0.7)
    
    # Save the plot to a file
    plt.savefig("interest_coverage.png")
    plt.close()
    
    # Return the path to the image file
    return "interest_coverage.png"

# %%
interest_rate_lowerbound = 0
interest_rate_upperbound = 15

with gr.Blocks() as interface:
    # Create the image output
    graph = gr.Image(type="filepath", label = "Graph", value = plot_interest_coverage(baseline_interest_rate))
    
    # Create the slider input below the image
    interest_rate_slider = gr.Slider(
        interest_rate_lowerbound, 
        interest_rate_upperbound, 
        step = .1,
        value = baseline_interest_rate, 
        label = "2054 Projected Average Interest Rate on Federal Debt"
    )

    gr.Markdown('<p style="font-size:11px;">Source: CBO June 2024  An Update to the Budget and Economic Outlook: 2024 to 2034, March 2024 report The Long-Term Budget Outlook: 2024 to 2054, and author\'s calculations. Scenario of higher interest rate is author\'s calculations. Data points for 2035-2054 calculated to build on CBO\'s June 2024 10-year update and be consistent with the March 2024 long-term report. Historical Social Security OASDI payroll tax revenue from Table 4-3 of the SSA\'s Trust Fund Data, and projections from the CBO\'s August 2024 Long Term Projections for Social Security.</p>')

    # Set up an action that updates the graph when the slider value changes
    interest_rate_slider.change(
        plot_interest_coverage, 
        inputs = interest_rate_slider, 
        outputs = graph
    )

# Launch the interface
interface.launch(share = True)