formulab 0.5.1 → 0.9.0
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.
- package/CHANGELOG.md +84 -0
- package/README.md +90 -26
- package/dist/automotive/chargingLoss.d.ts +15 -0
- package/dist/automotive/chargingLoss.d.ts.map +1 -0
- package/dist/automotive/chargingLoss.js +62 -0
- package/dist/automotive/chargingLoss.js.map +1 -0
- package/dist/automotive/index.d.ts +2 -1
- package/dist/automotive/index.d.ts.map +1 -1
- package/dist/automotive/index.js +1 -0
- package/dist/automotive/index.js.map +1 -1
- package/dist/automotive/types.d.ts +23 -0
- package/dist/automotive/types.d.ts.map +1 -1
- package/dist/battery/guards.d.ts +7 -0
- package/dist/battery/guards.d.ts.map +1 -0
- package/dist/battery/guards.js +17 -0
- package/dist/battery/guards.js.map +1 -0
- package/dist/battery/index.d.ts +1 -0
- package/dist/battery/index.d.ts.map +1 -1
- package/dist/battery/index.js +2 -0
- package/dist/battery/index.js.map +1 -1
- package/dist/chemical/flowControl.d.ts +14 -0
- package/dist/chemical/flowControl.d.ts.map +1 -0
- package/dist/chemical/flowControl.js +69 -0
- package/dist/chemical/flowControl.js.map +1 -0
- package/dist/chemical/guards.d.ts +17 -0
- package/dist/chemical/guards.d.ts.map +1 -0
- package/dist/chemical/guards.js +54 -0
- package/dist/chemical/guards.js.map +1 -0
- package/dist/chemical/index.d.ts +5 -1
- package/dist/chemical/index.d.ts.map +1 -1
- package/dist/chemical/index.js +5 -0
- package/dist/chemical/index.js.map +1 -1
- package/dist/chemical/pid.d.ts +14 -0
- package/dist/chemical/pid.d.ts.map +1 -0
- package/dist/chemical/pid.js +103 -0
- package/dist/chemical/pid.js.map +1 -0
- package/dist/chemical/reliefValve.d.ts +14 -0
- package/dist/chemical/reliefValve.d.ts.map +1 -0
- package/dist/chemical/reliefValve.js +98 -0
- package/dist/chemical/reliefValve.js.map +1 -0
- package/dist/chemical/types.d.ts +63 -0
- package/dist/chemical/types.d.ts.map +1 -1
- package/dist/construction/guards.d.ts +7 -0
- package/dist/construction/guards.d.ts.map +1 -0
- package/dist/construction/guards.js +31 -0
- package/dist/construction/guards.js.map +1 -0
- package/dist/construction/index.d.ts +1 -0
- package/dist/construction/index.d.ts.map +1 -1
- package/dist/construction/index.js +2 -0
- package/dist/construction/index.js.map +1 -1
- package/dist/electronics/guards.d.ts +7 -0
- package/dist/electronics/guards.d.ts.map +1 -0
- package/dist/electronics/guards.js +17 -0
- package/dist/electronics/guards.js.map +1 -0
- package/dist/electronics/index.d.ts +1 -0
- package/dist/electronics/index.d.ts.map +1 -1
- package/dist/electronics/index.js +2 -0
- package/dist/electronics/index.js.map +1 -1
- package/dist/energy/boilerEfficiency.d.ts +13 -0
- package/dist/energy/boilerEfficiency.d.ts.map +1 -0
- package/dist/energy/boilerEfficiency.js +46 -0
- package/dist/energy/boilerEfficiency.js.map +1 -0
- package/dist/energy/cusum.d.ts +15 -0
- package/dist/energy/cusum.d.ts.map +1 -0
- package/dist/energy/cusum.js +71 -0
- package/dist/energy/cusum.js.map +1 -0
- package/dist/energy/degreeDay.d.ts +13 -0
- package/dist/energy/degreeDay.d.ts.map +1 -0
- package/dist/energy/degreeDay.js +46 -0
- package/dist/energy/degreeDay.js.map +1 -0
- package/dist/energy/heatPump.d.ts +13 -0
- package/dist/energy/heatPump.d.ts.map +1 -0
- package/dist/energy/heatPump.js +48 -0
- package/dist/energy/heatPump.js.map +1 -0
- package/dist/energy/index.d.ts +9 -1
- package/dist/energy/index.d.ts.map +1 -1
- package/dist/energy/index.js +8 -0
- package/dist/energy/index.js.map +1 -1
- package/dist/energy/insulationRoi.d.ts +14 -0
- package/dist/energy/insulationRoi.d.ts.map +1 -0
- package/dist/energy/insulationRoi.js +52 -0
- package/dist/energy/insulationRoi.js.map +1 -0
- package/dist/energy/ledRoi.d.ts +14 -0
- package/dist/energy/ledRoi.d.ts.map +1 -0
- package/dist/energy/ledRoi.js +49 -0
- package/dist/energy/ledRoi.js.map +1 -0
- package/dist/energy/transformerLoss.d.ts +13 -0
- package/dist/energy/transformerLoss.d.ts.map +1 -0
- package/dist/energy/transformerLoss.js +63 -0
- package/dist/energy/transformerLoss.js.map +1 -0
- package/dist/energy/types.d.ts +168 -0
- package/dist/energy/types.d.ts.map +1 -1
- package/dist/energy/windOutput.d.ts +14 -0
- package/dist/energy/windOutput.d.ts.map +1 -0
- package/dist/energy/windOutput.js +77 -0
- package/dist/energy/windOutput.js.map +1 -0
- package/dist/food/index.d.ts +3 -1
- package/dist/food/index.d.ts.map +1 -1
- package/dist/food/index.js +2 -0
- package/dist/food/index.js.map +1 -1
- package/dist/food/stabilityStudy.d.ts +15 -0
- package/dist/food/stabilityStudy.d.ts.map +1 -0
- package/dist/food/stabilityStudy.js +92 -0
- package/dist/food/stabilityStudy.js.map +1 -0
- package/dist/food/types.d.ts +43 -0
- package/dist/food/types.d.ts.map +1 -1
- package/dist/food/waterActivity.d.ts +17 -0
- package/dist/food/waterActivity.d.ts.map +1 -0
- package/dist/food/waterActivity.js +63 -0
- package/dist/food/waterActivity.js.map +1 -0
- package/dist/logistics/abcAnalysis.d.ts +15 -0
- package/dist/logistics/abcAnalysis.d.ts.map +1 -0
- package/dist/logistics/abcAnalysis.js +101 -0
- package/dist/logistics/abcAnalysis.js.map +1 -0
- package/dist/logistics/index.d.ts +4 -1
- package/dist/logistics/index.d.ts.map +1 -1
- package/dist/logistics/index.js +3 -0
- package/dist/logistics/index.js.map +1 -1
- package/dist/logistics/inventoryTurnover.d.ts +13 -0
- package/dist/logistics/inventoryTurnover.d.ts.map +1 -0
- package/dist/logistics/inventoryTurnover.js +36 -0
- package/dist/logistics/inventoryTurnover.js.map +1 -0
- package/dist/logistics/loadCapacity.d.ts +13 -0
- package/dist/logistics/loadCapacity.d.ts.map +1 -0
- package/dist/logistics/loadCapacity.js +46 -0
- package/dist/logistics/loadCapacity.js.map +1 -0
- package/dist/logistics/types.d.ts +78 -0
- package/dist/logistics/types.d.ts.map +1 -1
- package/dist/metal/guards.d.ts +12 -0
- package/dist/metal/guards.d.ts.map +1 -0
- package/dist/metal/guards.js +36 -0
- package/dist/metal/guards.js.map +1 -0
- package/dist/metal/index.d.ts +1 -0
- package/dist/metal/index.d.ts.map +1 -1
- package/dist/metal/index.js +2 -0
- package/dist/metal/index.js.map +1 -1
- package/dist/quality/cmk.d.ts +17 -0
- package/dist/quality/cmk.d.ts.map +1 -0
- package/dist/quality/cmk.js +43 -0
- package/dist/quality/cmk.js.map +1 -0
- package/dist/quality/gageRR.d.ts +18 -0
- package/dist/quality/gageRR.d.ts.map +1 -0
- package/dist/quality/gageRR.js +110 -0
- package/dist/quality/gageRR.js.map +1 -0
- package/dist/quality/index.d.ts +5 -1
- package/dist/quality/index.d.ts.map +1 -1
- package/dist/quality/index.js +4 -0
- package/dist/quality/index.js.map +1 -1
- package/dist/quality/paretoAnalysis.d.ts +15 -0
- package/dist/quality/paretoAnalysis.d.ts.map +1 -0
- package/dist/quality/paretoAnalysis.js +92 -0
- package/dist/quality/paretoAnalysis.js.map +1 -0
- package/dist/quality/types.d.ts +91 -0
- package/dist/quality/types.d.ts.map +1 -1
- package/dist/quality/weibull.d.ts +17 -0
- package/dist/quality/weibull.d.ts.map +1 -0
- package/dist/quality/weibull.js +106 -0
- package/dist/quality/weibull.js.map +1 -0
- package/dist/safety/arcFlash.d.ts +14 -0
- package/dist/safety/arcFlash.d.ts.map +1 -0
- package/dist/safety/arcFlash.js +90 -0
- package/dist/safety/arcFlash.js.map +1 -0
- package/dist/safety/confinedSpace.d.ts +15 -0
- package/dist/safety/confinedSpace.d.ts.map +1 -0
- package/dist/safety/confinedSpace.js +116 -0
- package/dist/safety/confinedSpace.js.map +1 -0
- package/dist/safety/ergonomicRisk.d.ts +9 -0
- package/dist/safety/ergonomicRisk.d.ts.map +1 -0
- package/dist/safety/ergonomicRisk.js +208 -0
- package/dist/safety/ergonomicRisk.js.map +1 -0
- package/dist/safety/illuminance.d.ts +13 -0
- package/dist/safety/illuminance.d.ts.map +1 -0
- package/dist/safety/illuminance.js +91 -0
- package/dist/safety/illuminance.js.map +1 -0
- package/dist/safety/index.d.ts +8 -1
- package/dist/safety/index.d.ts.map +1 -1
- package/dist/safety/index.js +7 -0
- package/dist/safety/index.js.map +1 -1
- package/dist/safety/ladderAngle.d.ts +16 -0
- package/dist/safety/ladderAngle.d.ts.map +1 -0
- package/dist/safety/ladderAngle.js +87 -0
- package/dist/safety/ladderAngle.js.map +1 -0
- package/dist/safety/lel.d.ts +14 -0
- package/dist/safety/lel.d.ts.map +1 -0
- package/dist/safety/lel.js +66 -0
- package/dist/safety/lel.js.map +1 -0
- package/dist/safety/thermalComfort.d.ts +14 -0
- package/dist/safety/thermalComfort.d.ts.map +1 -0
- package/dist/safety/thermalComfort.js +96 -0
- package/dist/safety/thermalComfort.js.map +1 -0
- package/dist/safety/types.d.ts +164 -0
- package/dist/safety/types.d.ts.map +1 -1
- package/dist/utility/bilinearInterpolation.d.ts +3 -0
- package/dist/utility/bilinearInterpolation.d.ts.map +1 -0
- package/dist/utility/bilinearInterpolation.js +47 -0
- package/dist/utility/bilinearInterpolation.js.map +1 -0
- package/dist/utility/correlation.d.ts +3 -0
- package/dist/utility/correlation.d.ts.map +1 -0
- package/dist/utility/correlation.js +29 -0
- package/dist/utility/correlation.js.map +1 -0
- package/dist/utility/depreciation.d.ts +3 -0
- package/dist/utility/depreciation.d.ts.map +1 -0
- package/dist/utility/depreciation.js +57 -0
- package/dist/utility/depreciation.js.map +1 -0
- package/dist/utility/histogram.d.ts +3 -0
- package/dist/utility/histogram.d.ts.map +1 -0
- package/dist/utility/histogram.js +42 -0
- package/dist/utility/histogram.js.map +1 -0
- package/dist/utility/index.d.ts +15 -1
- package/dist/utility/index.d.ts.map +1 -1
- package/dist/utility/index.js +14 -0
- package/dist/utility/index.js.map +1 -1
- package/dist/utility/lcc.d.ts +3 -0
- package/dist/utility/lcc.d.ts.map +1 -0
- package/dist/utility/lcc.js +26 -0
- package/dist/utility/lcc.js.map +1 -0
- package/dist/utility/linearInterpolation.d.ts +3 -0
- package/dist/utility/linearInterpolation.d.ts.map +1 -0
- package/dist/utility/linearInterpolation.js +42 -0
- package/dist/utility/linearInterpolation.js.map +1 -0
- package/dist/utility/movingAverage.d.ts +3 -0
- package/dist/utility/movingAverage.d.ts.map +1 -0
- package/dist/utility/movingAverage.js +41 -0
- package/dist/utility/movingAverage.js.map +1 -0
- package/dist/utility/normalize.d.ts +3 -0
- package/dist/utility/normalize.d.ts.map +1 -0
- package/dist/utility/normalize.js +35 -0
- package/dist/utility/normalize.js.map +1 -0
- package/dist/utility/npv.d.ts +3 -0
- package/dist/utility/npv.d.ts.map +1 -0
- package/dist/utility/npv.js +45 -0
- package/dist/utility/npv.js.map +1 -0
- package/dist/utility/percentile.d.ts +3 -0
- package/dist/utility/percentile.d.ts.map +1 -0
- package/dist/utility/percentile.js +24 -0
- package/dist/utility/percentile.js.map +1 -0
- package/dist/utility/regression.d.ts +3 -0
- package/dist/utility/regression.d.ts.map +1 -0
- package/dist/utility/regression.js +40 -0
- package/dist/utility/regression.js.map +1 -0
- package/dist/utility/roi.d.ts +3 -0
- package/dist/utility/roi.d.ts.map +1 -0
- package/dist/utility/roi.js +19 -0
- package/dist/utility/roi.js.map +1 -0
- package/dist/utility/statistics.d.ts +3 -0
- package/dist/utility/statistics.d.ts.map +1 -0
- package/dist/utility/statistics.js +34 -0
- package/dist/utility/statistics.js.map +1 -0
- package/dist/utility/types.d.ts +213 -1
- package/dist/utility/types.d.ts.map +1 -1
- package/dist/utility/unit.d.ts.map +1 -1
- package/dist/utility/unit.js +51 -0
- package/dist/utility/unit.js.map +1 -1
- package/dist/utility/weightedScore.d.ts +3 -0
- package/dist/utility/weightedScore.d.ts.map +1 -0
- package/dist/utility/weightedScore.js +35 -0
- package/dist/utility/weightedScore.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { roundTo } from '../utils.js';
|
|
2
|
+
export function depreciation(input) {
|
|
3
|
+
const { assetCost, salvageValue, usefulLife, method } = input;
|
|
4
|
+
if (assetCost <= 0 || salvageValue < 0 || usefulLife <= 0)
|
|
5
|
+
return null;
|
|
6
|
+
if (salvageValue >= assetCost)
|
|
7
|
+
return null;
|
|
8
|
+
if (method === 'straight-line') {
|
|
9
|
+
return straightLine(assetCost, salvageValue, usefulLife);
|
|
10
|
+
}
|
|
11
|
+
if (method === 'declining-balance') {
|
|
12
|
+
return decliningBalance(assetCost, salvageValue, usefulLife);
|
|
13
|
+
}
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
function straightLine(cost, salvage, life) {
|
|
17
|
+
const annual = (cost - salvage) / life;
|
|
18
|
+
const schedule = [];
|
|
19
|
+
for (let year = 1; year <= life; year++) {
|
|
20
|
+
schedule.push({
|
|
21
|
+
year,
|
|
22
|
+
depreciation: roundTo(annual, 6),
|
|
23
|
+
accumulatedDepreciation: roundTo(annual * year, 6),
|
|
24
|
+
bookValue: roundTo(cost - annual * year, 6),
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
annualDepreciation: roundTo(annual, 6),
|
|
29
|
+
schedule,
|
|
30
|
+
totalDepreciation: roundTo(cost - salvage, 6),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function decliningBalance(cost, salvage, life) {
|
|
34
|
+
const rate = 1 - (salvage / cost) ** (1 / life);
|
|
35
|
+
const schedule = [];
|
|
36
|
+
let bookValue = cost;
|
|
37
|
+
let accumulated = 0;
|
|
38
|
+
for (let year = 1; year <= life; year++) {
|
|
39
|
+
const dep = year === life
|
|
40
|
+
? bookValue - salvage // ensure final book value = salvage
|
|
41
|
+
: bookValue * rate;
|
|
42
|
+
accumulated += dep;
|
|
43
|
+
bookValue -= dep;
|
|
44
|
+
schedule.push({
|
|
45
|
+
year,
|
|
46
|
+
depreciation: roundTo(dep, 6),
|
|
47
|
+
accumulatedDepreciation: roundTo(accumulated, 6),
|
|
48
|
+
bookValue: roundTo(bookValue, 6),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
annualDepreciation: roundTo(schedule[0].depreciation, 6),
|
|
53
|
+
schedule,
|
|
54
|
+
totalDepreciation: roundTo(cost - salvage, 6),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=depreciation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"depreciation.js","sourceRoot":"","sources":["../../src/utility/depreciation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,UAAU,YAAY,CAAC,KAAwB;IACnD,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAC9D,IAAI,SAAS,IAAI,CAAC,IAAI,YAAY,GAAG,CAAC,IAAI,UAAU,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACvE,IAAI,YAAY,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC;IAE3C,IAAI,MAAM,KAAK,eAAe,EAAE,CAAC;QAC/B,OAAO,YAAY,CAAC,SAAS,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,MAAM,KAAK,mBAAmB,EAAE,CAAC;QACnC,OAAO,gBAAgB,CAAC,SAAS,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,OAAe,EAAE,IAAY;IAC/D,MAAM,MAAM,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC;IACvC,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAE7C,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;QACxC,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI;YACJ,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAChC,uBAAuB,EAAE,OAAO,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC;YAClD,SAAS,EAAE,OAAO,CAAC,IAAI,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC;SAC5C,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,kBAAkB,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACtC,QAAQ;QACR,iBAAiB,EAAE,OAAO,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC,CAAC;KAC9C,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY,EAAE,OAAe,EAAE,IAAY;IACnE,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAChD,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAC7C,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,KAAK,IAAI;YACvB,CAAC,CAAC,SAAS,GAAG,OAAO,CAAC,oCAAoC;YAC1D,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC;QACrB,WAAW,IAAI,GAAG,CAAC;QACnB,SAAS,IAAI,GAAG,CAAC;QAEjB,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI;YACJ,YAAY,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAC7B,uBAAuB,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;YAChD,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;SACjC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,kBAAkB,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;QACxD,QAAQ;QACR,iBAAiB,EAAE,OAAO,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC,CAAC;KAC9C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"histogram.d.ts","sourceRoot":"","sources":["../../src/utility/histogram.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAgB,MAAM,YAAY,CAAC;AAEhF,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,GAAG,IAAI,CA2CvE"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { roundTo } from '../utils.js';
|
|
2
|
+
export function histogram(input) {
|
|
3
|
+
const { data } = input;
|
|
4
|
+
if (!data || data.length === 0)
|
|
5
|
+
return null;
|
|
6
|
+
const n = data.length;
|
|
7
|
+
// Sturges' rule for default bin count
|
|
8
|
+
const numBins = input.bins ?? Math.max(1, Math.ceil(Math.log2(n) + 1));
|
|
9
|
+
if (numBins < 1)
|
|
10
|
+
return null;
|
|
11
|
+
const min = Math.min(...data);
|
|
12
|
+
const max = Math.max(...data);
|
|
13
|
+
// Handle case where all values are identical
|
|
14
|
+
const range = max - min;
|
|
15
|
+
const binWidth = range === 0 ? 1 : range / numBins;
|
|
16
|
+
const bins = [];
|
|
17
|
+
for (let i = 0; i < numBins; i++) {
|
|
18
|
+
const lower = min + i * binWidth;
|
|
19
|
+
const upper = min + (i + 1) * binWidth;
|
|
20
|
+
bins.push({
|
|
21
|
+
lower: roundTo(lower, 6),
|
|
22
|
+
upper: roundTo(upper, 6),
|
|
23
|
+
count: 0,
|
|
24
|
+
frequency: 0,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
for (const value of data) {
|
|
28
|
+
let idx = range === 0 ? 0 : Math.floor((value - min) / binWidth);
|
|
29
|
+
if (idx >= numBins)
|
|
30
|
+
idx = numBins - 1; // include max in last bin
|
|
31
|
+
bins[idx].count++;
|
|
32
|
+
}
|
|
33
|
+
for (const bin of bins) {
|
|
34
|
+
bin.frequency = roundTo(bin.count / n, 6);
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
bins,
|
|
38
|
+
binWidth: roundTo(binWidth, 6),
|
|
39
|
+
totalCount: n,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=histogram.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"histogram.js","sourceRoot":"","sources":["../../src/utility/histogram.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,UAAU,SAAS,CAAC,KAAqB;IAC7C,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IACvB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5C,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,sCAAsC;IACtC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACvE,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAE7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IAE9B,6CAA6C;IAC7C,MAAM,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC;IACxB,MAAM,QAAQ,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC;IAEnD,MAAM,IAAI,GAAmB,EAAE,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC;QACjC,MAAM,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC;YACR,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YACxB,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YACxB,KAAK,EAAE,CAAC;YACR,SAAS,EAAE,CAAC;SACb,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,IAAI,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;QACjE,IAAI,GAAG,IAAI,OAAO;YAAE,GAAG,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,0BAA0B;QACjE,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO;QACL,IAAI;QACJ,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9B,UAAU,EAAE,CAAC;KACd,CAAC;AACJ,CAAC"}
|
package/dist/utility/index.d.ts
CHANGED
|
@@ -1,4 +1,18 @@
|
|
|
1
1
|
export { solveAssignment } from './assignment.js';
|
|
2
2
|
export { calculateUnit, getUnitCategories, getUnitsForCategory } from './unit.js';
|
|
3
|
-
export
|
|
3
|
+
export { statistics } from './statistics.js';
|
|
4
|
+
export { percentile } from './percentile.js';
|
|
5
|
+
export { correlation } from './correlation.js';
|
|
6
|
+
export { regression } from './regression.js';
|
|
7
|
+
export { movingAverage } from './movingAverage.js';
|
|
8
|
+
export { linearInterpolation } from './linearInterpolation.js';
|
|
9
|
+
export { bilinearInterpolation } from './bilinearInterpolation.js';
|
|
10
|
+
export { roi } from './roi.js';
|
|
11
|
+
export { npv } from './npv.js';
|
|
12
|
+
export { depreciation } from './depreciation.js';
|
|
13
|
+
export { lcc } from './lcc.js';
|
|
14
|
+
export { normalize } from './normalize.js';
|
|
15
|
+
export { histogram } from './histogram.js';
|
|
16
|
+
export { weightedScore } from './weightedScore.js';
|
|
17
|
+
export type { AssignmentObjective, AssignmentInput, AssignmentPair, AssignmentResult, UnitCategory, UnitDef, UnitInput, ConversionEntry, UnitResult, StatisticsInput, StatisticsResult, PercentileInput, PercentileResult, CorrelationInput, CorrelationResult, RegressionInput, RegressionResult, MovingAverageMethod, MovingAverageInput, MovingAverageResult, LinearInterpolationInput, LinearInterpolationResult, BilinearInterpolationInput, BilinearInterpolationResult, RoiInput, RoiResult, NpvInput, NpvResult, DepreciationMethod, DepreciationInput, DepreciationYearEntry, DepreciationResult, LccInput, LccResult, NormalizeMethod, NormalizeInput, NormalizeResult, HistogramInput, HistogramBin, HistogramResult, WeightedScoreInput, WeightedScoreAlternative, WeightedScoreResult, } from './types.js';
|
|
4
18
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utility/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utility/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,YAAY,EAEV,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,gBAAgB,EAEhB,YAAY,EACZ,OAAO,EACP,SAAS,EACT,eAAe,EACf,UAAU,EAEV,eAAe,EACf,gBAAgB,EAEhB,eAAe,EACf,gBAAgB,EAEhB,gBAAgB,EAChB,iBAAiB,EAEjB,eAAe,EACf,gBAAgB,EAEhB,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EAEnB,wBAAwB,EACxB,yBAAyB,EAEzB,0BAA0B,EAC1B,2BAA2B,EAE3B,QAAQ,EACR,SAAS,EAET,QAAQ,EACR,SAAS,EAET,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAElB,QAAQ,EACR,SAAS,EAET,eAAe,EACf,cAAc,EACd,eAAe,EAEf,cAAc,EACd,YAAY,EACZ,eAAe,EAEf,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
|
package/dist/utility/index.js
CHANGED
|
@@ -1,4 +1,18 @@
|
|
|
1
1
|
// Utility domain formulas
|
|
2
2
|
export { solveAssignment } from './assignment.js';
|
|
3
3
|
export { calculateUnit, getUnitCategories, getUnitsForCategory } from './unit.js';
|
|
4
|
+
export { statistics } from './statistics.js';
|
|
5
|
+
export { percentile } from './percentile.js';
|
|
6
|
+
export { correlation } from './correlation.js';
|
|
7
|
+
export { regression } from './regression.js';
|
|
8
|
+
export { movingAverage } from './movingAverage.js';
|
|
9
|
+
export { linearInterpolation } from './linearInterpolation.js';
|
|
10
|
+
export { bilinearInterpolation } from './bilinearInterpolation.js';
|
|
11
|
+
export { roi } from './roi.js';
|
|
12
|
+
export { npv } from './npv.js';
|
|
13
|
+
export { depreciation } from './depreciation.js';
|
|
14
|
+
export { lcc } from './lcc.js';
|
|
15
|
+
export { normalize } from './normalize.js';
|
|
16
|
+
export { histogram } from './histogram.js';
|
|
17
|
+
export { weightedScore } from './weightedScore.js';
|
|
4
18
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utility/index.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utility/index.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lcc.d.ts","sourceRoot":"","sources":["../../src/utility/lcc.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEtD,wBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI,CA0BrD"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { roundTo } from '../utils.js';
|
|
2
|
+
export function lcc(input) {
|
|
3
|
+
const { initialCost, annualOperatingCost, annualMaintenanceCost, disposalCost, lifespan, discountRate } = input;
|
|
4
|
+
if (initialCost < 0 || lifespan <= 0)
|
|
5
|
+
return null;
|
|
6
|
+
if (discountRate < 0 || discountRate >= 1)
|
|
7
|
+
return null;
|
|
8
|
+
// Present value of annuity factor: (1 - (1+r)^-n) / r
|
|
9
|
+
const pvFactor = discountRate === 0
|
|
10
|
+
? lifespan
|
|
11
|
+
: (1 - (1 + discountRate) ** -lifespan) / discountRate;
|
|
12
|
+
const presentValueOperating = annualOperatingCost * pvFactor;
|
|
13
|
+
const presentValueMaintenance = annualMaintenanceCost * pvFactor;
|
|
14
|
+
const presentValueDisposal = disposalCost / (1 + discountRate) ** lifespan;
|
|
15
|
+
const totalLcc = initialCost + presentValueOperating + presentValueMaintenance + presentValueDisposal;
|
|
16
|
+
// Annual equivalent cost
|
|
17
|
+
const annualEquivalentCost = pvFactor === 0 ? totalLcc : totalLcc / pvFactor;
|
|
18
|
+
return {
|
|
19
|
+
totalLcc: roundTo(totalLcc, 6),
|
|
20
|
+
presentValueOperating: roundTo(presentValueOperating, 6),
|
|
21
|
+
presentValueMaintenance: roundTo(presentValueMaintenance, 6),
|
|
22
|
+
presentValueDisposal: roundTo(presentValueDisposal, 6),
|
|
23
|
+
annualEquivalentCost: roundTo(annualEquivalentCost, 6),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=lcc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lcc.js","sourceRoot":"","sources":["../../src/utility/lcc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,UAAU,GAAG,CAAC,KAAe;IACjC,MAAM,EAAE,WAAW,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;IAChH,IAAI,WAAW,GAAG,CAAC,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAClD,IAAI,YAAY,GAAG,CAAC,IAAI,YAAY,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvD,sDAAsD;IACtD,MAAM,QAAQ,GAAG,YAAY,KAAK,CAAC;QACjC,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,YAAY,CAAC;IAEzD,MAAM,qBAAqB,GAAG,mBAAmB,GAAG,QAAQ,CAAC;IAC7D,MAAM,uBAAuB,GAAG,qBAAqB,GAAG,QAAQ,CAAC;IACjE,MAAM,oBAAoB,GAAG,YAAY,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,IAAI,QAAQ,CAAC;IAE3E,MAAM,QAAQ,GAAG,WAAW,GAAG,qBAAqB,GAAG,uBAAuB,GAAG,oBAAoB,CAAC;IAEtG,yBAAyB;IACzB,MAAM,oBAAoB,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAE7E,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9B,qBAAqB,EAAE,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;QACxD,uBAAuB,EAAE,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAAC;QAC5D,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;QACtD,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;KACvD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linearInterpolation.d.ts","sourceRoot":"","sources":["../../src/utility/linearInterpolation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEtF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,yBAAyB,GAAG,IAAI,CAyCrG"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { roundTo } from '../utils.js';
|
|
2
|
+
export function linearInterpolation(input) {
|
|
3
|
+
const { x, y, target } = input;
|
|
4
|
+
if (!x || !y || x.length !== y.length || x.length < 2)
|
|
5
|
+
return null;
|
|
6
|
+
// Find bracketing interval
|
|
7
|
+
let lowerIndex = 0;
|
|
8
|
+
let upperIndex = x.length - 1;
|
|
9
|
+
let isExtrapolation = false;
|
|
10
|
+
if (target <= x[0]) {
|
|
11
|
+
lowerIndex = 0;
|
|
12
|
+
upperIndex = 1;
|
|
13
|
+
isExtrapolation = target < x[0];
|
|
14
|
+
}
|
|
15
|
+
else if (target >= x[x.length - 1]) {
|
|
16
|
+
lowerIndex = x.length - 2;
|
|
17
|
+
upperIndex = x.length - 1;
|
|
18
|
+
isExtrapolation = target > x[x.length - 1];
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
for (let i = 0; i < x.length - 1; i++) {
|
|
22
|
+
if (target >= x[i] && target <= x[i + 1]) {
|
|
23
|
+
lowerIndex = i;
|
|
24
|
+
upperIndex = i + 1;
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const x0 = x[lowerIndex];
|
|
30
|
+
const x1 = x[upperIndex];
|
|
31
|
+
const y0 = y[lowerIndex];
|
|
32
|
+
const y1 = y[upperIndex];
|
|
33
|
+
const t = x1 === x0 ? 0 : (target - x0) / (x1 - x0);
|
|
34
|
+
const value = y0 + t * (y1 - y0);
|
|
35
|
+
return {
|
|
36
|
+
value: roundTo(value, 6),
|
|
37
|
+
lowerIndex,
|
|
38
|
+
upperIndex,
|
|
39
|
+
isExtrapolation,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=linearInterpolation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linearInterpolation.js","sourceRoot":"","sources":["../../src/utility/linearInterpolation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,UAAU,mBAAmB,CAAC,KAA+B;IACjE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAC/B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnE,2BAA2B;IAC3B,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,UAAU,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9B,IAAI,eAAe,GAAG,KAAK,CAAC;IAE5B,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnB,UAAU,GAAG,CAAC,CAAC;QACf,UAAU,GAAG,CAAC,CAAC;QACf,eAAe,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;SAAM,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QACrC,UAAU,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAC1B,UAAU,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAC1B,eAAe,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACzC,UAAU,GAAG,CAAC,CAAC;gBACf,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;gBACnB,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IACzB,MAAM,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IACzB,MAAM,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IACzB,MAAM,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IAEzB,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAEjC,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACxB,UAAU;QACV,UAAU;QACV,eAAe;KAChB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"movingAverage.d.ts","sourceRoot":"","sources":["../../src/utility/movingAverage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE1E,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,mBAAmB,GAAG,IAAI,CAWnF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { roundTo } from '../utils.js';
|
|
2
|
+
export function movingAverage(input) {
|
|
3
|
+
const { data, window, method } = input;
|
|
4
|
+
if (!data || data.length === 0 || window < 1 || window > data.length)
|
|
5
|
+
return null;
|
|
6
|
+
if (method === 'sma') {
|
|
7
|
+
return { values: sma(data, window) };
|
|
8
|
+
}
|
|
9
|
+
if (method === 'ema') {
|
|
10
|
+
return { values: ema(data, window) };
|
|
11
|
+
}
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
function sma(data, window) {
|
|
15
|
+
const result = [];
|
|
16
|
+
for (let i = window - 1; i < data.length; i++) {
|
|
17
|
+
let sum = 0;
|
|
18
|
+
for (let j = i - window + 1; j <= i; j++) {
|
|
19
|
+
sum += data[j];
|
|
20
|
+
}
|
|
21
|
+
result.push(roundTo(sum / window, 6));
|
|
22
|
+
}
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
function ema(data, window) {
|
|
26
|
+
const k = 2 / (window + 1);
|
|
27
|
+
const result = [];
|
|
28
|
+
// First EMA value is SMA of first window
|
|
29
|
+
let sum = 0;
|
|
30
|
+
for (let i = 0; i < window; i++) {
|
|
31
|
+
sum += data[i];
|
|
32
|
+
}
|
|
33
|
+
let prev = sum / window;
|
|
34
|
+
result.push(roundTo(prev, 6));
|
|
35
|
+
for (let i = window; i < data.length; i++) {
|
|
36
|
+
prev = data[i] * k + prev * (1 - k);
|
|
37
|
+
result.push(roundTo(prev, 6));
|
|
38
|
+
}
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=movingAverage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"movingAverage.js","sourceRoot":"","sources":["../../src/utility/movingAverage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,UAAU,aAAa,CAAC,KAAyB;IACrD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACvC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAElF,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;IACvC,CAAC;IACD,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;IACvC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,GAAG,CAAC,IAAc,EAAE,MAAc;IACzC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,GAAG,CAAC,IAAc,EAAE,MAAc;IACzC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,yCAAyC;IACzC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IACD,IAAI,IAAI,GAAG,GAAG,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE9B,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/utility/normalize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElE,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,GAAG,IAAI,CAiCvE"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { roundTo } from '../utils.js';
|
|
2
|
+
export function normalize(input) {
|
|
3
|
+
const { data, method } = input;
|
|
4
|
+
if (!data || data.length === 0)
|
|
5
|
+
return null;
|
|
6
|
+
const n = data.length;
|
|
7
|
+
const min = Math.min(...data);
|
|
8
|
+
const max = Math.max(...data);
|
|
9
|
+
const mean = data.reduce((a, v) => a + v, 0) / n;
|
|
10
|
+
const variance = data.reduce((a, v) => a + (v - mean) ** 2, 0) / n;
|
|
11
|
+
const stdDev = Math.sqrt(variance);
|
|
12
|
+
let values;
|
|
13
|
+
if (method === 'min-max') {
|
|
14
|
+
const range = max - min;
|
|
15
|
+
values = range === 0
|
|
16
|
+
? data.map(() => 0)
|
|
17
|
+
: data.map((v) => roundTo((v - min) / range, 6));
|
|
18
|
+
}
|
|
19
|
+
else if (method === 'z-score') {
|
|
20
|
+
values = stdDev === 0
|
|
21
|
+
? data.map(() => 0)
|
|
22
|
+
: data.map((v) => roundTo((v - mean) / stdDev, 6));
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
values,
|
|
29
|
+
min: roundTo(min, 6),
|
|
30
|
+
max: roundTo(max, 6),
|
|
31
|
+
mean: roundTo(mean, 6),
|
|
32
|
+
stdDev: roundTo(stdDev, 6),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/utility/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,UAAU,SAAS,CAAC,KAAqB;IAC7C,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAC/B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5C,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEnC,IAAI,MAAgB,CAAC;IAErB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC;QACxB,MAAM,GAAG,KAAK,KAAK,CAAC;YAClB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACnB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;SAAM,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,GAAG,MAAM,KAAK,CAAC;YACnB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACnB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,MAAM;QACN,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACpB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACpB,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;KAC3B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npv.d.ts","sourceRoot":"","sources":["../../src/utility/npv.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEtD,wBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI,CAqBrD"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { roundTo } from '../utils.js';
|
|
2
|
+
export function npv(input) {
|
|
3
|
+
const { initialInvestment, cashFlows, discountRate } = input;
|
|
4
|
+
if (initialInvestment < 0 || !cashFlows || cashFlows.length === 0)
|
|
5
|
+
return null;
|
|
6
|
+
if (discountRate < 0 || discountRate >= 1)
|
|
7
|
+
return null;
|
|
8
|
+
const pvCashFlows = cashFlows.reduce((acc, cf, i) => {
|
|
9
|
+
return acc + cf / (1 + discountRate) ** (i + 1);
|
|
10
|
+
}, 0);
|
|
11
|
+
const npvValue = pvCashFlows - initialInvestment;
|
|
12
|
+
const pvTotal = pvCashFlows;
|
|
13
|
+
const profitabilityIndex = initialInvestment === 0 ? 0 : pvTotal / initialInvestment;
|
|
14
|
+
const irr = calculateIrr(initialInvestment, cashFlows);
|
|
15
|
+
return {
|
|
16
|
+
npv: roundTo(npvValue, 6),
|
|
17
|
+
irr: irr !== null ? roundTo(irr, 6) : null,
|
|
18
|
+
profitabilityIndex: roundTo(profitabilityIndex, 6),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function calculateIrr(investment, cashFlows) {
|
|
22
|
+
// Newton-Raphson method to find IRR
|
|
23
|
+
let rate = 0.1; // initial guess
|
|
24
|
+
const maxIter = 100;
|
|
25
|
+
const tolerance = 1e-8;
|
|
26
|
+
for (let iter = 0; iter < maxIter; iter++) {
|
|
27
|
+
let npvVal = -investment;
|
|
28
|
+
let derivative = 0;
|
|
29
|
+
for (let i = 0; i < cashFlows.length; i++) {
|
|
30
|
+
const t = i + 1;
|
|
31
|
+
const discounted = cashFlows[i] / (1 + rate) ** t;
|
|
32
|
+
npvVal += discounted;
|
|
33
|
+
derivative -= t * cashFlows[i] / (1 + rate) ** (t + 1);
|
|
34
|
+
}
|
|
35
|
+
if (Math.abs(npvVal) < tolerance)
|
|
36
|
+
return rate;
|
|
37
|
+
if (derivative === 0)
|
|
38
|
+
return null;
|
|
39
|
+
rate = rate - npvVal / derivative;
|
|
40
|
+
if (rate <= -1)
|
|
41
|
+
return null; // diverged
|
|
42
|
+
}
|
|
43
|
+
return null; // did not converge
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=npv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npv.js","sourceRoot":"","sources":["../../src/utility/npv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,UAAU,GAAG,CAAC,KAAe;IACjC,MAAM,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;IAC7D,IAAI,iBAAiB,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/E,IAAI,YAAY,GAAG,CAAC,IAAI,YAAY,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvD,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE;QAClD,OAAO,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC,EAAE,CAAC,CAAC,CAAC;IAEN,MAAM,QAAQ,GAAG,WAAW,GAAG,iBAAiB,CAAC;IAEjD,MAAM,OAAO,GAAG,WAAW,CAAC;IAC5B,MAAM,kBAAkB,GAAG,iBAAiB,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,iBAAiB,CAAC;IAErF,MAAM,GAAG,GAAG,YAAY,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;IAEvD,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzB,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QAC1C,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;KACnD,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,UAAkB,EAAE,SAAmB;IAC3D,oCAAoC;IACpC,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,gBAAgB;IAChC,MAAM,OAAO,GAAG,GAAG,CAAC;IACpB,MAAM,SAAS,GAAG,IAAI,CAAC;IAEvB,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QAC1C,IAAI,MAAM,GAAG,CAAC,UAAU,CAAC;QACzB,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAChB,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,IAAI,UAAU,CAAC;YACrB,UAAU,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,SAAS;YAAE,OAAO,IAAI,CAAC;QAC9C,IAAI,UAAU,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAElC,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,UAAU,CAAC;QAElC,IAAI,IAAI,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,WAAW;IAC1C,CAAC;IAED,OAAO,IAAI,CAAC,CAAC,mBAAmB;AAClC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"percentile.d.ts","sourceRoot":"","sources":["../../src/utility/percentile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEpE,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,GAAG,IAAI,CAsB1E"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { roundTo } from '../utils.js';
|
|
2
|
+
export function percentile(input) {
|
|
3
|
+
const { data, percentile: p } = input;
|
|
4
|
+
if (!data || data.length === 0)
|
|
5
|
+
return null;
|
|
6
|
+
if (p < 0 || p > 100)
|
|
7
|
+
return null;
|
|
8
|
+
const sorted = [...data].sort((a, b) => a - b);
|
|
9
|
+
const n = sorted.length;
|
|
10
|
+
if (p === 0)
|
|
11
|
+
return { percentile: p, value: sorted[0] };
|
|
12
|
+
if (p === 100)
|
|
13
|
+
return { percentile: p, value: sorted[n - 1] };
|
|
14
|
+
const rank = (p / 100) * (n - 1);
|
|
15
|
+
const lower = Math.floor(rank);
|
|
16
|
+
const upper = Math.ceil(rank);
|
|
17
|
+
const frac = rank - lower;
|
|
18
|
+
const value = sorted[lower] + frac * (sorted[upper] - sorted[lower]);
|
|
19
|
+
return {
|
|
20
|
+
percentile: p,
|
|
21
|
+
value: roundTo(value, 6),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=percentile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"percentile.js","sourceRoot":"","sources":["../../src/utility/percentile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC;IACtC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG;QAAE,OAAO,IAAI,CAAC;IAElC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IAExB,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;IAE9D,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;IAE1B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAErE,OAAO;QACL,UAAU,EAAE,CAAC;QACb,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;KACzB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regression.d.ts","sourceRoot":"","sources":["../../src/utility/regression.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEpE,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,GAAG,IAAI,CA2C1E"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { roundTo } from '../utils.js';
|
|
2
|
+
export function regression(input) {
|
|
3
|
+
const { x, y } = input;
|
|
4
|
+
if (!x || !y || x.length !== y.length || x.length < 2)
|
|
5
|
+
return null;
|
|
6
|
+
const n = x.length;
|
|
7
|
+
const meanX = x.reduce((a, v) => a + v, 0) / n;
|
|
8
|
+
const meanY = y.reduce((a, v) => a + v, 0) / n;
|
|
9
|
+
let sumXY = 0;
|
|
10
|
+
let sumX2 = 0;
|
|
11
|
+
let sumY2 = 0;
|
|
12
|
+
for (let i = 0; i < n; i++) {
|
|
13
|
+
const dx = x[i] - meanX;
|
|
14
|
+
const dy = y[i] - meanY;
|
|
15
|
+
sumXY += dx * dy;
|
|
16
|
+
sumX2 += dx * dx;
|
|
17
|
+
sumY2 += dy * dy;
|
|
18
|
+
}
|
|
19
|
+
if (sumX2 === 0)
|
|
20
|
+
return null;
|
|
21
|
+
const slope = sumXY / sumX2;
|
|
22
|
+
const intercept = meanY - slope * meanX;
|
|
23
|
+
const ssTot = sumY2;
|
|
24
|
+
const ssRes = y.reduce((acc, yi, i) => {
|
|
25
|
+
const predicted = slope * x[i] + intercept;
|
|
26
|
+
return acc + (yi - predicted) ** 2;
|
|
27
|
+
}, 0);
|
|
28
|
+
const r2 = ssTot === 0 ? 1 : 1 - ssRes / ssTot;
|
|
29
|
+
const slopeStr = roundTo(slope, 6);
|
|
30
|
+
const interceptStr = roundTo(intercept, 6);
|
|
31
|
+
const sign = interceptStr >= 0 ? '+' : '-';
|
|
32
|
+
const equation = `y = ${slopeStr}x ${sign} ${Math.abs(interceptStr)}`;
|
|
33
|
+
return {
|
|
34
|
+
slope: roundTo(slope, 6),
|
|
35
|
+
intercept: roundTo(intercept, 6),
|
|
36
|
+
r2: roundTo(r2, 6),
|
|
37
|
+
equation,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=regression.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regression.js","sourceRoot":"","sources":["../../src/utility/regression.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC;IACvB,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnE,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IAE/C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACxB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACxB,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;QACjB,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;QACjB,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;IACnB,CAAC;IAED,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE7B,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IAC5B,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IAExC,MAAM,KAAK,GAAG,KAAK,CAAC;IACpB,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE;QACpC,MAAM,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QAC3C,OAAO,GAAG,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,EAAE,CAAC,CAAC,CAAC;IACN,MAAM,EAAE,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC;IAE/C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3C,MAAM,QAAQ,GAAG,OAAO,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;IAEtE,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACxB,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAChC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAClB,QAAQ;KACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roi.d.ts","sourceRoot":"","sources":["../../src/utility/roi.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEtD,wBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI,CAiBrD"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { roundTo } from '../utils.js';
|
|
2
|
+
export function roi(input) {
|
|
3
|
+
const { investment, annualReturn, years } = input;
|
|
4
|
+
if (investment <= 0 || annualReturn <= 0 || years <= 0)
|
|
5
|
+
return null;
|
|
6
|
+
const totalReturn = annualReturn * years;
|
|
7
|
+
const netProfit = totalReturn - investment;
|
|
8
|
+
const roiPercent = (netProfit / investment) * 100;
|
|
9
|
+
const annualRoi = ((1 + netProfit / investment) ** (1 / years) - 1) * 100;
|
|
10
|
+
const paybackPeriod = investment / annualReturn;
|
|
11
|
+
return {
|
|
12
|
+
roi: roundTo(roiPercent, 6),
|
|
13
|
+
annualRoi: roundTo(annualRoi, 6),
|
|
14
|
+
paybackPeriod: roundTo(paybackPeriod, 6),
|
|
15
|
+
totalReturn: roundTo(totalReturn, 6),
|
|
16
|
+
netProfit: roundTo(netProfit, 6),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=roi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roi.js","sourceRoot":"","sources":["../../src/utility/roi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,UAAU,GAAG,CAAC,KAAe;IACjC,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAClD,IAAI,UAAU,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpE,MAAM,WAAW,GAAG,YAAY,GAAG,KAAK,CAAC;IACzC,MAAM,SAAS,GAAG,WAAW,GAAG,UAAU,CAAC;IAC3C,MAAM,UAAU,GAAG,CAAC,SAAS,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC;IAClD,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;IAC1E,MAAM,aAAa,GAAG,UAAU,GAAG,YAAY,CAAC;IAEhD,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAC3B,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAChC,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;QACxC,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QACpC,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;KACjC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statistics.d.ts","sourceRoot":"","sources":["../../src/utility/statistics.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEpE,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,GAAG,IAAI,CAiC1E"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { roundTo } from '../utils.js';
|
|
2
|
+
export function statistics(input) {
|
|
3
|
+
const { data } = input;
|
|
4
|
+
if (!data || data.length === 0)
|
|
5
|
+
return null;
|
|
6
|
+
const n = data.length;
|
|
7
|
+
const sorted = [...data].sort((a, b) => a - b);
|
|
8
|
+
const sum = data.reduce((acc, v) => acc + v, 0);
|
|
9
|
+
const mean = sum / n;
|
|
10
|
+
const min = sorted[0];
|
|
11
|
+
const max = sorted[n - 1];
|
|
12
|
+
const range = max - min;
|
|
13
|
+
let median;
|
|
14
|
+
if (n % 2 === 0) {
|
|
15
|
+
median = (sorted[n / 2 - 1] + sorted[n / 2]) / 2;
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
median = sorted[Math.floor(n / 2)];
|
|
19
|
+
}
|
|
20
|
+
const variance = data.reduce((acc, v) => acc + (v - mean) ** 2, 0) / n;
|
|
21
|
+
const stdDev = Math.sqrt(variance);
|
|
22
|
+
return {
|
|
23
|
+
count: n,
|
|
24
|
+
sum: roundTo(sum, 6),
|
|
25
|
+
mean: roundTo(mean, 6),
|
|
26
|
+
median: roundTo(median, 6),
|
|
27
|
+
min: roundTo(min, 6),
|
|
28
|
+
max: roundTo(max, 6),
|
|
29
|
+
range: roundTo(range, 6),
|
|
30
|
+
variance: roundTo(variance, 6),
|
|
31
|
+
stdDev: roundTo(stdDev, 6),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=statistics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statistics.js","sourceRoot":"","sources":["../../src/utility/statistics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IACvB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5C,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC;IACrB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,MAAM,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC;IAExB,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAChB,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEnC,OAAO;QACL,KAAK,EAAE,CAAC;QACR,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACpB,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1B,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACpB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9B,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;KAC3B,CAAC;AACJ,CAAC"}
|