fiscal-lab / app.py
Joseph Spada
change x axis
9ca4933
# %%
# 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)