@sentropic/dataviz-core 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/aggregate.d.ts +4 -4
  2. package/dist/aggregate.d.ts.map +1 -1
  3. package/dist/aggregate.js +13 -7
  4. package/dist/aggregate.js.map +1 -1
  5. package/dist/analytics.d.ts +105 -0
  6. package/dist/analytics.d.ts.map +1 -0
  7. package/dist/analytics.js +323 -0
  8. package/dist/analytics.js.map +1 -0
  9. package/dist/categorical.d.ts +84 -0
  10. package/dist/categorical.d.ts.map +1 -0
  11. package/dist/categorical.js +158 -0
  12. package/dist/categorical.js.map +1 -0
  13. package/dist/describe.d.ts +11 -0
  14. package/dist/describe.d.ts.map +1 -0
  15. package/dist/describe.js +26 -0
  16. package/dist/describe.js.map +1 -0
  17. package/dist/distribution.d.ts +109 -0
  18. package/dist/distribution.d.ts.map +1 -0
  19. package/dist/distribution.js +231 -0
  20. package/dist/distribution.js.map +1 -0
  21. package/dist/fields.d.ts +53 -0
  22. package/dist/fields.d.ts.map +1 -0
  23. package/dist/fields.js +108 -0
  24. package/dist/fields.js.map +1 -0
  25. package/dist/geo.d.ts +151 -0
  26. package/dist/geo.d.ts.map +1 -0
  27. package/dist/geo.js +300 -0
  28. package/dist/geo.js.map +1 -0
  29. package/dist/index.d.ts +22 -3
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +13 -2
  32. package/dist/index.js.map +1 -1
  33. package/dist/kpi.d.ts +35 -0
  34. package/dist/kpi.d.ts.map +1 -0
  35. package/dist/kpi.js +40 -0
  36. package/dist/kpi.js.map +1 -0
  37. package/dist/model.d.ts +4 -0
  38. package/dist/model.d.ts.map +1 -1
  39. package/dist/model.js +4 -0
  40. package/dist/model.js.map +1 -1
  41. package/dist/partOfWhole.d.ts +159 -0
  42. package/dist/partOfWhole.d.ts.map +1 -0
  43. package/dist/partOfWhole.js +260 -0
  44. package/dist/partOfWhole.js.map +1 -0
  45. package/dist/pivot.d.ts +31 -0
  46. package/dist/pivot.d.ts.map +1 -0
  47. package/dist/pivot.js +121 -0
  48. package/dist/pivot.js.map +1 -0
  49. package/dist/pivotAdvanced.d.ts +47 -0
  50. package/dist/pivotAdvanced.d.ts.map +1 -0
  51. package/dist/pivotAdvanced.js +208 -0
  52. package/dist/pivotAdvanced.js.map +1 -0
  53. package/dist/serialize.d.ts +15 -3
  54. package/dist/serialize.d.ts.map +1 -1
  55. package/dist/serialize.js +55 -20
  56. package/dist/serialize.js.map +1 -1
  57. package/dist/store.d.ts +17 -4
  58. package/dist/store.d.ts.map +1 -1
  59. package/dist/store.js +120 -15
  60. package/dist/store.js.map +1 -1
  61. package/package.json +1 -1
@@ -2,8 +2,8 @@
2
2
  * Grouping and aggregation primitives.
3
3
  *
4
4
  * All functions are pure and side-effect free. Aggregations guard against
5
- * non-finite numbers (NaN, Infinity) and return a sensible neutral value for
6
- * an empty input.
5
+ * non-finite numbers (NaN, Infinity). Empty sum/count return 0; empty
6
+ * avg/min/max return NaN so callers can distinguish "no data" from a real 0.
7
7
  */
8
8
  import type { Aggregation, Measure, Row } from './model.js';
9
9
  /**
@@ -19,8 +19,8 @@ export declare function groupBy(rows: Row[], dimensionId: string): Map<string, R
19
19
  *
20
20
  * - `count` counts *rows* (not non-null values) — it returns `rows.length`.
21
21
  * - `sum`/`avg`/`min`/`max` ignore non-finite / non-numeric cells.
22
- * - An empty input (or one with no numeric cells) returns the neutral value:
23
- * `0` for sum/avg/count, `0` for min/max with no data.
22
+ * - An empty input (or one with no numeric cells) returns `0` for sum/count
23
+ * and `NaN` for avg/min/max.
24
24
  */
