Compare commits

..

No commits in common. "8916d10b634dfb69746866cbd1b108f111b32551" and "a766f6ff0d3b45785e66cdfc670d17a95d794f6d" have entirely different histories.

8 changed files with 24 additions and 25 deletions

1
.gitignore vendored
View file

@ -9,4 +9,3 @@ dist/
build/
.pytest_cache/
planning/
dashboard.log

View file

@ -20,7 +20,7 @@ All data is drawn from public, open-access sources:
| Source | Publisher | What We Use | Coverage |
|--------|-----------|-------------|----------|
| **IPEDS** | U.S. Dept. of Education, NCES | Institutional directory, expenses by function, staffing by occupation, enrollment, endowment, philanthropic gifts | 2005-2024 |
| **IRS Form 990** | Internal Revenue Service | Executive compensation (Schedule J), filing financials for UD and UD Research Foundation | Tax years 2015-2025 |
| **IRS Form 990** | Internal Revenue Service | Executive compensation (Schedule J), filing financials for UD and UD Research Foundation | Tax years 2015-2023 |
| **BLS CPI-U** | Bureau of Labor Statistics | Consumer Price Index for inflation adjustment (series CUUR0000SA0) | Full history |
| **UD Staff Directories** | University of Delaware public web pages | Administrative office headcounts (College of Engineering line management, Provost's Office) | Current snapshot |
@ -80,6 +80,6 @@ employees only (FTPT=2).
### License
This project is released under the MIT License.
This project is released under the MIT License. Copyright (c) 2026 Eric Furst.
"""),
], style={"maxWidth": "900px", "margin": "0 auto", "lineHeight": "1.6"})

View file

@ -164,12 +164,12 @@ def layout(conn: duckdb.DuckDBPyConnection):
),
html.Div(
[
html.Div(dcc.Graph(id="comp-breakdown-chart", config={"displaylogo": False}), style={"flex": "1"}),
html.Div(dcc.Graph(figure=cpi_fig, config={"displaylogo": False}), style={"flex": "1"}),
html.Div(dcc.Graph(id="comp-breakdown-chart"), style={"flex": "1"}),
html.Div(dcc.Graph(figure=cpi_fig), style={"flex": "1"}),
],
style={"display": "flex", "gap": "16px", "marginTop": "16px"},
),
dcc.Graph(figure=role_fig, config={"displaylogo": False}),
dcc.Graph(figure=role_fig),
])

View file

@ -190,12 +190,12 @@ def layout(conn: duckdb.DuckDBPyConnection):
charts = [
kpi_row,
dcc.Graph(figure=value_fig, config={"displaylogo": False}),
dcc.Graph(figure=eps_fig, config={"displaylogo": False}),
dcc.Graph(figure=components_fig, config={"displaylogo": False}),
dcc.Graph(figure=rate_fig, config={"displaylogo": False}),
dcc.Graph(figure=value_fig),
dcc.Graph(figure=eps_fig),
dcc.Graph(figure=components_fig),
dcc.Graph(figure=rate_fig),
]
if cio_df.height > 1:
charts.append(dcc.Graph(figure=cio_fig, config={"displaylogo": False}))
charts.append(dcc.Graph(figure=cio_fig))
return html.Div(charts)

View file

@ -107,10 +107,10 @@ def layout(conn: duckdb.DuckDBPyConnection):
kpi_row,
html.Div(
[
html.Div(dcc.Graph(figure=unit_fig, config={"displaylogo": False}), style={"flex": "1"}),
html.Div(dcc.Graph(figure=pie_fig, config={"displaylogo": False}), style={"flex": "1"}),
html.Div(dcc.Graph(figure=unit_fig), style={"flex": "1"}),
html.Div(dcc.Graph(figure=pie_fig), style={"flex": "1"}),
],
style={"display": "flex", "gap": "16px"},
),
dcc.Graph(figure=cat_fig, config={"displaylogo": False}),
dcc.Graph(figure=cat_fig),
])

View file

@ -156,12 +156,12 @@ def layout(conn: duckdb.DuckDBPyConnection):
return html.Div([
kpi_row,
dcc.Graph(figure=ratio_fig, config={"displaylogo": False}),
dcc.Graph(figure=breakdown_fig, config={"displaylogo": False}),
dcc.Graph(figure=ratio_fig),
dcc.Graph(figure=breakdown_fig),
html.Div(
[
html.Div(dcc.Graph(figure=aps_fig, config={"displaylogo": False}), style={"flex": "1"}),
html.Div(dcc.Graph(figure=afr_fig, config={"displaylogo": False}), style={"flex": "1"}),
html.Div(dcc.Graph(figure=aps_fig), style={"flex": "1"}),
html.Div(dcc.Graph(figure=afr_fig), style={"flex": "1"}),
],
style={"display": "flex", "gap": "16px"},
),

View file

@ -123,10 +123,10 @@ def layout(conn: duckdb.DuckDBPyConnection):
charts = [
kpi_row,
dcc.Graph(figure=gifts_fig, config={"displaylogo": False}),
dcc.Graph(figure=split_fig, config={"displaylogo": False}),
dcc.Graph(figure=gifts_fig),
dcc.Graph(figure=split_fig),
]
if cvp_df.height > 1:
charts.append(dcc.Graph(figure=cvp_fig, config={"displaylogo": False}))
charts.append(dcc.Graph(figure=cvp_fig))
return html.Div(charts)

View file

@ -85,17 +85,17 @@ def layout(conn: duckdb.DuckDBPyConnection):
))
growth_fig.add_hline(y=100, line_dash="dot", line_color="#ccc")
growth_fig.update_layout(
title="Management Growth (Indexed, Base Year = 100)",
title="Management vs Faculty vs Enrollment Growth (Indexed, Base Year = 100)",
xaxis_title="Year", yaxis_title="Index",
template="plotly_white", height=380,
)
return html.Div([
dcc.Graph(figure=comp_fig, config={"displaylogo": False}),
dcc.Graph(figure=comp_fig),
html.Div(
[
html.Div(dcc.Graph(figure=ratio_fig, config={"displaylogo": False}), style={"flex": "1"}),
html.Div(dcc.Graph(figure=growth_fig, config={"displaylogo": False}), style={"flex": "1"}),
html.Div(dcc.Graph(figure=ratio_fig), style={"flex": "1"}),
html.Div(dcc.Graph(figure=growth_fig), style={"flex": "1"}),
],
style={"display": "flex", "gap": "16px"},
),