FileAttachment("SP500@1.csv").csv()
.then(dataArray => {
let positiveValues = dataArray.filter(d => +d.change >= 1).map(d => +d.change);
let negativeValues = dataArray.filter(d => +d.change < 1).map(d => +d.change);
let greenScale = d3.scaleSequential(d3.interpolateGreens)
.domain([d3.min(positiveValues), d3.max(positiveValues)]);
let redScale = d3.scaleSequential(d3.interpolateReds)
.domain([d3.max(negativeValues), d3.min(negativeValues)]);
dataArray.map(datum => {
let tradingDate = new Date(datum.date);
let percentChange = ((datum.change - 1) * 100).toLocaleString('en-US', {maximumFractionDigits: 2});
let calendarDate =
d3.selectAll('.dateBox.date' + tradingDate.toDateString().replaceAll(" ", "_"))
.style('background-color', d => {
let bgColor = datum.change >= 1 ? greenScale(datum.change) : redScale(datum.change);
return bgColor || '#FFF'
})
.attr('title', "Trading Date: " + tradingDate.toDateString() + "\nDaily Return: " + percentChange + "%")
})
});