25
25
  export declare function aggregate(rows: Row[], measure: Measure): number;
26
26
  /** Lower-level helper: aggregate a raw value array by aggregation kind. */
@@ -1 +1 @@
1
- {"version":3,"file":"aggregate.d.ts","sourceRoot":"","sources":["../src/aggregate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAE5D;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAa5E;AAiBD;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAE/D;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EAAE,EAChB,WAAW,EAAE,WAAW,EACxB,QAAQ,SAAgB,GACvB,MAAM,CAkBR;AAED,kEAAkE;AAClE,wBAAgB,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAOnE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,GAAG,EAAE,EACX,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,GACf,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAOvC"}
1
+ {"version":3,"file":"aggregate.d.ts","sourceRoot":"","sources":["../src/aggregate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAE5D;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAa5E;AAiBD;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAE/D;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EAAE,EAChB,WAAW,EAAE,WAAW,EACxB,QAAQ,SAAgB,GACvB,MAAM,CAwBR;AAED,kEAAkE;AAClE,wBAAgB,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAOnE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,GAAG,EAAE,EACX,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,GACf,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAOvC"}
package/dist/aggregate.js CHANGED
@@ -2,8 +2,8 @@
2
2
  * Grouping and aggregation primitives.
3
3
  *
4
4
  * All functions are pure and side-effect free. Aggregations guard against
5
- * non-finite numbers (NaN, Infinity) and return a sensible neutral value for
6
- * an empty input.
5
+ * non-finite numbers (NaN, Infinity). Empty sum/count return 0; empty
6
+ * avg/min/max return NaN so callers can distinguish "no data" from a real 0.
7
7
  */
8
8
  /**
9
9
  * Partition rows by the distinct value of `dimensionId`.
@@ -46,8 +46,8 @@ function toFinite(value) {
46
46
  *
47
47
  * - `count` counts *rows* (not non-null values) — it returns `rows.length`.
48
48
  * - `sum`/`avg`/`min`/`max` ignore non-finite / non-numeric cells.
49
- * - An empty input (or one with no numeric cells) returns the neutral value:
50
- * `0` for sum/avg/count, `0` for min/max with no data.
49
+ * - An empty input (or one with no numeric cells) returns `0` for sum/count
50
+ * and `NaN` for avg/min/max.
51
51
  */
52
52
  export function aggregate(rows, measure) {
53
53
  return aggregateValues(extractNumbers(rows, measure.id), measure.aggregation, rows.length);
@@ -60,11 +60,17 @@ export function aggregateValues(values, aggregation, rowCount = values.length) {
60
60
  case 'sum':
61
61
  return values.reduce((acc, v) => acc + v, 0);
62
62
  case 'avg':
63
- return values.length === 0 ? 0 : values.reduce((acc, v) => acc + v, 0) / values.length;
63
+ return values.length === 0
64
+ ? Number.NaN
65
+ : values.reduce((acc, v) => acc + v, 0) / values.length;
64
66
  case 'min':
65
- return values.length === 0 ? 0 : values.reduce((acc, v) => (v < acc ? v : acc), values[0]);
67
+ return values.length === 0
68
+ ? Number.NaN
69
+ : values.reduce((acc, v) => (v < acc ? v : acc), values[0]);
66
70
  case 'max':
67
- return values.length === 0 ? 0 : values.reduce((acc, v) => (v > acc ? v : acc), values[0]);
71
+ return values.length === 0
72
+ ? Number.NaN
73
+ : values.reduce((acc, v) => (v > acc ? v : acc), values[0]);
68
74
  default: {
69
75
  // Exhaustiveness guard — unreachable for a valid Aggregation.
70
76
  const _never = aggregation;
@@ -1 +1 @@
1
- {"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../src/aggregate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../src/aggregate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Analytic overlay data contracts.
3
+ *
4
+ * These builders compute values for overlays such as reference/goal lines,
5
+ * percentile bands, trend lines and error bars. Rendering belongs to the DS.
6
+ */
7
+ import type { DataModel, Row } from './model.js';
8
+ export interface ReferenceLineConfig {
9
+ id?: string;
10
+ label?: string;
11
+ value?: number;
12
+ measure?: string;
13
+ }
14
+ export interface ReferenceLineModel {
15
+ id: string;
16
+ label: string;
17
+ value: number;
18
+ source: 'static' | 'measure';
19
+ measureId?: string;
20
+ }
21
+ export interface PercentileBandConfig {
22
+ value: string;
23
+ lower: number;
24
+ upper: number;
25
+ }
26
+ export interface PercentileBandModel {
27
+ valueId: string;
28
+ lowerPercentile: number;
29
+ upperPercentile: number;
30
+ lowerValue: number;
31
+ upperValue: number;
32
+ median: number;
33
+ }
34
+ export interface TrendLineConfig {
35
+ x: string;
36
+ y: string;
37
+ }
38
+ export interface TrendPoint {
39
+ x: number;
40
+ y: number;
41
+ }
42
+ export interface TrendLineModel {
43
+ xId: string;
44
+ yId: string;
45
+ slope: number;
46
+ intercept: number;
47
+ rSquared: number;
48
+ points: TrendPoint[];
49
+ }
50
+ export interface ForecastConfig {
51
+ x: string;
52
+ y: string;
53
+ periods: number;
54
+ step?: number;
55
+ }
56
+ export interface ForecastModel {
57
+ xId: string;
58
+ yId: string;
59
+ method: 'linear';
60
+ slope: number;
61
+ intercept: number;
62
+ points: TrendPoint[];
63
+ }
64
+ export interface ErrorBarsConfig {
65
+ category: string;
66
+ value: string;
67
+ interval?: 'stdev' | 'stderr';
68
+ }
69
+ export interface ErrorBarItem {
70
+ key: string;
71
+ label: string;
72
+ count: number;
73
+ mean: number;
74
+ stdev: number;
75
+ lower: number;
76
+ upper: number;
77
+ }
78
+ export interface ErrorBarsModel {
79
+ categoryId: string;
80
+ valueId: string;
81
+ interval: 'stdev' | 'stderr';
82
+ items: ErrorBarItem[];
83
+ }
84
+ export interface AnalyticsClusterConfig {
85
+ fields: string[];
86
+ k: number;
87
+ maxIterations?: number;
88
+ }
89
+ export interface AnalyticsCluster {
90
+ id: string;
91
+ centroid: Record<string, number>;
92
+ count: number;
93
+ rowIndices: number[];
94
+ }
95
+ export interface AnalyticsClusterModel {
96
+ fields: string[];
97
+ clusters: AnalyticsCluster[];
98
+ }
99
+ export declare function buildReferenceLineModel(model: DataModel, data: readonly Row[], config: ReferenceLineConfig): ReferenceLineModel;
100
+ export declare function buildPercentileBandModel(model: DataModel, data: readonly Row[], config: PercentileBandConfig): PercentileBandModel;
101
+ export declare function buildTrendLineModel(model: DataModel, data: readonly Row[], config: TrendLineConfig): TrendLineModel;
102
+ export declare function buildForecastModel(model: DataModel, data: readonly Row[], config: ForecastConfig): ForecastModel;
103
+ export declare function buildErrorBarsModel(model: DataModel, data: readonly Row[], config: ErrorBarsConfig): ErrorBarsModel;
104
+ export declare function buildAnalyticsClusterModel(model: DataModel, data: readonly Row[], config: AnalyticsClusterConfig): AnalyticsClusterModel;
105
+ //# sourceMappingURL=analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,323 @@
1
+ /**
2
+ * Analytic overlay data contracts.
3
+ *
4
+ * These builders compute values for overlays such as reference/goal lines,
5
+ * percentile bands, trend lines and error bars. Rendering belongs to the DS.
6
+ */
7
+ import { aggregate, extractNumbers } from './aggregate.js';
8
+ import { findDimension, findMeasure } from './model.js';
9
+ function cellKey(value) {
10
+ return value == null ? 'null' : String(value);
11
+ }
12
+ function toFiniteNumber(value) {
13
+ if (typeof value === 'number')
14
+ return Number.isFinite(value) ? value : undefined;
15
+ if (typeof value === 'string' && value.trim() !== '') {
16
+ const parsed = Number(value);
17
+ return Number.isFinite(parsed) ? parsed : undefined;
18
+ }
19
+ return undefined;
20
+ }
21
+ function assertValueField(model, id, role) {
22
+ if (!findMeasure(model, id) && !findDimension(model, id)) {
23
+ throw new Error(`Unknown ${role} field: ${id}`);
24
+ }
25
+ }
26
+ function resolveMeasure(model, id, role) {
27
+ const measure = findMeasure(model, id);
28
+ if (!measure) {
29
+ throw new Error(`Unknown ${role} measure: ${id}`);
30
+ }
31
+ return measure;
32
+ }
33
+ function assertDimension(model, id, role) {
34
+ if (!findDimension(model, id)) {
35
+ throw new Error(`Unknown ${role} dimension: ${id}`);
36
+ }
37
+ }
38
+ function assertPercentile(value, label) {
39
+ if (!Number.isFinite(value) || value < 0 || value > 1) {
40
+ throw new Error(`${label} percentile must be between 0 and 1`);
41
+ }
42
+ }
43
+ function quantile(sorted, p) {
44
+ if (sorted.length === 0)
45
+ return Number.NaN;
46
+ const position = (sorted.length - 1) * p;
47
+ const base = Math.floor(position);
48
+ const rest = position - base;
49
+ const current = sorted[base];
50
+ const next = sorted[base + 1] ?? current;
51
+ return current + rest * (next - current);
52
+ }
53
+ function groupRows(rows, field) {
54
+ const groups = new Map();
55
+ for (const row of rows) {
56
+ const key = cellKey(row[field]);
57
+ const bucket = groups.get(key);
58
+ if (bucket) {
59
+ bucket.push(row);
60
+ }
61
+ else {
62
+ groups.set(key, [row]);
63
+ }
64
+ }
65
+ return groups;
66
+ }
67
+ function mean(values) {
68
+ return values.length === 0
69
+ ? Number.NaN
70
+ : values.reduce((sum, value) => sum + value, 0) / values.length;
71
+ }
72
+ function sampleStdev(values, avg) {
73
+ if (values.length <= 1)
74
+ return 0;
75
+ const variance = values.reduce((sum, value) => sum + (value - avg) ** 2, 0) / (values.length - 1);
76
+ return Math.sqrt(variance);
77
+ }
78
+ function assertPositiveInteger(value, message) {
79
+ if (!Number.isInteger(value) || value <= 0) {
80
+ throw new Error(message);
81
+ }
82
+ }
83
+ function numericPairs(data, xField, yField) {
84
+ return data
85
+ .map((row) => {
86
+ const x = toFiniteNumber(row[xField]);
87
+ const y = toFiniteNumber(row[yField]);
88
+ return x === undefined || y === undefined ? undefined : { x, y };
89
+ })
90
+ .filter((point) => point !== undefined);
91
+ }
92
+ export function buildReferenceLineModel(model, data, config) {
93
+ if (config.value !== undefined) {
94
+ if (!Number.isFinite(config.value)) {
95
+ throw new Error('Reference line value must be finite');
96
+ }
97
+ const label = config.label ?? 'Reference';
98
+ return {
99
+ id: config.id ?? `reference:${label}`,
100
+ label,
101
+ value: config.value,
102
+ source: 'static',
103
+ };
104
+ }
105
+ if (config.measure === undefined) {
106
+ throw new Error('Reference line requires either value or measure');
107
+ }
108
+ const measure = resolveMeasure(model, config.measure, 'reference line');
109
+ return {
110
+ id: config.id ?? `reference:${measure.id}`,
111
+ label: config.label ?? measure.label,
112
+ value: aggregate([...data], measure),
113
+ source: 'measure',
114
+ measureId: measure.id,
115
+ };
116
+ }
117
+ export function buildPercentileBandModel(model, data, config) {
118
+ assertValueField(model, config.value, 'percentile band value');
119
+ assertPercentile(config.lower, 'Lower');
120
+ assertPercentile(config.upper, 'Upper');
121
+ if (config.lower > config.upper) {
122
+ throw new Error('Percentile band requires lower <= upper');
123
+ }
124
+ const values = extractNumbers([...data], config.value).sort((a, b) => a - b);
125
+ return {
126
+ valueId: config.value,
127
+ lowerPercentile: config.lower,
128
+ upperPercentile: config.upper,
129
+ lowerValue: quantile(values, config.lower),
130
+ upperValue: quantile(values, config.upper),
131
+ median: quantile(values, 0.5),
132
+ };
133
+ }
134
+ export function buildTrendLineModel(model, data, config) {
135
+ assertValueField(model, config.x, 'trend x');
136
+ assertValueField(model, config.y, 'trend y');
137
+ const points = numericPairs(data, config.x, config.y);
138
+ if (points.length < 2) {
139
+ return {
140
+ xId: config.x,
141
+ yId: config.y,
142
+ slope: Number.NaN,
143
+ intercept: Number.NaN,
144
+ rSquared: Number.NaN,
145
+ points: [],
146
+ };
147
+ }
148
+ const xMean = mean(points.map((point) => point.x));
149
+ const yMean = mean(points.map((point) => point.y));
150
+ const sxx = points.reduce((sum, point) => sum + (point.x - xMean) ** 2, 0);
151
+ const sxy = points.reduce((sum, point) => sum + (point.x - xMean) * (point.y - yMean), 0);
152
+ const slope = sxx === 0 ? Number.NaN : sxy / sxx;
153
+ const intercept = yMean - slope * xMean;
154
+ const sst = points.reduce((sum, point) => sum + (point.y - yMean) ** 2, 0);
155
+ const sse = points.reduce((sum, point) => {
156
+ const predicted = intercept + slope * point.x;
157
+ return sum + (point.y - predicted) ** 2;
158
+ }, 0);
159
+ const rSquared = sst === 0 ? 1 : 1 - sse / sst;
160
+ const minX = Math.min(...points.map((point) => point.x));
161
+ const maxX = Math.max(...points.map((point) => point.x));
162
+ return {
163
+ xId: config.x,
164
+ yId: config.y,
165
+ slope,
166
+ intercept,
167
+ rSquared,
168
+ points: [
169
+ { x: minX, y: intercept + slope * minX },
170
+ { x: maxX, y: intercept + slope * maxX },
171
+ ],
172
+ };
173
+ }
174
+ export function buildForecastModel(model, data, config) {
175
+ assertPositiveInteger(config.periods, 'Forecast periods must be a positive integer');
176
+ if (config.step !== undefined && (!Number.isFinite(config.step) || config.step <= 0)) {
177
+ throw new Error('Forecast step must be a positive finite number');
178
+ }
179
+ const trend = buildTrendLineModel(model, data, { x: config.x, y: config.y });
180
+ const points = numericPairs(data, config.x, config.y);
181
+ if (!Number.isFinite(trend.slope) || points.length === 0) {
182
+ return {
183
+ xId: config.x,
184
+ yId: config.y,
185
+ method: 'linear',
186
+ slope: trend.slope,
187
+ intercept: trend.intercept,
188
+ points: [],
189
+ };
190
+ }
191
+ const sortedX = points.map((point) => point.x).sort((a, b) => a - b);
192
+ const maxX = sortedX[sortedX.length - 1];
193
+ const inferredStep = sortedX.length <= 1 ? 1 : (sortedX[sortedX.length - 1] - sortedX[0]) / (sortedX.length - 1);
194
+ const step = config.step ?? (inferredStep > 0 ? inferredStep : 1);
195
+ return {
196
+ xId: config.x,
197
+ yId: config.y,
198
+ method: 'linear',
199
+ slope: trend.slope,
200
+ intercept: trend.intercept,
201
+ points: Array.from({ length: config.periods }, (_, index) => {
202
+ const x = maxX + step * (index + 1);
203
+ return { x, y: trend.intercept + trend.slope * x };
204
+ }),
205
+ };
206
+ }
207
+ export function buildErrorBarsModel(model, data, config) {
208
+ assertDimension(model, config.category, 'error bars category');
209
+ assertValueField(model, config.value, 'error bars value');
210
+ const interval = config.interval ?? 'stdev';
211
+ if (interval !== 'stdev' && interval !== 'stderr') {
212
+ throw new Error('Error bars interval must be stdev or stderr');
213
+ }
214
+ return {
215
+ categoryId: config.category,
216
+ valueId: config.value,
217
+ interval,
218
+ items: Array.from(groupRows(data, config.category), ([key, rows]) => {
219
+ const values = extractNumbers(rows, config.value);
220
+ const avg = mean(values);
221
+ const stdev = sampleStdev(values, avg);
222
+ const offset = interval === 'stderr' ? stdev / Math.sqrt(values.length) : stdev;
223
+ return {
224
+ key,
225
+ label: key,
226
+ count: values.length,
227
+ mean: avg,
228
+ stdev,
229
+ lower: avg - offset,
230
+ upper: avg + offset,
231
+ };
232
+ }),
233
+ };
234
+ }
235
+ function clusterPoints(data, fields) {
236
+ const points = [];
237
+ data.forEach((row, rowIndex) => {
238
+ const vector = [];
239
+ const values = {};
240
+ for (const field of fields) {
241
+ const value = toFiniteNumber(row[field]);
242
+ if (value === undefined)
243
+ return;
244
+ vector.push(value);
245
+ values[field] = value;
246
+ }
247
+ points.push({ rowIndex, values, vector });
248
+ });
249
+ return points;
250
+ }
251
+ function squaredDistance(a, b) {
252
+ return a.reduce((sum, value, index) => sum + (value - b[index]) ** 2, 0);
253
+ }
254
+ function nearestCentroid(point, centroids) {
255
+ let bestIndex = 0;
256
+ let bestDistance = Number.POSITIVE_INFINITY;
257
+ centroids.forEach((centroid, index) => {
258
+ const distance = squaredDistance(point.vector, centroid);
259
+ if (distance < bestDistance) {
260
+ bestDistance = distance;
261
+ bestIndex = index;
262
+ }
263
+ });
264
+ return bestIndex;
265
+ }
266
+ function centroidObject(fields, vector) {
267
+ const out = {};
268
+ fields.forEach((field, index) => {
269
+ out[field] = vector[index];
270
+ });
271
+ return out;
272
+ }
273
+ export function buildAnalyticsClusterModel(model, data, config) {
274
+ if (config.fields.length === 0) {
275
+ throw new Error('Analytics cluster requires at least one field');
276
+ }
277
+ for (const field of config.fields) {
278
+ assertValueField(model, field, 'analytics cluster');
279
+ }
280
+ assertPositiveInteger(config.k, 'Analytics cluster k must be a positive integer');
281
+ const maxIterations = config.maxIterations ?? 20;
282
+ assertPositiveInteger(maxIterations, 'Analytics cluster maxIterations must be a positive integer');
283
+ const points = clusterPoints(data, config.fields);
284
+ if (points.length < config.k) {
285
+ throw new Error('Analytics cluster k cannot exceed available complete rows');
286
+ }
287
+ let centroids = points.slice(0, config.k).map((point) => [...point.vector]);
288
+ let assignments = points.map(() => -1);
289
+ for (let iteration = 0; iteration < maxIterations; iteration += 1) {
290
+ const nextAssignments = points.map((point) => nearestCentroid(point, centroids));
291
+ const changed = nextAssignments.some((assignment, index) => assignment !== assignments[index]);
292
+ assignments = nextAssignments;
293
+ const sums = Array.from({ length: config.k }, () => Array.from({ length: config.fields.length }, () => 0));
294
+ const counts = Array.from({ length: config.k }, () => 0);
295
+ points.forEach((point, index) => {
296
+ const clusterIndex = assignments[index];
297
+ counts[clusterIndex] += 1;
298
+ point.vector.forEach((value, fieldIndex) => {
299
+ sums[clusterIndex][fieldIndex] += value;
300
+ });
301
+ });
302
+ centroids = centroids.map((centroid, clusterIndex) => counts[clusterIndex] === 0
303
+ ? centroid
304
+ : sums[clusterIndex].map((sum) => sum / counts[clusterIndex]));
305
+ if (!changed)
306
+ break;
307
+ }
308
+ return {
309
+ fields: [...config.fields],
310
+ clusters: centroids.map((centroid, clusterIndex) => {
311
+ const rowIndices = points
312
+ .filter((_, index) => assignments[index] === clusterIndex)
313
+ .map((point) => point.rowIndex);
314
+ return {
315
+ id: `cluster:${clusterIndex}`,
316
+ centroid: centroidObject(config.fields, centroid),
317
+ count: rowIndices.length,
318
+ rowIndices,
319
+ };
320
+ }),
321
+ };
322
+ }
323
+ //# sourceMappingURL=analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Categorical/combo chart data contracts.
3
+ *
4
+ * This is the rendering-agnostic series model that DS chart components can
5
+ * consume or adapt for grouped bars, stacked bars, line/area combos, 100 %
6
+ * stacks, Pareto views and diverging bars.
7
+ */
8
+ import type { DataModel, Measure, Row } from './model.js';
9
+ export type CategoricalMark = 'bar' | 'line' | 'area';
10
+ export type CategoricalAxis = 'left' | 'right';
11
+ export type CategoricalMode = 'grouped' | 'stacked' | 'stacked-100';
12
+ export type CategoricalMeasureInput = string | {
13
+ id: string;
14
+ mark?: CategoricalMark;
15
+ axis?: CategoricalAxis;
16
+ };
17
+ export interface CategoricalSeriesConfig {
18
+ category: string;
19
+ series?: string;
20
+ measures: CategoricalMeasureInput[];
21
+ mode?: CategoricalMode;
22
+ }
23
+ export interface CategoricalMeasure {
24
+ measure: Measure;
25
+ mark: CategoricalMark;
26
+ axis: CategoricalAxis;
27
+ }
28
+ export interface CategoricalSeries {
29
+ id: string;
30
+ label: string;
31
+ measureId: string;
32
+ seriesKey?: string;
33
+ seriesLabel?: string;
34
+ mark: CategoricalMark;
35
+ axis: CategoricalAxis;
36
+ values: number[];
37
+ }
38
+ export interface CategoricalSeriesModel {
39
+ categories: string[];
40
+ mode: CategoricalMode;
41
+ series: CategoricalSeries[];
42
+ }
43
+ export interface ParetoConfig {
44
+ category: string;
45
+ measure: string;
46
+ }
47
+ export interface ParetoItem {
48
+ key: string;
49
+ label: string;
50
+ value: number;
51
+ rank: number;
52
+ cumulativeValue: number;
53
+ cumulativePercent: number;
54
+ }
55
+ export interface ParetoModel {
56
+ categoryId: string;
57
+ measureId: string;
58
+ total: number;
59
+ items: ParetoItem[];
60
+ }
61
+ export type DivergingDirection = 'positive' | 'negative' | 'neutral';
62
+ export interface DivergingBarConfig {
63
+ category: string;
64
+ measure: string;
65
+ }
66
+ export interface DivergingBarItem {
67
+ key: string;
68
+ label: string;
69
+ value: number;
70
+ start: number;
71
+ end: number;
72
+ direction: DivergingDirection;
73
+ }
74
+ export interface DivergingBarModel {
75
+ categoryId: string;
76
+ measureId: string;
77
+ baseline: 0;
78
+ domain: [number, number];
79
+ items: DivergingBarItem[];
80
+ }
81
+ export declare function buildCategoricalSeries(model: DataModel, data: readonly Row[], config: CategoricalSeriesConfig): CategoricalSeriesModel;
82
+ export declare function buildParetoModel(model: DataModel, data: readonly Row[], config: ParetoConfig): ParetoModel;
83
+ export declare function buildDivergingBarModel(model: DataModel, data: readonly Row[], config: DivergingBarConfig): DivergingBarModel;
84
+ //# sourceMappingURL=categorical.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"categorical.d.ts","sourceRoot":"","sources":["../src/categorical.ts"],"names":[],"mappings":"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"}