Public
Edited
Aug 23, 2021
2 stars
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
endpoint = 'https://api.fiscaldata.treasury.gov/services/api/fiscal_service/v2/accounting/od/debt_to_penny'
Insert cell
data = {
const resolve = (url = endpoint, acc = []) => {
const data = d3.json(url).then((response) => {
const next = acc.concat(
response.data.map((d) => ({
date: d3.utcParse("%Y-%m-%d")(d.record_date),
value: +d.tot_pub_debt_out_amt
})
));

if (response.links.next) {
return resolve(`${endpoint}?${response.links.next}`, next);
}

return next;
});
return data;
};
return resolve();
}
Insert cell
cagr = slice => {
const { date: startDate, value: startValue } = slice[0];
const { date: endDate, value: endValue } = slice[slice.length - 1];
const diffMs = endDate.getTime() - startDate.getTime();
const totalYears = diffMs / (1000 * 60 * 60 * 24 * 365);

return (Math.pow(endValue / startValue, 1 / totalYears) - 1) * 100;
}
Insert cell
congressionalData = {
// Slice all data returned by the endpoint to just the periods representing complete Congresses.
// For this analysis, Jan. 4, 1995 – Jan. 3, 2021 is the period of interest.
const slice = data.slice(
data.findIndex(
d =>
d.date.getUTCMonth() === 0 &&
d.date.getUTCDate() >= 4 &&
d.date.getUTCFullYear() === 1995
),
_.findLastIndex(
data,
d =>
d.date.getUTCMonth() === 0 &&
d.date.getUTCDate() <= 4 &&
d.date.getUTCFullYear() === 2021
)
);

let congress = 104;
let year = 1995;
const congresses = {};

for (let i = 0; i < slice.length; i++) {
const date = slice[i].date;

// When we hit the 4th day of the year two years in the future, we've started the next Congress.
if (date.getUTCFullYear() === year + 2 && date.getUTCDate() >= 4) {
congress++;
year += 2;
}

Array.isArray(congresses[congress])
? congresses[congress].push(slice[i])
: (congresses[congress] = [slice[i]]);
}

return congresses;
}
Insert cell
congressesByParty = ({
104: 'rep',
105: 'rep',
106: 'rep',
107: 'split',
108: 'rep',
109: 'rep',
110: 'dem',
111: 'dem',
112: 'split',
113: 'split',
114: 'split',
115: 'rep',
116: 'split'
})
Insert cell
congressesByPresidentialParty = ({
104: 'dem',
105: 'dem',
106: 'dem',
107: 'rep',
108: 'rep',
109: 'rep',
110: 'rep',
111: 'dem',
112: 'dem',
113: 'dem',
114: 'dem',
115: 'rep',
116: 'rep'
})
Insert cell
Insert cell
colors = ({
dem: '#2563EB',
rep: '#DC2626',
split: '#7C3AED',
annotation: '#4B5563',
label: '#000000',
// Democratic Congress, Democratic President
demdem: '#2563EB',
// Democratic Congress, Republican President
demrep: '#70a5ff',
// Split Congress, Democratic President
splitdem: '#96a2fb',
// Split Congress, Republican President
splitrep: '#d582f7',
// Republican Congress, Democratic President
repdem: '#f36785',
// Republican Congress, Republican President
reprep: '#DC2626'
})
Insert cell
height = 600
Insert cell
margin = ({ top: 40, left: 60, right: 40, bottom: 40 });
Insert cell
Insert cell
d3 = require('d3@6');
Insert cell
_ = require('lodash');
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more