storm_event_data = {
const raw_chunks = [];
raw_chunks.push(await FileAttachment("storms2017_00.csv").csv());
raw_chunks.push(await FileAttachment("storms2017_01.csv").csv());
raw_chunks.push(await FileAttachment("storms2018_00.csv").csv());
raw_chunks.push(await FileAttachment("storms2018_01.csv").csv());
raw_chunks.push(await FileAttachment("storms2015_00.csv").csv());
raw_chunks.push(await FileAttachment("storms2015_01.csv").csv());
raw_chunks.push(await FileAttachment("storms2016_00.csv").csv());
raw_chunks.push(await FileAttachment("storms2016_01.csv").csv());
const raw_data = d3.merge(raw_chunks);
raw_data.map(d => {
const year = d.BEGIN_YEARMONTH.slice(0,4);
const month = d.BEGIN_YEARMONTH.slice(4,6);
const hour = d.BEGIN_TIME.slice(0,2);
const minute = d.BEGIN_TIME.slice(2,4);
d.date_str = `${year}-${month}-${d.BEGIN_DAY.padStart(2, '0')}`;
d.date = new Date(+year, +month - 1, d.BEGIN_DAY.padStart(2, '0'), +hour, +minute);
});
const grouped_data = d3.group(raw_data, d => d.date_str, d => d.STATE, d => d.EVENT_TYPE);
const date_extent = d3.extent(raw_data.map(d => new Date(d.date_str)));
const all_dates = d3.timeDay.range(date_extent[0], d3.timeDay.offset(date_extent[1], 2)).map(d => d3.timeFormat("%Y-%m-%d")(d));
return all_dates.map(d => {
const state_data = grouped_data.has(d) ? [...grouped_data.get(d).entries()].map(s => ({state: s[0], events: [...s[1].entries()].map(e => ({event: e[0], values: e[1]}))})) : [];
return {
date: new Date(d),
states: state_data
};
});
}