d3 = {
const d3 = await require("d3-array@2");
d3.gmean = function(data, value = d => d) {
const r = 64;
const K = 2 ** r;
const K1 = 2 ** -r;
let p = 1;
let n = 0;
let s = 1;
let k = 0;
for (let i = 0; i < data.length; i++) {
const v = value(data[i]);
if (+v === +v) {
n++;
s = Math.sign(v);
if (s === 0) return 0;
p *= Math.abs(v);
while (p > K) (p *= K1), ++k;
while (p < K1) (p *= K), --k;
}
}
return n ? s * 2 ** ((Math.log2(p) + k * r) / n) : NaN;
};
d3.agmean = function(data, value = d => d) {
const step = a => [d3.mean(a), d3.gmean(a)];
let a = step(Array.from(data, value).filter(d => +d === +d));
while (Math.abs(a[1] - a[0]) > 1e-16) a = step(a);
return a[0];
};
d3.gmdn = function(data, value = d => d) {
const step = a => [d3.mean(a), d3.gmean(a), d3.median(a)];
let a = step(Array.from(data, value).filter(d => +d === +d));
while (Math.abs(a[1] - a[0]) > 1e-16) a = step(a);
return a[0];
};
return d3;
}