Joseph Spada commited on
Commit
180d8ec
·
1 Parent(s): 76abe57

add application file

Browse files
interactive_interest_coverage_graph.py ADDED
@@ -0,0 +1,150 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # %%
2
+ # imports
3
+ import gradio as gr
4
+ import matplotlib.pyplot as plt
5
+ import numpy as np
6
+ import pandas as pd
7
+
8
+ # %%
9
+ # import data
10
+ data = pd.read_excel("graph_data.xlsx",
11
+ sheet_name = "Sheet1",
12
+ header = 0
13
+ )
14
+
15
+ # clean data
16
+ # rename year column
17
+ data = data.rename(columns = {"Unnamed: 0": "Year"})
18
+ # drop rows without data
19
+ data = data.drop([0,1,2,3,4,5,6,7,8,9,10,11])
20
+ # keep columns of interest
21
+ data = data[[
22
+ "Year",
23
+ "Total Revenues",
24
+ "Debt Balance",
25
+ "Revenues ex SS OASDI",
26
+ "Average Rate on Federal Debt",
27
+ "Net Interest / Revenues (Baseline)",
28
+ "Net Interest / Revenues ex SS OASDI (Baseline)"
29
+ ]]
30
+
31
+
32
+
33
+ # %%
34
+ baseline_interest_rate = 3.67
35
+
36
+ def plot_interest_coverage(interest_rate):
37
+
38
+ # calculate the yearly increase in the interest rate based on the projected interest rate in 2054
39
+ yearly_increase = (interest_rate - baseline_interest_rate) / (2054 - 2025) / 100
40
+
41
+ # add a projected average rate on federal debt column
42
+ data["Average Rate on Federal Debt (Projected)"] = np.where(
43
+ data["Year"].astype(int) < 2026,
44
+ data["Average Rate on Federal Debt"],
45
+ data["Average Rate on Federal Debt"] + (yearly_increase * (data["Year"].astype(int) - 2025)))
46
+
47
+ # add a projected interest / revenues column
48
+ data["Net Interest / Revenues (Projected)"] = np.where(
49
+ data["Year"].astype(int) < 2026,
50
+ data["Net Interest / Revenues (Baseline)"],
51
+ data["Average Rate on Federal Debt (Projected)"] * data["Debt Balance"] / data["Total Revenues"])
52
+
53
+ # add a projected interest / revenues ex SS OASDI column
54
+ data["Net Interest / Revenues ex SS OASDI (Projected)"] = np.where(
55
+ data["Year"].astype(int) < 2026,
56
+ data["Net Interest / Revenues ex SS OASDI (Baseline)"],
57
+ data["Average Rate on Federal Debt (Projected)"] * data["Debt Balance"] / data["Revenues ex SS OASDI"])
58
+
59
+ # Create the plot
60
+ plt.figure(figsize = (10, 4.8))
61
+ # plot average rate on federal debt
62
+ plt.plot(
63
+ data["Year"],
64
+ data["Average Rate on Federal Debt"],
65
+ color = "Green",
66
+ label = "Average Rate on Federal Debt"
67
+ )
68
+ # plot average rate on federal debt projected
69
+ plt.plot(
70
+ data["Year"],
71
+ data["Average Rate on Federal Debt (Projected)"],
72
+ color = "Green",
73
+ label = "Average Rate on Federal Debt (Projected)",
74
+ linestyle = "--"
75
+ )
76
+ # plot interest / revenues (baseline)
77
+ plt.plot(
78
+ data["Year"],
79
+ data["Net Interest / Revenues (Baseline)"],
80
+ color = "Blue",
81
+ label = "Net Interest / Revenues (Baseline)"
82
+ )
83
+ # plot interest / revenues (projected)
84
+ plt.plot(
85
+ data["Year"],
86
+ data["Net Interest / Revenues (Projected)"],
87
+ color = "Blue",
88
+ label = "Net Interest / Revenues (Projected)",
89
+ linestyle = "--"
90
+ )
91
+ # plot interest / revenues ex ss oasdi (baseline)
92
+ plt.plot(
93
+ data["Year"],
94
+ data["Net Interest / Revenues ex SS OASDI (Baseline)"],
95
+ color = "Orange",
96
+ label = "Net Interest / Revenues ex SS OASDI (Baseline)"
97
+ )
98
+ # plot interest / revenues ex ss oasdi (projected)
99
+ plt.plot(
100
+ data["Year"],
101
+ data["Net Interest / Revenues ex SS OASDI (Projected)"],
102
+ color = "Orange",
103
+ label = "Net Interest / Revenues ex SS OASDI (Projected)",
104
+ linestyle = "--"
105
+ )
106
+ plt.title("Interest as Share of Revenues Through 2054")
107
+ plt.legend(loc = "upper left")
108
+ plt.ylim(0, 1.05)
109
+ plt.yticks(np.arange(0, 1.1, 0.1))
110
+ plt.xticks(range(1962,2055,2), rotation = 90)
111
+ plt.axvline(x = 2024, color = "black")
112
+ plt.grid(True, axis = 'y', linestyle = '--', linewidth = 0.7)
113
+
114
+ # Save the plot to a file
115
+ plt.savefig("interest_coverage.png")
116
+ plt.close()
117
+
118
+ # Return the path to the image file
119
+ return "interest_coverage.png"
120
+
121
+ # %%
122
+ interest_rate_lowerbound = 0
123
+ interest_rate_upperbound = 15
124
+
125
+ with gr.Blocks() as interface:
126
+ # Create the image output
127
+ graph = gr.Image(type="filepath", label = "Graph", value = plot_interest_coverage(baseline_interest_rate))
128
+
129
+ # Create the slider input below the image
130
+ interest_rate_slider = gr.Slider(
131
+ interest_rate_lowerbound,
132
+ interest_rate_upperbound,
133
+ step = .1,
134
+ value = baseline_interest_rate,
135
+ label = "2054 Projected Interest Rate"
136
+ )
137
+
138
+ 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>')
139
+
140
+ # Set up an action that updates the graph when the slider value changes
141
+ interest_rate_slider.change(
142
+ plot_interest_coverage,
143
+ inputs = interest_rate_slider,
144
+ outputs = graph
145
+ )
146
+
147
+ # Launch the interface
148
+ interface.launch(share = True)
149
+
150
+