function add_derivatives({ dimension: dim }) {
return (data, facets) => {
const out = pipe(
data,
(arr) =>
arr.map((d) => {
const { [dim]: acceleration } = d;
return { ...d, acceleration };
}),
(arr) => {
const mean = d3.mean(arr, (d) => d.acceleration);
const std = d3.deviation(arr, (d) => d.acceleration);
return arr
.map((d) => ({
...d,
acceleration: (d.acceleration - mean) / std
}))
.filter((d) => Math.abs(d.acceleration) < 10);
},
(arr) =>
arr.map((d, i, arr) => {
const { dt, acceleration } = d;
const dv = acceleration * dt;
return { ...d, dv };
}),
(arr) => {
const cumsum = d3.cumsum(arr, (d) => d.dv);
return arr
.map((d, i) => ({ ...d, velocity: cumsum[i] }))
.map((d, i, arr) => {
const { dt, velocity } = d;
const dx = velocity * dt;
return { ...d, dx };
});
},
(arr) => {
const cumsum = d3.cumsum(arr, (d) => d.dx);
return arr.map((d, i) => ({ ...d, position: cumsum[i] }));
}
);
return {
data: out,
facets
};
};
}