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