svm0n_datadeck/create-chart-test-data.mjs
SVM0N fb03f4e674 chore: add Chart Test.csv generator (deployed to a personal vault root)
Deterministic 96-row running log — date/person/weekday/distance/pace/
effort — with per-person trends, built to exercise every Chart-view
feature: time-series hue + per-series fits, size-by, bar aggregates.
Run: node create-chart-test-data.mjs "<vault>/Chart Test.csv"

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 01:42:50 +00:00

41 lines
2 KiB
JavaScript

// Generate "Chart Test.csv" — a running log designed to exercise every
// Chart-view feature: date X (time series), three numeric columns (Y +
// size-by), person (3-value hue with visibly different trends), weekday
// (7-value categorical for bar mode).
import fs from "node:fs";
// Deterministic PRNG so regenerating gives the same file.
let seed = 42;
const rand = () => (seed = (seed * 1103515245 + 12345) % 2 ** 31) / 2 ** 31;
const people = {
// name: [start km, km gained per week, base pace min/km, pace change/week]
Anna: [5.0, 0.45, 6.2, -0.06], // building up, getting faster
Ben: [8.0, -0.15, 5.1, 0.02], // tapering off slightly
Cara: [3.0, 0.70, 7.0, -0.10], // beginner improving fast
};
const runDays = { Anna: [1, 3, 6], Ben: [2, 5], Cara: [0, 2, 4] }; // 0=Mon offsets
const weekdays = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];
const iso = d => `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
const rows = [["date", "person", "weekday", "distance_km", "pace_min_per_km", "effort"]];
const start = new Date(2026, 3, 20); // Mon 2026-04-20, ~12 weeks back from mid-July
for (let week = 0; week < 12; week++) {
for (const [name, [km0, kmW, pace0, paceW]] of Object.entries(people)) {
for (const off of runDays[name]) {
const d = new Date(start);
d.setDate(d.getDate() + week * 7 + off);
const dist = Math.max(1, km0 + kmW * week + (rand() - 0.5) * 2.2);
const pace = Math.max(3.4, pace0 + paceW * week + (rand() - 0.5) * 0.5);
const effort = Math.max(1, Math.min(10, Math.round(dist * pace / 6 + (rand() - 0.5) * 2)));
rows.push([iso(d), name, weekdays[d.getDay() === 0 ? 6 : d.getDay() - 1], dist.toFixed(1), pace.toFixed(2), String(effort)]);
}
}
}
const csv = rows.map(r => r.join(",")).join("\n") + "\n";
const out = process.argv[2];
fs.writeFileSync(out, csv);
console.log(`${rows.length - 1} rows → ${out}`);