Published
Edited
Jan 21, 2022
Importers
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
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
combinedDataRaw = d3.csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vQ3DZpMeuAoQjS6Uvsh3JkIA3JDavxFQtTlCzrIGAxp1bWgGNW0ydi3AdOsejkYlPo4pmu3dskigvVS/pub?gid=1918821880&single=true&output=csv")
Insert cell
Object.keys(combinedDataRaw[2])
Insert cell
combinedData = {
let retObj = [];
let keys = Object.keys(combinedDataRaw[1]);
combinedDataRaw.forEach(obj => {
for (let i = 1; i < keys.length; i++) {
retObj.push({
// date: obj["Date"],
date: new Date(parseInt("20" + obj.Date.split("-")[1]), months.indexOf(obj.Date.split("-")[0])),
volume: Number(obj[keys[i]]),
division: keys[i]
});
}
});
return retObj;
}
Insert cell
function oneToMany(arr) {
let retObj = [];
let keys = Object.keys(arr[0]);
arr.forEach(obj => {
for (let i = 1; i < keys.length; i++) {
retObj.push({
date: new Date(parseInt("20" + obj.Date.split("-")[1]), months.indexOf(obj.Date.split("-")[0])),
division: keys[i],
value: Number(obj[keys[i]])
});
}
});
return retObj;
}
Insert cell
oneToMany(combinedDataRaw)
Insert cell
infrastructureData = d3.csv('https://docs.google.com/spreadsheets/d/e/2PACX-1vQ3DZpMeuAoQjS6Uvsh3JkIA3JDavxFQtTlCzrIGAxp1bWgGNW0ydi3AdOsejkYlPo4pmu3dskigvVS/pub?gid=936813344&single=true&output=csv')
Insert cell
oneToMany(infrastructureData)
Insert cell
cardsVolRaw = d3.csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vQ3DZpMeuAoQjS6Uvsh3JkIA3JDavxFQtTlCzrIGAxp1bWgGNW0ydi3AdOsejkYlPo4pmu3dskigvVS/pub?gid=490584529&single=true&output=csv")
Insert cell
cardsVal = d3.csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vQ3DZpMeuAoQjS6Uvsh3JkIA3JDavxFQtTlCzrIGAxp1bWgGNW0ydi3AdOsejkYlPo4pmu3dskigvVS/pub?gid=111967515&single=true&output=csv")
Insert cell
oneToMany(cardsVal)
Insert cell
monthlyData = d3.csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vQ3DZpMeuAoQjS6Uvsh3JkIA3JDavxFQtTlCzrIGAxp1bWgGNW0ydi3AdOsejkYlPo4pmu3dskigvVS/pub?gid=0&single=true&output=csv", (d) => {
return {
date: new Date(parseInt("20" + d.Date.split("-")[1]), months.indexOf(d.Date.split("-")[0])),
volume: Number(d.Volume),
value: Number(d.Value)
}
});
Insert cell
appsData = d3.csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vQ3DZpMeuAoQjS6Uvsh3JkIA3JDavxFQtTlCzrIGAxp1bWgGNW0ydi3AdOsejkYlPo4pmu3dskigvVS/pub?gid=747990111&single=true&output=csv", (d) => {
return {
date: new Date(parseInt("20" + d.Date.split("-")[1]), months.indexOf(d.Date.split("-")[0])+1),
app: d.App,
volume: Number(d.Volume),
value: Number(d.Value)
}
})
Insert cell
groups = d3.groups(appsData, d => d.date)
Insert cell
newGroups = groups.map(a => {
let valSum = a[1].reduce((a, b) => a + b.value, 0);
return (a[1].map(o => Object.assign(o, {percentageValue: (o.value/valSum)*100})).sort((a, b) => b.percentageValue - a.percentageValue)).slice(0, 8);
}).flat()
Insert cell
month = d3.csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vQ3DZpMeuAoQjS6Uvsh3JkIA3JDavxFQtTlCzrIGAxp1bWgGNW0ydi3AdOsejkYlPo4pmu3dskigvVS/pub?gid=0&single=true&output=csv", d => {
let date = new Date(parseInt("20" + d.Date.split("-")[1]), months.indexOf(d.Date.split("-")[0])+1);
return "" + (date.getMonth()+1) + " " + date.getFullYear();
})
Insert cell
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
Insert cell
import {LineChart as MultipleLineChart} from "@guypursey/line-chart-multiple-series-with-tooltip"

Insert cell
import {LineChart} from "@d3/line-with-tooltip"
Insert cell
import {LineChart as MultiLine} from "43b086d3a2a7a8f4"
Insert cell
import {timeline, stylesheet} from "@99percentcocoa/simple-timeline"
Insert cell
function colorFunction(z) {
return d3.schemeBlues[z];
}
Insert cell
import {vl} from "@vega/vega-lite-api"
Insert cell
import {StackedAreaChart} from "@d3/stacked-area-chart"
Insert cell
import {Swatches} from "@d3/color-legend"
Insert cell
function uniqueArray(arr) {
return arr.filter((value, index, self) => self.indexOf(value) === index);
}
Insert cell
function sortNumArray(arr) {
return arr.sort((a, b) => a - b);
}
Insert cell
function topNValues(arr, num) {
return arr.filter(d => d <= sortNumArray(uniqueArray(arr))[num-1]);
}
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