mirror of
https://github.com/svm0n/datadeck.git
synced 2026-07-22 08:31:46 +00:00
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>
This commit is contained in:
parent
22e434f0e0
commit
fb03f4e674
1 changed files with 41 additions and 0 deletions
41
create-chart-test-data.mjs
Normal file
41
create-chart-test-data.mjs
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
// 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}`);
|
||||
Loading…
Reference in a new issue