async function processData(dataType, viewType, countryLimit = 10) {
let tradeData, categoriesData, countriesData;
if (dataType === "exports") {
tradeData = await FileAttachment("exports.csv").csv();
if (viewType === "categories") {
const categoriesData1 = await FileAttachment("export_categories.csv").csv();
const categoriesData2 = await FileAttachment("export_categories@1.csv").csv();
categoriesData = [...categoriesData1, ...categoriesData2];
}
} else {
tradeData = await FileAttachment("imports.csv").csv();
if (viewType === "categories") {
const categoriesData1 = await FileAttachment("import_categories.csv").csv();
const categoriesData2 = await FileAttachment("import_categories@1.csv").csv();
categoriesData = [...categoriesData1, ...categoriesData2];
}
}
countriesData = await FileAttachment("countries.csv").csv();
const sourceColumn = "from";
const targetColumn = "to";
const volumeColumn = "value";
let items = [];
let volumeByItem = {};
let countryToContinent = {};
countriesData.forEach(d => {
countryToContinent[d.Country] = d.Continent;
});
if (viewType === "countries") {
tradeData.forEach(d => {
const source = d[sourceColumn];
const volume = parseVolume(d[volumeColumn]);
volumeByItem[source] = (volumeByItem[source] || 0) + volume;
});
items = Object.entries(volumeByItem)
.sort((a, b) => b[1] - a[1])
.slice(0, parseInt(countryLimit))
.map(d => d[0]);
} else if (viewType === "regions") {
tradeData.forEach(d => {
const source = d[sourceColumn];
const continent = countryToContinent[source] || "Unknown";
const volume = parseVolume(d[volumeColumn]);
volumeByItem[continent] = (volumeByItem[continent] || 0) + volume;
});
items = Object.entries(volumeByItem)
.sort((a, b) => b[1] - a[1])
.map(d => d[0]);
} else if (viewType === "categories") {
categoriesData.forEach(d => {
const category = d.category;
const volume = parseVolume(d[volumeColumn]);
volumeByItem[category] = (volumeByItem[category] || 0) + volume;
});
items = Object.entries(volumeByItem)
.sort((a, b) => b[1] - a[1])
.slice(0, 10)
.map(d => d[0]);
}
const n = items.length;
const matrix = Array(n).fill().map(() => Array(n).fill(0));
const linkValues = {};
if (viewType === "countries") {
tradeData.forEach(d => {
const source = d[sourceColumn];
const target = d[targetColumn];
const sourceIdx = items.indexOf(source);
const targetIdx = items.indexOf(target);
if (sourceIdx !== -1 && targetIdx !== -1) {
const volume = parseVolume(d[volumeColumn]);
const maxValue = 1e10;
linkValues[`${source}_${target}`] = volume;
matrix[sourceIdx][targetIdx] += volume / maxValue;
}
});
} else if (viewType === "regions") {
tradeData.forEach(d => {
const source = countryToContinent[d[sourceColumn]] || "Unknown";
const target = countryToContinent[d[targetColumn]] || "Unknown";
const sourceIdx = items.indexOf(source);
const targetIdx = items.indexOf(target);
if (sourceIdx !== -1 && targetIdx !== -1) {
const volume = parseVolume(d[volumeColumn]);
const maxValue = 1e10;
linkValues[`${source}_${target}`] = volume;
matrix[sourceIdx][targetIdx] += volume / maxValue;
}
});
} else if (viewType === "categories") {
categoriesData.forEach(d => {
const category = d.category;
const target = d[targetColumn];
const sourceIdx = items.indexOf(category);
const targetIdx = items.indexOf(target);
if (sourceIdx !== -1 && targetIdx !== -1) {
const volume = parseVolume(d[volumeColumn]);
const maxValue = 1e10;
linkValues[`${category}_${target}`] = volume;
matrix[sourceIdx][targetIdx] += volume / maxValue;
}
});
}
let colors;
if (viewType === "regions") {
const regionColors = {
"America": "#1f77b4",
"Europe": "#ff7f0e",
"Asia": "#2ca02c",
"Africa": "#d62728",
"Oceania": "#9467bd",
"Unknown": "#999999"
};
colors = items.map(region => regionColors[region] || "#999999");
} else if (viewType === "categories") {
const categoryToCountry = {};
const countryColors = {};
const uniqueCountries = [...new Set(categoriesData.map(d => d.from))];
uniqueCountries.forEach((country, i) => {
countryColors[country] = d3.interpolateRainbow(i / uniqueCountries.length);
});
categoriesData.forEach(d => {
categoryToCountry[d.category] = d.from;
});
colors = items.map(category => {
const country = categoryToCountry[category] || "Unknown";
return countryColors[country] || "#999999";
});
} else {
colors = d3.quantize(d3.interpolateRainbow, items.length);
}
const formattedData = Object.assign(matrix, {
names: items,
colors: colors,
linkValues: linkValues
});
return formattedData;
}