62 lines
2.7 KiB
JavaScript
62 lines
2.7 KiB
JavaScript
// Generated, do not edit. sha256:79d0944a46421ed3e71c6aff535ca9c3c77b373253595260dd7e749f587d9edd
|
|
import { CONFIG } from '../../shared/config.js';
|
|
import { windowTwr, windowFactors } from './performance.js';
|
|
import { dailyResults, meetVenster, rollingWindows, seriesFor, windowResult } from './series.js';
|
|
|
|
export function periodChoices(length = 0, page = null, days = CONFIG.WEALTH_RETURN.ROLLING_DAYS) {
|
|
const rolling = rollingWindows(length, days)
|
|
.map(p => ({ key: p.days == null ? 'start' : `d${p.days}`, days: p.days, label: null, venster: p.venster }));
|
|
if (!page?.venster || !rolling.length) return rolling;
|
|
const venster = meetVenster(page.venster, length);
|
|
if (venster.van <= 0 && venster.tot >= length - 1) return rolling;
|
|
return [{ key: 'page', days: null, label: page.label ?? null, venster }, ...rolling];
|
|
}
|
|
|
|
export function startPeriod(periods, stored = null) {
|
|
if (stored && periods.some(p => p.key === stored && p.venster)) return stored;
|
|
return periods.some(p => p.key === 'page') ? 'page' : 'start';
|
|
}
|
|
|
|
export function returnLine(input = {}, venster = null) {
|
|
if (!venster) return { amount: null, pct: null, points: [] };
|
|
const results = dailyResults(input);
|
|
const factors = windowFactors(input, venster);
|
|
const tot = Math.min(venster.tot, results.length - 1);
|
|
const points = [];
|
|
let cumulative = 0;
|
|
if (venster.van > 0) points.push({ i: venster.van, cumulative: 0, day: null, pct: null });
|
|
for (let i = venster.van > 0 ? venster.van + 1 : 0; i <= tot; i++) {
|
|
cumulative += results[i];
|
|
points.push({ i, cumulative, day: results[i], pct: factors[i] == null ? null : factors[i] - 1 });
|
|
}
|
|
return { amount: windowResult(input, venster), pct: windowTwr(input, venster), points };
|
|
}
|
|
|
|
export function contributorsPerDay(reeks = {}, ids = [], venster = null, n = 3) {
|
|
const out = new Map();
|
|
if (!venster || !ids || ids.length < 2) return out;
|
|
const per = ids.map(id => {
|
|
const input = seriesFor(reeks, id);
|
|
return { id, results: dailyResults(input), factors: windowFactors(input, venster) };
|
|
});
|
|
const tot = Math.min(venster.tot, (reeks.dagen?.length || 0) - 1);
|
|
for (let i = venster.van > 0 ? venster.van + 1 : 0; i <= tot; i++) {
|
|
const top = per
|
|
.map(p => ({ id: p.id, day: p.results[i] || 0, pct: p.factors[i] == null ? null : p.factors[i] - 1 }))
|
|
.filter(c => Math.abs(c.day) >= 0.005)
|
|
.sort((a, b) => Math.abs(b.day) - Math.abs(a.day))
|
|
.slice(0, n);
|
|
if (top.length) out.set(i, top);
|
|
}
|
|
return out;
|
|
}
|
|
|
|
export function idsForSelection(sel, assets = []) {
|
|
if (sel?.assetIds?.length) return [...sel.assetIds];
|
|
if (sel?.kind) {
|
|
const ids = assets.filter(a => a.kind === sel.kind).map(a => a.id);
|
|
return ids.length ? ids : null;
|
|
}
|
|
return null;
|
|
}
|