Spaces:
Sleeping
Sleeping
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 |
+
|