@syncfusion/ej2-calculate 35.1.37
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/.eslintrc.json +263 -0
- package/README.md +132 -0
- package/base.d.ts +4 -0
- package/base.js +4 -0
- package/common.d.ts +4 -0
- package/common.js +4 -0
- package/dist/ej2-calculate.umd.min.js +11 -0
- package/dist/ej2-calculate.umd.min.js.map +1 -0
- package/dist/es6/ej2-calculate.es2015.js +24801 -0
- package/dist/es6/ej2-calculate.es2015.js.map +1 -0
- package/dist/es6/ej2-calculate.es5.js +27229 -0
- package/dist/es6/ej2-calculate.es5.js.map +1 -0
- package/dist/global/ej2-calculate.min.js +11 -0
- package/dist/global/ej2-calculate.min.js.map +1 -0
- package/dist/global/index.d.ts +14 -0
- package/formulas.d.ts +4 -0
- package/formulas.js +4 -0
- package/index.d.ts +4 -0
- package/index.js +4 -0
- package/license +10 -0
- package/package.json +30 -0
- package/src/base/calculate-model.d.ts +4 -0
- package/src/base/calculate-model.js +0 -0
- package/src/base/calculate.d.ts +1105 -0
- package/src/base/calculate.js +4720 -0
- package/src/base/index.d.ts +8 -0
- package/src/base/index.js +7 -0
- package/src/base/parser.d.ts +208 -0
- package/src/base/parser.js +1512 -0
- package/src/common/address.d.ts +59 -0
- package/src/common/address.js +96 -0
- package/src/common/cell-ref.d.ts +32 -0
- package/src/common/cell-ref.js +112 -0
- package/src/common/common.d.ts +44 -0
- package/src/common/common.js +134 -0
- package/src/common/enum.d.ts +94 -0
- package/src/common/enum.js +97 -0
- package/src/common/index.d.ts +9 -0
- package/src/common/index.js +8 -0
- package/src/common/interface.d.ts +122 -0
- package/src/common/interface.js +0 -0
- package/src/common/l10n.d.ts +24 -0
- package/src/common/l10n.js +54 -0
- package/src/common/number-date.d.ts +26 -0
- package/src/common/number-date.js +38 -0
- package/src/common/sheet-info.d.ts +10 -0
- package/src/common/sheet-info.js +17 -0
- package/src/common/sort.d.ts +17 -0
- package/src/common/sort.js +44 -0
- package/src/formulas/array.d.ts +47 -0
- package/src/formulas/array.js +718 -0
- package/src/formulas/basic.d.ts +47 -0
- package/src/formulas/basic.js +181 -0
- package/src/formulas/complex-numbers.d.ts +207 -0
- package/src/formulas/complex-numbers.js +549 -0
- package/src/formulas/database.d.ts +152 -0
- package/src/formulas/database.js +579 -0
- package/src/formulas/date-time-extra.d.ts +97 -0
- package/src/formulas/date-time-extra.js +415 -0
- package/src/formulas/date-time-intl.d.ts +57 -0
- package/src/formulas/date-time-intl.js +309 -0
- package/src/formulas/date-time.d.ts +164 -0
- package/src/formulas/date-time.js +1021 -0
- package/src/formulas/engineering-base.d.ts +150 -0
- package/src/formulas/engineering-base.js +404 -0
- package/src/formulas/engineering-bessel.d.ts +65 -0
- package/src/formulas/engineering-bessel.js +167 -0
- package/src/formulas/engineering-convert.d.ts +35 -0
- package/src/formulas/engineering-convert.js +120 -0
- package/src/formulas/engineering-misc.d.ts +64 -0
- package/src/formulas/engineering-misc.js +168 -0
- package/src/formulas/financial-amortization-ecma.d.ts +87 -0
- package/src/formulas/financial-amortization-ecma.js +288 -0
- package/src/formulas/financial-annuity.d.ts +104 -0
- package/src/formulas/financial-annuity.js +419 -0
- package/src/formulas/financial-bond-helpers.d.ts +106 -0
- package/src/formulas/financial-bond-helpers.js +190 -0
- package/src/formulas/financial-cashflow.d.ts +47 -0
- package/src/formulas/financial-cashflow.js +203 -0
- package/src/formulas/financial-coupons.d.ts +227 -0
- package/src/formulas/financial-coupons.js +810 -0
- package/src/formulas/financial-depreciation.d.ts +64 -0
- package/src/formulas/financial-depreciation.js +247 -0
- package/src/formulas/financial-rates.d.ts +54 -0
- package/src/formulas/financial-rates.js +140 -0
- package/src/formulas/financial-securities.d.ts +126 -0
- package/src/formulas/financial-securities.js +488 -0
- package/src/formulas/formula-math-helpers.d.ts +212 -0
- package/src/formulas/formula-math-helpers.js +599 -0
- package/src/formulas/formula-module-base.d.ts +54 -0
- package/src/formulas/formula-module-base.js +125 -0
- package/src/formulas/formula-owner.d.ts +17 -0
- package/src/formulas/formula-owner.js +0 -0
- package/src/formulas/index.d.ts +68 -0
- package/src/formulas/index.js +67 -0
- package/src/formulas/information-advanced.d.ts +44 -0
- package/src/formulas/information-advanced.js +157 -0
- package/src/formulas/information-ecma.d.ts +33 -0
- package/src/formulas/information-ecma.js +88 -0
- package/src/formulas/information-extra.d.ts +146 -0
- package/src/formulas/information-extra.js +351 -0
- package/src/formulas/information.d.ts +34 -0
- package/src/formulas/information.js +78 -0
- package/src/formulas/logical-extra.d.ts +75 -0
- package/src/formulas/logical-extra.js +217 -0
- package/src/formulas/logical.d.ts +83 -0
- package/src/formulas/logical.js +296 -0
- package/src/formulas/lookup-array.d.ts +98 -0
- package/src/formulas/lookup-array.js +364 -0
- package/src/formulas/lookup-ref-extra.d.ts +64 -0
- package/src/formulas/lookup-ref-extra.js +180 -0
- package/src/formulas/lookup-ref.d.ts +84 -0
- package/src/formulas/lookup-ref.js +263 -0
- package/src/formulas/lookup.d.ts +114 -0
- package/src/formulas/lookup.js +881 -0
- package/src/formulas/math-aggregate.d.ts +74 -0
- package/src/formulas/math-aggregate.js +376 -0
- package/src/formulas/math-ceiling-ecma.d.ts +42 -0
- package/src/formulas/math-ceiling-ecma.js +123 -0
- package/src/formulas/math-combinatorics.d.ts +75 -0
- package/src/formulas/math-combinatorics.js +290 -0
- package/src/formulas/math-misc.d.ts +164 -0
- package/src/formulas/math-misc.js +889 -0
- package/src/formulas/math-number.d.ts +76 -0
- package/src/formulas/math-number.js +261 -0
- package/src/formulas/math-rounding.d.ts +115 -0
- package/src/formulas/math-rounding.js +728 -0
- package/src/formulas/math-trig-hyperbolic.d.ts +55 -0
- package/src/formulas/math-trig-hyperbolic.js +113 -0
- package/src/formulas/math-trig.d.ts +165 -0
- package/src/formulas/math-trig.js +334 -0
- package/src/formulas/matrix-base.d.ts +13 -0
- package/src/formulas/matrix-base.js +169 -0
- package/src/formulas/matrix.d.ts +64 -0
- package/src/formulas/matrix.js +161 -0
- package/src/formulas/regression-ecma.d.ts +66 -0
- package/src/formulas/regression-ecma.js +234 -0
- package/src/formulas/statistical-advanced.d.ts +125 -0
- package/src/formulas/statistical-advanced.js +756 -0
- package/src/formulas/statistical-correlation.d.ts +75 -0
- package/src/formulas/statistical-correlation.js +198 -0
- package/src/formulas/statistical-dispersion.d.ts +108 -0
- package/src/formulas/statistical-dispersion.js +337 -0
- package/src/formulas/statistical-distribution-extended.d.ts +176 -0
- package/src/formulas/statistical-distribution-extended.js +668 -0
- package/src/formulas/statistical-distribution.d.ts +104 -0
- package/src/formulas/statistical-distribution.js +368 -0
- package/src/formulas/statistical-ecma.d.ts +95 -0
- package/src/formulas/statistical-ecma.js +392 -0
- package/src/formulas/statistical-extended.d.ts +136 -0
- package/src/formulas/statistical-extended.js +340 -0
- package/src/formulas/statistical-ifs.d.ts +46 -0
- package/src/formulas/statistical-ifs.js +180 -0
- package/src/formulas/statistical-moments.d.ts +84 -0
- package/src/formulas/statistical-moments.js +269 -0
- package/src/formulas/statistical-percentile.d.ts +56 -0
- package/src/formulas/statistical-percentile.js +195 -0
- package/src/formulas/statistical-sample-base.d.ts +14 -0
- package/src/formulas/statistical-sample-base.js +124 -0
- package/src/formulas/statistical.d.ts +135 -0
- package/src/formulas/statistical.js +542 -0
- package/src/formulas/text-advanced.d.ts +64 -0
- package/src/formulas/text-advanced.js +222 -0
- package/src/formulas/text-ecma.d.ts +54 -0
- package/src/formulas/text-ecma.js +106 -0
- package/src/formulas/text-extra.d.ts +216 -0
- package/src/formulas/text-extra.js +657 -0
- package/src/formulas/text.d.ts +125 -0
- package/src/formulas/text.js +628 -0
- package/src/global.js +1 -0
- package/src/index.d.ts +14 -0
- package/src/index.js +14 -0
- package/tslint.json +111 -0
|
@@ -0,0 +1,756 @@
|
|
|
1
|
+
var __extends = (this && this.__extends) || (function () {
|
|
2
|
+
var extendStatics = function (d, b) {
|
|
3
|
+
extendStatics = Object.setPrototypeOf ||
|
|
4
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
5
|
+
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
|
|
6
|
+
return extendStatics(d, b);
|
|
7
|
+
};
|
|
8
|
+
return function (d, b) {
|
|
9
|
+
extendStatics(d, b);
|
|
10
|
+
function __() { this.constructor = d; }
|
|
11
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
12
|
+
};
|
|
13
|
+
})();
|
|
14
|
+
import { FormulasErrorsStrings, CommonErrors } from '../common/index';
|
|
15
|
+
import { isNullOrUndefined } from '@syncfusion/ej2-base';
|
|
16
|
+
import { isNumber } from '../common/number-date';
|
|
17
|
+
import { isCellReference } from '../common/cell-ref';
|
|
18
|
+
import { FormulaModuleBase } from './formula-module-base';
|
|
19
|
+
/**
|
|
20
|
+
* Extended statistical summaries including ranked averages, modes, and specialized aggregates.
|
|
21
|
+
*
|
|
22
|
+
* Registered functions: SMALL, LARGE, MEDIAN, SLOPE, INTERCEPT, RSQ, GEOMEAN.
|
|
23
|
+
*
|
|
24
|
+
* @hidden
|
|
25
|
+
*/
|
|
26
|
+
var StatisticalAdvancedFormulas = /** @class */ (function (_super) {
|
|
27
|
+
__extends(StatisticalAdvancedFormulas, _super);
|
|
28
|
+
/**
|
|
29
|
+
* @hidden
|
|
30
|
+
* @param {FormulaOwner} owner - Formula registration owner ({@link BasicFormulas}).
|
|
31
|
+
*/
|
|
32
|
+
function StatisticalAdvancedFormulas(owner) {
|
|
33
|
+
var _this = _super.call(this, owner) || this;
|
|
34
|
+
/** Formula definitions registered with {@link BasicFormulas}. */
|
|
35
|
+
_this.formulas = [
|
|
36
|
+
{ formulaName: 'SMALL', category: 'Statistical', description: 'Returns the k-th smallest value in a given array.' },
|
|
37
|
+
{ formulaName: 'LARGE', category: 'Statistical', description: 'Returns the k-th largest value in a given array.' },
|
|
38
|
+
{ formulaName: 'MEDIAN', category: 'Statistical', description: 'Returns the median of the given set of numbers.' },
|
|
39
|
+
{ formulaName: 'SLOPE', category: 'Statistical', description: 'Returns the slope of the line from linear regression of the data points.' },
|
|
40
|
+
{ formulaName: 'INTERCEPT', category: 'Statistical', description: 'Calculates the point of the Y-intercept line via linear regression.' },
|
|
41
|
+
{ formulaName: 'RSQ', category: 'Statistical', description: 'Returns the square of the Pearson product moment correlation coefficient based on data points in known_ys and known_xs.' },
|
|
42
|
+
{ formulaName: 'GEOMEAN', category: 'Statistical', description: 'Returns the geometric mean of an array or range of positive data.' }
|
|
43
|
+
];
|
|
44
|
+
return _this;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Returns the median of the given set of numbers.
|
|
48
|
+
*
|
|
49
|
+
* Excel: `MEDIAN(...)`.
|
|
50
|
+
*
|
|
51
|
+
* @hidden
|
|
52
|
+
* @param {string[]} args - Formula argument tokens from the Calculate engine.
|
|
53
|
+
* @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```ts
|
|
57
|
+
* engine.computeFormula('=MEDIAN(1)');
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
StatisticalAdvancedFormulas.prototype.ComputeMEDIAN = function () {
|
|
61
|
+
var args = [];
|
|
62
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
63
|
+
args[_i] = arguments[_i];
|
|
64
|
+
}
|
|
65
|
+
var value1;
|
|
66
|
+
var num = [];
|
|
67
|
+
if (isNullOrUndefined(args) || args[0] === '' && args.length === 1) {
|
|
68
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
|
|
69
|
+
}
|
|
70
|
+
for (var i = 0; i < args.length; i++) {
|
|
71
|
+
if (this.parent.isCellReference(args[i])) {
|
|
72
|
+
if (args[i].indexOf(':') > -1) {
|
|
73
|
+
var cellCollection = this.parent.getCellCollection(args[i]);
|
|
74
|
+
for (var a = 0; a < cellCollection.length; a++) {
|
|
75
|
+
var cellValue = this.parent.getValueFromArg(cellCollection[a]);
|
|
76
|
+
if (this.parent.getErrorStrings().indexOf(cellValue) > -1) {
|
|
77
|
+
return cellValue;
|
|
78
|
+
}
|
|
79
|
+
else if (cellValue.trim() !== '') {
|
|
80
|
+
num.push(this.parent.parseFloat(cellValue));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
var cellVal = this.parent.getValueFromArg(args[i]);
|
|
86
|
+
if (this.parent.getErrorStrings().indexOf(cellVal) > -1) {
|
|
87
|
+
return cellVal;
|
|
88
|
+
}
|
|
89
|
+
else if (cellVal.trim() !== '') {
|
|
90
|
+
num.push(this.parent.parseFloat(cellVal));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
else if (args[i] === '' || args[i] === this.parent.falseValue && !this.parent.isCellReference(args[i])) {
|
|
95
|
+
num.push(0);
|
|
96
|
+
}
|
|
97
|
+
else if (args[i] === this.parent.trueValue && !this.parent.isCellReference(args[i])) {
|
|
98
|
+
num.push(1);
|
|
99
|
+
}
|
|
100
|
+
else if (args[i].indexOf(this.parent.tic) > -1 && isNaN(parseFloat(args[i].split(this.parent.tic).join('')))) {
|
|
101
|
+
return this.parent.getErrorStrings()[CommonErrors.Value];
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
var cValue = this.parent.getValueFromArg(args[i]).split(this.parent.tic).join('');
|
|
105
|
+
if (this.parent.getErrorStrings().indexOf(cValue) > -1) {
|
|
106
|
+
return cValue;
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
num.push(this.parent.parseFloat(cValue));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
num = num.sort(function (n1, n2) { return n1 - n2; });
|
|
114
|
+
var len = num.length;
|
|
115
|
+
for (var j = 0; j < len; j++) {
|
|
116
|
+
if (isNaN(num[j])) {
|
|
117
|
+
num.splice(j, 1);
|
|
118
|
+
len = num.length;
|
|
119
|
+
j--;
|
|
120
|
+
if (num.length === 0) {
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (num.length % 2 !== 0 && !isNaN(num[parseInt((num.length / 2).toString(), 10)])) {
|
|
126
|
+
value1 = num[parseInt((num.length / 2).toString(), 10)];
|
|
127
|
+
}
|
|
128
|
+
else if (!isNaN(num[num.length / 2]) && !isNaN(num[num.length / 2 - 1])) {
|
|
129
|
+
value1 = (num[num.length / 2] + num[num.length / 2 - 1]) / 2;
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
return this.parent.getErrorStrings()[CommonErrors.Num];
|
|
133
|
+
}
|
|
134
|
+
return value1;
|
|
135
|
+
};
|
|
136
|
+
/**
|
|
137
|
+
* Returns the k-th smallest value in a given array.
|
|
138
|
+
*
|
|
139
|
+
* Excel: `SMALL(...)`.
|
|
140
|
+
*
|
|
141
|
+
* @hidden
|
|
142
|
+
* @param {string[]} args - Formula argument tokens from the Calculate engine.
|
|
143
|
+
* @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
|
|
144
|
+
*/
|
|
145
|
+
StatisticalAdvancedFormulas.prototype.ComputeSMALL = function () {
|
|
146
|
+
var args = [];
|
|
147
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
148
|
+
args[_i] = arguments[_i];
|
|
149
|
+
}
|
|
150
|
+
var value;
|
|
151
|
+
var errCollection = this.parent.getErrorStrings();
|
|
152
|
+
if (isNullOrUndefined(args) || args.length === 1 || args[0] === '') {
|
|
153
|
+
if ((args[0] === '') && (args[1] === '')) {
|
|
154
|
+
return errCollection[CommonErrors.Num];
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
else if (args.length > 2) {
|
|
161
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
|
|
162
|
+
}
|
|
163
|
+
var cellCollection = [];
|
|
164
|
+
var valueCollection = [];
|
|
165
|
+
var numArr = [];
|
|
166
|
+
if (!isNullOrUndefined(args[0])) {
|
|
167
|
+
var originalValue = void 0;
|
|
168
|
+
if (this.parent.isCellReference(args[0])) {
|
|
169
|
+
cellCollection = this.parent.getCellCollection(args[0]);
|
|
170
|
+
for (var i = 0; i < cellCollection.length; i++) {
|
|
171
|
+
originalValue = this.parent.getValueFromArg(cellCollection[i]);
|
|
172
|
+
if (errCollection.indexOf(originalValue) > -1) {
|
|
173
|
+
return originalValue;
|
|
174
|
+
}
|
|
175
|
+
valueCollection.push(originalValue);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
originalValue = this.parent.getValueFromArg(args[0]).split(this.parent.tic).join('');
|
|
180
|
+
if (errCollection.indexOf(originalValue) > -1) {
|
|
181
|
+
return originalValue;
|
|
182
|
+
}
|
|
183
|
+
valueCollection.push(originalValue);
|
|
184
|
+
}
|
|
185
|
+
for (var i = 0; i < valueCollection.length; i++) {
|
|
186
|
+
if (valueCollection[i] !== '' && !isNaN(this.parent.parseFloat(valueCollection[i]))) {
|
|
187
|
+
numArr.push(this.parent.parseFloat(valueCollection[i]));
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (numArr.length === 0) {
|
|
191
|
+
if (isNullOrUndefined(valueCollection[0]) || args[0].indexOf(this.parent.tic) > -1) {
|
|
192
|
+
return errCollection[CommonErrors.Value];
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
numArr = numArr.sort(function (n1, n2) { return n1 - n2; });
|
|
197
|
+
var smallIndex;
|
|
198
|
+
if (!isNullOrUndefined(args[1])) {
|
|
199
|
+
if (this.parent.isCellReference(args[1])) {
|
|
200
|
+
smallIndex = this.parent.getValueFromArg(args[1]);
|
|
201
|
+
if (smallIndex === '') {
|
|
202
|
+
return errCollection[CommonErrors.Num];
|
|
203
|
+
}
|
|
204
|
+
else if (smallIndex.trim() === '') {
|
|
205
|
+
return errCollection[CommonErrors.Value];
|
|
206
|
+
}
|
|
207
|
+
if (smallIndex.toUpperCase() === this.parent.trueValue) {
|
|
208
|
+
smallIndex = '1';
|
|
209
|
+
}
|
|
210
|
+
else if (smallIndex.toUpperCase() === this.parent.falseValue) {
|
|
211
|
+
smallIndex = '0';
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
smallIndex = this.parent.getValueFromArg(args[1]).split(this.parent.tic).join('');
|
|
216
|
+
}
|
|
217
|
+
if (errCollection.indexOf(smallIndex) > -1) {
|
|
218
|
+
return smallIndex;
|
|
219
|
+
}
|
|
220
|
+
else if (smallIndex.trim() === '') {
|
|
221
|
+
return args[1].length > 0 ? errCollection[CommonErrors.Value] : errCollection[CommonErrors.Num];
|
|
222
|
+
}
|
|
223
|
+
else if (isNaN(this.parent.parseFloat(smallIndex))) {
|
|
224
|
+
if (args[1].toUpperCase() === this.parent.trueValue) {
|
|
225
|
+
smallIndex = '1';
|
|
226
|
+
}
|
|
227
|
+
else if (args[1].toUpperCase() === this.parent.falseValue) {
|
|
228
|
+
smallIndex = '0';
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
return errCollection[CommonErrors.Value];
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
var finalIndex = (Number(smallIndex) < 1 ? 0 : Math.floor(Number(smallIndex)));
|
|
236
|
+
if (isNullOrUndefined(numArr[finalIndex - 1]) && !isNaN(Number(finalIndex))) {
|
|
237
|
+
return errCollection[CommonErrors.Num];
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
value = numArr[finalIndex - 1];
|
|
241
|
+
}
|
|
242
|
+
return value;
|
|
243
|
+
};
|
|
244
|
+
/**
|
|
245
|
+
* Returns the k-th largest value in a given array.
|
|
246
|
+
*
|
|
247
|
+
* Excel: `LARGE(...)`.
|
|
248
|
+
*
|
|
249
|
+
* @hidden
|
|
250
|
+
* @param {string[]} args - Formula argument tokens from the Calculate engine.
|
|
251
|
+
* @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
|
|
252
|
+
*/
|
|
253
|
+
StatisticalAdvancedFormulas.prototype.ComputeLARGE = function () {
|
|
254
|
+
var args = [];
|
|
255
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
256
|
+
args[_i] = arguments[_i];
|
|
257
|
+
}
|
|
258
|
+
var value;
|
|
259
|
+
var errCollection = this.parent.getErrorStrings();
|
|
260
|
+
if (isNullOrUndefined(args) || args.length === 1 || args[0] === '') {
|
|
261
|
+
if ((args[0] === '') && (args[1] === '')) {
|
|
262
|
+
return errCollection[CommonErrors.Num];
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
else if (args.length > 2) {
|
|
269
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
|
|
270
|
+
}
|
|
271
|
+
var cellCollection = [];
|
|
272
|
+
var valueCollection = [];
|
|
273
|
+
var numArr = [];
|
|
274
|
+
if (!isNullOrUndefined(args[0])) {
|
|
275
|
+
var originalValue = void 0;
|
|
276
|
+
if (this.parent.isCellReference(args[0])) {
|
|
277
|
+
cellCollection = this.parent.getCellCollection(args[0]);
|
|
278
|
+
for (var i = 0; i < cellCollection.length; i++) {
|
|
279
|
+
originalValue = this.parent.getValueFromArg(cellCollection[i]);
|
|
280
|
+
if (errCollection.indexOf(originalValue) > -1) {
|
|
281
|
+
return originalValue;
|
|
282
|
+
}
|
|
283
|
+
valueCollection.push(originalValue);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
originalValue = this.parent.getValueFromArg(args[0]).split(this.parent.tic).join('');
|
|
288
|
+
if (errCollection.indexOf(originalValue) > -1) {
|
|
289
|
+
return originalValue;
|
|
290
|
+
}
|
|
291
|
+
valueCollection.push(originalValue);
|
|
292
|
+
}
|
|
293
|
+
for (var i = 0; i < valueCollection.length; i++) {
|
|
294
|
+
if (valueCollection[i] !== '' && !isNaN(this.parent.parseFloat(valueCollection[i]))) {
|
|
295
|
+
numArr.push(this.parent.parseFloat(valueCollection[i]));
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
if (numArr.length === 0) {
|
|
299
|
+
if (isNullOrUndefined(valueCollection[0]) || args[0].indexOf(this.parent.tic) > -1) {
|
|
300
|
+
return errCollection[CommonErrors.Value];
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
numArr = numArr.sort(function (n1, n2) { return n2 - n1; });
|
|
305
|
+
var largeIndex;
|
|
306
|
+
if (!isNullOrUndefined(args[1])) {
|
|
307
|
+
if (this.parent.isCellReference(args[1])) {
|
|
308
|
+
largeIndex = this.parent.getValueFromArg(args[1]);
|
|
309
|
+
if (largeIndex === '') {
|
|
310
|
+
return errCollection[CommonErrors.Num];
|
|
311
|
+
}
|
|
312
|
+
else if (largeIndex.trim() === '') {
|
|
313
|
+
return errCollection[CommonErrors.Value];
|
|
314
|
+
}
|
|
315
|
+
if (largeIndex.toUpperCase() === this.parent.trueValue) {
|
|
316
|
+
largeIndex = '1';
|
|
317
|
+
}
|
|
318
|
+
else if (largeIndex.toUpperCase() === this.parent.falseValue) {
|
|
319
|
+
largeIndex = '0';
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
else {
|
|
323
|
+
largeIndex = this.parent.getValueFromArg(args[1]).split(this.parent.tic).join('');
|
|
324
|
+
}
|
|
325
|
+
if (errCollection.indexOf(largeIndex) > -1) {
|
|
326
|
+
return largeIndex;
|
|
327
|
+
}
|
|
328
|
+
else if (largeIndex.trim() === '') {
|
|
329
|
+
return args[1].length > 0 ? errCollection[CommonErrors.Value] : errCollection[CommonErrors.Num];
|
|
330
|
+
}
|
|
331
|
+
else if (isNaN(this.parent.parseFloat(largeIndex))) {
|
|
332
|
+
if (args[1].toUpperCase() === this.parent.trueValue) {
|
|
333
|
+
largeIndex = '1';
|
|
334
|
+
}
|
|
335
|
+
else if (args[1].toUpperCase() === this.parent.falseValue) {
|
|
336
|
+
largeIndex = '0';
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
return errCollection[CommonErrors.Value];
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
var finalIndex = (Number(largeIndex) < 1 ? 0 : Math.ceil(Number(largeIndex)));
|
|
344
|
+
if (isNullOrUndefined(numArr[finalIndex - 1]) && !isNaN(Number(finalIndex))) {
|
|
345
|
+
return errCollection[CommonErrors.Num];
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
value = numArr[finalIndex - 1];
|
|
349
|
+
}
|
|
350
|
+
return value;
|
|
351
|
+
};
|
|
352
|
+
/**
|
|
353
|
+
* Returns the slope of the line from linear regression of the data points.
|
|
354
|
+
*
|
|
355
|
+
* Excel: `SLOPE(...)`.
|
|
356
|
+
*
|
|
357
|
+
* @hidden
|
|
358
|
+
* @param {string[]} args - Formula argument tokens from the Calculate engine.
|
|
359
|
+
* @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
|
|
360
|
+
*/
|
|
361
|
+
StatisticalAdvancedFormulas.prototype.ComputeSLOPE = function () {
|
|
362
|
+
var _this = this;
|
|
363
|
+
var args = [];
|
|
364
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
365
|
+
args[_i] = arguments[_i];
|
|
366
|
+
}
|
|
367
|
+
var errCollection = this.parent.getErrorStrings();
|
|
368
|
+
if (isNullOrUndefined(args) || (args.length === 1 && args[0].trim() === '')) {
|
|
369
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
|
|
370
|
+
}
|
|
371
|
+
else if (args.length !== 2) {
|
|
372
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
|
|
373
|
+
}
|
|
374
|
+
else if (args[0] === '' || args[1] === '') {
|
|
375
|
+
return errCollection[CommonErrors.Value];
|
|
376
|
+
}
|
|
377
|
+
var cellCollection = function (actuaValue) {
|
|
378
|
+
if (actuaValue.indexOf(_this.parent.tic) === -1) {
|
|
379
|
+
actuaValue = _this.parent.getCellCollection(actuaValue.split(_this.parent.tic).join(''));
|
|
380
|
+
}
|
|
381
|
+
else {
|
|
382
|
+
actuaValue = undefined;
|
|
383
|
+
}
|
|
384
|
+
return actuaValue;
|
|
385
|
+
};
|
|
386
|
+
var yPoints = cellCollection(args[0].trim());
|
|
387
|
+
var xPoints = cellCollection(args[1].trim());
|
|
388
|
+
if (isNullOrUndefined(yPoints) || isNullOrUndefined(xPoints) || (yPoints.length < 2 && xPoints.length < 2)) {
|
|
389
|
+
return errCollection[CommonErrors.DivZero];
|
|
390
|
+
}
|
|
391
|
+
else if (yPoints.length !== xPoints.length) {
|
|
392
|
+
return errCollection[CommonErrors.NA];
|
|
393
|
+
}
|
|
394
|
+
var dataCollection = function (actuaValue) {
|
|
395
|
+
actuaValue = _this.getDataCollection(actuaValue);
|
|
396
|
+
for (var b = 0; b < actuaValue.length; b++) {
|
|
397
|
+
if (errCollection.indexOf(actuaValue[b]) > -1) {
|
|
398
|
+
return actuaValue[b].toString();
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
return actuaValue;
|
|
402
|
+
};
|
|
403
|
+
yPoints = dataCollection(yPoints);
|
|
404
|
+
if (errCollection.indexOf(yPoints.toString()) > -1) {
|
|
405
|
+
return yPoints.toString();
|
|
406
|
+
}
|
|
407
|
+
xPoints = dataCollection(xPoints);
|
|
408
|
+
if (errCollection.indexOf(xPoints.toString()) > -1) {
|
|
409
|
+
return xPoints.toString();
|
|
410
|
+
}
|
|
411
|
+
var sumXY = 0;
|
|
412
|
+
var sumX2 = 0;
|
|
413
|
+
var sumX = 0;
|
|
414
|
+
var sumY = 0;
|
|
415
|
+
var length = 0;
|
|
416
|
+
for (var i = 0, len = xPoints.length; i < len; ++i) {
|
|
417
|
+
if ((xPoints[i] !== '' && Number(xPoints[i]).toString() !== 'NaN') &&
|
|
418
|
+
(yPoints[i] !== '' && Number(yPoints[i]).toString() !== 'NaN')) {
|
|
419
|
+
sumXY += Number(xPoints[i]) * Number(yPoints[i]);
|
|
420
|
+
sumX += Number(xPoints[i]);
|
|
421
|
+
sumY += Number(yPoints[i]);
|
|
422
|
+
sumX2 += Number(xPoints[i]) * Number(xPoints[i]);
|
|
423
|
+
length++;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
var value = ((sumXY - (sumX * sumY) / length) / (sumX2 - (sumX * sumX) / length)).toString();
|
|
427
|
+
if (value === 'NaN') {
|
|
428
|
+
return errCollection[CommonErrors.DivZero];
|
|
429
|
+
}
|
|
430
|
+
return value;
|
|
431
|
+
};
|
|
432
|
+
/**
|
|
433
|
+
* Calculates the point of the Y-intercept line via linear regression.
|
|
434
|
+
*
|
|
435
|
+
* Excel: `INTERCEPT(...)`.
|
|
436
|
+
*
|
|
437
|
+
* @hidden
|
|
438
|
+
* @param {string[]} args - Formula argument tokens from the Calculate engine.
|
|
439
|
+
* @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
|
|
440
|
+
*/
|
|
441
|
+
StatisticalAdvancedFormulas.prototype.ComputeINTERCEPT = function () {
|
|
442
|
+
var _this = this;
|
|
443
|
+
var args = [];
|
|
444
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
445
|
+
args[_i] = arguments[_i];
|
|
446
|
+
}
|
|
447
|
+
var errCollection = this.parent.getErrorStrings();
|
|
448
|
+
if (isNullOrUndefined(args) || (args.length === 1 && args[0].trim() === '')) {
|
|
449
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.InvalidArguments];
|
|
450
|
+
}
|
|
451
|
+
else if (args.length !== 2) {
|
|
452
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
|
|
453
|
+
}
|
|
454
|
+
else if (args[0] === '' || args[1] === '') {
|
|
455
|
+
return errCollection[CommonErrors.Value];
|
|
456
|
+
}
|
|
457
|
+
var cellCollection = function (actuaValue) {
|
|
458
|
+
if (actuaValue.indexOf(_this.parent.tic) === -1) {
|
|
459
|
+
actuaValue = _this.parent.getCellCollection(actuaValue.split(_this.parent.tic).join(''));
|
|
460
|
+
}
|
|
461
|
+
else {
|
|
462
|
+
actuaValue = undefined;
|
|
463
|
+
}
|
|
464
|
+
return actuaValue;
|
|
465
|
+
};
|
|
466
|
+
var yValues = cellCollection(args[0].trim());
|
|
467
|
+
var xValues = cellCollection(args[1].trim());
|
|
468
|
+
if (isNullOrUndefined(yValues) || isNullOrUndefined(xValues) || (yValues.length < 2 && xValues.length < 2)) {
|
|
469
|
+
return errCollection[CommonErrors.DivZero];
|
|
470
|
+
}
|
|
471
|
+
else if (yValues.length !== xValues.length) {
|
|
472
|
+
return errCollection[CommonErrors.NA];
|
|
473
|
+
}
|
|
474
|
+
var dataCollection = function (actuaValue) {
|
|
475
|
+
actuaValue = _this.getDataCollection(actuaValue);
|
|
476
|
+
for (var b = 0; b < actuaValue.length; b++) {
|
|
477
|
+
if (errCollection.indexOf(actuaValue[b]) > -1) {
|
|
478
|
+
return actuaValue[b];
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
return actuaValue;
|
|
482
|
+
};
|
|
483
|
+
yValues = dataCollection(yValues);
|
|
484
|
+
if (errCollection.indexOf(yValues.toString()) > -1) {
|
|
485
|
+
return yValues.toString();
|
|
486
|
+
}
|
|
487
|
+
xValues = dataCollection(xValues);
|
|
488
|
+
if (errCollection.indexOf(xValues.toString()) > -1) {
|
|
489
|
+
return xValues.toString();
|
|
490
|
+
}
|
|
491
|
+
var sumY = 0;
|
|
492
|
+
var sumX = 0;
|
|
493
|
+
var length = 0;
|
|
494
|
+
var sumXY = 0;
|
|
495
|
+
var sumX2 = 0;
|
|
496
|
+
var diff;
|
|
497
|
+
var calculation = function (isSum) {
|
|
498
|
+
for (var i = 0, len = xValues.length; i < len; ++i) {
|
|
499
|
+
if ((yValues[i] !== '' && Number(yValues[i]).toString() !== 'NaN') &&
|
|
500
|
+
(xValues[i] !== '' && Number(xValues[i]).toString() !== 'NaN')) {
|
|
501
|
+
if (isSum) {
|
|
502
|
+
sumY += Number(yValues[i]);
|
|
503
|
+
sumX += Number(xValues[i]);
|
|
504
|
+
length++;
|
|
505
|
+
}
|
|
506
|
+
else {
|
|
507
|
+
diff = Number(xValues[i]) - sumX;
|
|
508
|
+
sumXY += diff * (Number(yValues[i]) - sumY);
|
|
509
|
+
sumX2 += diff * diff;
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
};
|
|
514
|
+
calculation(true);
|
|
515
|
+
sumY = sumY / length;
|
|
516
|
+
sumX = sumX / length;
|
|
517
|
+
calculation(false);
|
|
518
|
+
var value = (sumY - sumXY / sumX2 * sumX).toString();
|
|
519
|
+
if (value === 'NaN') {
|
|
520
|
+
return errCollection[CommonErrors.DivZero];
|
|
521
|
+
}
|
|
522
|
+
return value;
|
|
523
|
+
};
|
|
524
|
+
/**
|
|
525
|
+
* Returns the geometric mean of an array or range of positive data.
|
|
526
|
+
*
|
|
527
|
+
* Excel: `GEOMEAN(...)`.
|
|
528
|
+
*
|
|
529
|
+
* @hidden
|
|
530
|
+
* @param {string[]} args - Formula argument tokens from the Calculate engine.
|
|
531
|
+
* @returns {boolean} - Boolean result, nested-formula numeric string (`"0"`/`"1"`), or an Excel error token.
|
|
532
|
+
*/
|
|
533
|
+
StatisticalAdvancedFormulas.prototype.ComputeGEOMEAN = function () {
|
|
534
|
+
var args = [];
|
|
535
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
536
|
+
args[_i] = arguments[_i];
|
|
537
|
+
}
|
|
538
|
+
var argArr = args;
|
|
539
|
+
var sum = 1;
|
|
540
|
+
var count = 0;
|
|
541
|
+
var cellVal = 0;
|
|
542
|
+
var cellStr = 0;
|
|
543
|
+
var dev;
|
|
544
|
+
var r;
|
|
545
|
+
var s;
|
|
546
|
+
var cell;
|
|
547
|
+
if (args.length === 0) {
|
|
548
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
|
|
549
|
+
}
|
|
550
|
+
if (argArr.length === 1 && argArr[0] === '') {
|
|
551
|
+
return sum.toString();
|
|
552
|
+
}
|
|
553
|
+
var isBoolean;
|
|
554
|
+
for (r = 0; r < argArr.length; r++) {
|
|
555
|
+
if (argArr[r].indexOf(':') > -1) {
|
|
556
|
+
if (argArr[0] === this.parent.tic) {
|
|
557
|
+
return this.parent.getErrorStrings()[CommonErrors.Value];
|
|
558
|
+
}
|
|
559
|
+
cell = this.parent.getCellCollection(argArr[r].split(this.parent.tic).join(''));
|
|
560
|
+
for (s = 0; s < cell.length; s++) {
|
|
561
|
+
cellVal = this.parent.getValueFromArg(cell[s]);
|
|
562
|
+
cellStr = cellVal.split(this.parent.tic).join('');
|
|
563
|
+
isBoolean = cellStr === this.parent.trueValue || cellStr === this.parent.falseValue;
|
|
564
|
+
dev = this.parent.parseFloat(cellVal);
|
|
565
|
+
if (dev <= 0) {
|
|
566
|
+
return this.parent.getErrorStrings()[CommonErrors.Num];
|
|
567
|
+
}
|
|
568
|
+
if (isBoolean || this.parent.getErrorStrings().indexOf(cellVal) > -1) {
|
|
569
|
+
continue;
|
|
570
|
+
}
|
|
571
|
+
else if (!isNaN(dev)) {
|
|
572
|
+
count++;
|
|
573
|
+
sum = sum * dev;
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
else {
|
|
578
|
+
cellVal = this.parent.getValueFromArg(argArr[r]);
|
|
579
|
+
if (this.parent.getErrorStrings().indexOf(cellVal) > -1) {
|
|
580
|
+
return cellVal;
|
|
581
|
+
}
|
|
582
|
+
var cellStr_1 = cellVal.split(this.parent.tic).join('');
|
|
583
|
+
if (cellVal.indexOf('"') > -1 && isNaN(this.parent.parseFloat(cellStr_1))) {
|
|
584
|
+
return this.parent.getErrorStrings()[CommonErrors.Value];
|
|
585
|
+
}
|
|
586
|
+
argArr[r] = argArr[r].startsWith('n') ? argArr[r].slice(1) : argArr[r];
|
|
587
|
+
if ((cellVal === '' && argArr[r] === '')) {
|
|
588
|
+
return this.parent.getErrorStrings()[CommonErrors.Num];
|
|
589
|
+
}
|
|
590
|
+
if ((cellStr_1 === 'TRUE' || cellStr_1 === 'FALSE') && this.parent.isCellReference(argArr[r])) {
|
|
591
|
+
continue;
|
|
592
|
+
}
|
|
593
|
+
if (cellVal.length > 0) {
|
|
594
|
+
cellVal = cellVal.indexOf('"') > -1 ? cellStr_1 : cellVal;
|
|
595
|
+
cellVal = (cellVal.split(this.parent.tic).join('') === 'TRUE') ? '1' :
|
|
596
|
+
(cellVal.split(this.parent.tic).join('') === 'FALSE') ? '0' : cellVal;
|
|
597
|
+
if (!this.parent.isCellReference(argArr[r])) {
|
|
598
|
+
if (isNaN(this.parent.parseFloat(cellVal))) {
|
|
599
|
+
return this.parent.getErrorStrings()[CommonErrors.Value];
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
dev = this.parent.parseFloat(cellVal);
|
|
603
|
+
if (dev <= 0) {
|
|
604
|
+
return this.parent.getErrorStrings()[CommonErrors.Num];
|
|
605
|
+
}
|
|
606
|
+
else if (!isNaN(dev)) {
|
|
607
|
+
count++;
|
|
608
|
+
sum = sum * dev;
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
if (count > 0) {
|
|
614
|
+
sum = Math.pow(sum, 1 / count);
|
|
615
|
+
}
|
|
616
|
+
return sum.toString();
|
|
617
|
+
};
|
|
618
|
+
/**
|
|
619
|
+
* Returns the square of the Pearson product moment correlation coefficient based on data points in known_ys and known_xs.
|
|
620
|
+
*
|
|
621
|
+
* Excel: `RSQ(...)`.
|
|
622
|
+
*
|
|
623
|
+
* @hidden
|
|
624
|
+
* @param {string[]} args - Formula argument tokens from the Calculate engine.
|
|
625
|
+
* @returns {string | number} - Computed Excel-compatible numeric or text result, or an error token such as `#VALUE!`, `#NUM!`, `#N/A`.
|
|
626
|
+
*/
|
|
627
|
+
StatisticalAdvancedFormulas.prototype.ComputeRSQ = function () {
|
|
628
|
+
var args = [];
|
|
629
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
630
|
+
args[_i] = arguments[_i];
|
|
631
|
+
}
|
|
632
|
+
var validCount = 0;
|
|
633
|
+
var argArr = args;
|
|
634
|
+
if (argArr.length !== 2) {
|
|
635
|
+
return this.parent.formulaErrorStrings[FormulasErrorsStrings.WrongNumberArguments];
|
|
636
|
+
}
|
|
637
|
+
if (argArr[0] === '' || argArr[1] === '') {
|
|
638
|
+
return this.parent.getErrorStrings()[CommonErrors.Value];
|
|
639
|
+
}
|
|
640
|
+
if (argArr[0].includes('"') || argArr[1].includes('"')) {
|
|
641
|
+
return this.parent.getErrorStrings()[CommonErrors.NA];
|
|
642
|
+
}
|
|
643
|
+
if ((argArr[0].indexOf(':') === -1 && isCellReference(argArr[0])) && (argArr[1].indexOf(':') === -1 && isCellReference(argArr[1]))) {
|
|
644
|
+
return this.parent.getErrorStrings()[CommonErrors.DivZero];
|
|
645
|
+
}
|
|
646
|
+
var yValuesRange = this.parent.getCellCollection(argArr[0]);
|
|
647
|
+
var xValuesRange = this.parent.getCellCollection(argArr[1]);
|
|
648
|
+
if ((yValuesRange.length !== xValuesRange.length)) {
|
|
649
|
+
return this.parent.getErrorStrings()[CommonErrors.NA];
|
|
650
|
+
}
|
|
651
|
+
var xValues = this.getDataCollection(xValuesRange);
|
|
652
|
+
for (var a = 0; a < xValues.length; a++) {
|
|
653
|
+
if (this.parent.getErrorStrings().indexOf(xValues[a]) > -1) {
|
|
654
|
+
return xValues[a];
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
var yValues = this.getDataCollection(yValuesRange);
|
|
658
|
+
for (var b = 0; b < yValues.length; b++) {
|
|
659
|
+
if (this.parent.getErrorStrings().indexOf(yValues[b]) > -1) {
|
|
660
|
+
return yValues[b];
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
var xValue;
|
|
664
|
+
var yValue;
|
|
665
|
+
for (var i = 0; i < xValues.length; i++) {
|
|
666
|
+
xValue = Number(xValues[i]);
|
|
667
|
+
yValue = Number(yValues[i]);
|
|
668
|
+
if (isNumber(xValue) && isNumber(yValue)) {
|
|
669
|
+
validCount++;
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
if (validCount <= 1) {
|
|
673
|
+
return this.parent.getErrorStrings()[CommonErrors.DivZero];
|
|
674
|
+
}
|
|
675
|
+
if (validCount === 2) {
|
|
676
|
+
return 1;
|
|
677
|
+
}
|
|
678
|
+
var meanArray = this.getMeanArray(xValues, yValues);
|
|
679
|
+
var meanX = meanArray[0];
|
|
680
|
+
var meanY = meanArray[1];
|
|
681
|
+
var correlation = this.getCorrelation(xValues, yValues, meanX, meanY);
|
|
682
|
+
return Math.pow(correlation, 2);
|
|
683
|
+
};
|
|
684
|
+
/**
|
|
685
|
+
* @hidden
|
|
686
|
+
* @param {string[]} xValues - specify the x values
|
|
687
|
+
* @param {string[]} yValues - specify the y values
|
|
688
|
+
* @param {number} meanX - specify the mean of x values
|
|
689
|
+
* @param {number} meanY - specify the mean of y values
|
|
690
|
+
* @returns {number} - Returns correlation value
|
|
691
|
+
*/
|
|
692
|
+
/**
|
|
693
|
+
* @hidden
|
|
694
|
+
* @param {string[]} xValues - specify the x values
|
|
695
|
+
* @param {string[]} yValues - specify the y values
|
|
696
|
+
* @param {number} meanX - specify the mean of x values
|
|
697
|
+
* @param {number} meanY - specify the mean of y values
|
|
698
|
+
* @returns {number} - Returns correlation value
|
|
699
|
+
*/
|
|
700
|
+
StatisticalAdvancedFormulas.prototype.getCorrelation = function (xValues, yValues, meanX, meanY) {
|
|
701
|
+
var numerator = 0;
|
|
702
|
+
var denominatorX = 0;
|
|
703
|
+
var denominatorY = 0;
|
|
704
|
+
var diffY;
|
|
705
|
+
var diffX;
|
|
706
|
+
for (var i = 0; i < xValues.length; i++) {
|
|
707
|
+
if (isNumber(xValues[i]) && isNumber(yValues[i])) {
|
|
708
|
+
diffX = Number(xValues[i]) - meanX;
|
|
709
|
+
diffY = Number(yValues[i]) - meanY;
|
|
710
|
+
numerator += diffX * diffY;
|
|
711
|
+
denominatorX += Math.pow(diffX, 2);
|
|
712
|
+
denominatorY += Math.pow(diffY, 2);
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
var correlation = numerator / Math.sqrt(denominatorX * denominatorY);
|
|
716
|
+
return correlation;
|
|
717
|
+
};
|
|
718
|
+
/**
|
|
719
|
+
* @hidden
|
|
720
|
+
* @param {string[]} xValues - specify the x values
|
|
721
|
+
* @param {string[]} yValues - specify the y values
|
|
722
|
+
* @returns {number[]} meanX - returns array of mean values of x and y values
|
|
723
|
+
*/
|
|
724
|
+
/**
|
|
725
|
+
* @hidden
|
|
726
|
+
* @param {string[]} xValues - specify the x values
|
|
727
|
+
* @param {string[]} yValues - specify the y values
|
|
728
|
+
* @returns {number[]} meanX - returns array of mean values of x and y values
|
|
729
|
+
*/
|
|
730
|
+
StatisticalAdvancedFormulas.prototype.getMeanArray = function (xValues, yValues) {
|
|
731
|
+
var count = 0;
|
|
732
|
+
var sumX = 0;
|
|
733
|
+
var sumY = 0;
|
|
734
|
+
var meanX = 0;
|
|
735
|
+
var meanY = 0;
|
|
736
|
+
for (var i = 0; i < xValues.length; i++) {
|
|
737
|
+
if (isNumber(xValues[i]) && isNumber(yValues[i])) {
|
|
738
|
+
sumX += Number(xValues[i]);
|
|
739
|
+
sumY += Number(yValues[i]);
|
|
740
|
+
count++;
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
meanX = sumX / count;
|
|
744
|
+
meanY = sumY / count;
|
|
745
|
+
return [meanX, meanY];
|
|
746
|
+
};
|
|
747
|
+
StatisticalAdvancedFormulas.prototype.getDataCollection = function (cells) {
|
|
748
|
+
var cellsData = [];
|
|
749
|
+
for (var i = 0, len = cells.length; i < len; i++) {
|
|
750
|
+
cellsData.push(this.parent.getValueFromArg(cells[i]));
|
|
751
|
+
}
|
|
752
|
+
return cellsData;
|
|
753
|
+
};
|
|
754
|
+
return StatisticalAdvancedFormulas;
|
|
755
|
+
}(FormulaModuleBase));
|
|
756
|
+
export { StatisticalAdvancedFormulas };
|