ecStat.js 56 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460
  1. (function webpackUniversalModuleDefinition(root, factory) {
  2. if (typeof exports === 'object' && typeof module === 'object')
  3. module.exports = factory();
  4. else if (typeof define === 'function' && define.amd)
  5. define([], factory);
  6. else if (typeof exports === 'object')
  7. exports["ecStat"] = factory();
  8. else
  9. root["ecStat"] = factory();
  10. })(this, function () {
  11. return /******/ (function (modules) { // webpackBootstrap
  12. /******/ // The module cache
  13. /******/
  14. var installedModules = {};
  15. /******/ // The require function
  16. /******/
  17. function __webpack_require__(moduleId) {
  18. /******/ // Check if module is in cache
  19. /******/
  20. if (installedModules[moduleId])
  21. /******/
  22. return installedModules[moduleId].exports;
  23. /******/ // Create a new module (and put it into the cache)
  24. /******/
  25. var module = installedModules[moduleId] = {
  26. /******/
  27. exports: {},
  28. /******/
  29. id: moduleId,
  30. /******/
  31. loaded: false
  32. /******/
  33. };
  34. /******/ // Execute the module function
  35. /******/
  36. modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
  37. /******/ // Flag the module as loaded
  38. /******/
  39. module.loaded = true;
  40. /******/ // Return the exports of the module
  41. /******/
  42. return module.exports;
  43. /******/
  44. }
  45. /******/ // expose the modules object (__webpack_modules__)
  46. /******/
  47. __webpack_require__.m = modules;
  48. /******/ // expose the module cache
  49. /******/
  50. __webpack_require__.c = installedModules;
  51. /******/ // __webpack_public_path__
  52. /******/
  53. __webpack_require__.p = "";
  54. /******/ // Load entry module and return exports
  55. /******/
  56. return __webpack_require__(0);
  57. /******/
  58. })
  59. /************************************************************************/
  60. /******/
  61. ([
  62. /* 0 */
  63. /***/
  64. (function (module, exports, __webpack_require__) {
  65. var __WEBPACK_AMD_DEFINE_RESULT__;
  66. !(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {
  67. return {
  68. clustering: __webpack_require__(1),
  69. regression: __webpack_require__(5),
  70. statistics: __webpack_require__(6),
  71. histogram: __webpack_require__(15)
  72. };
  73. }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
  74. /***/
  75. }),
  76. /* 1 */
  77. /***/
  78. (function (module, exports, __webpack_require__) {
  79. var __WEBPACK_AMD_DEFINE_RESULT__;
  80. !(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {
  81. var dataProcess = __webpack_require__(2);
  82. var dataPreprocess = dataProcess.dataPreprocess;
  83. var array = __webpack_require__(3);
  84. var arraySize = array.size;
  85. var sumOfColumn = array.sumOfColumn;
  86. var arraySum = array.sum;
  87. var zeros = array.zeros;
  88. var isArray = array.isArray;
  89. var mathSqrt = Math.sqrt;
  90. var mathPow = Math.pow;
  91. /**
  92. * KMeans of clustering algorithm
  93. * @param {Array.<Array.<number>>} data two-dimension array
  94. * @param {number} k the number of clusters in a dataset
  95. * @return {Object}
  96. */
  97. function kMeans(data, k) {
  98. var size = arraySize(data);
  99. // create array to assign data points to centroids, also holds SE of each point
  100. var clusterAssigned = zeros(size[0], 2);
  101. var centroids = createRandCent(data, k);
  102. var clusterChanged = true;
  103. var minDist;
  104. var minIndex;
  105. var distIJ;
  106. var ptsInClust;
  107. while (clusterChanged) {
  108. clusterChanged = false;
  109. for (var i = 0; i < size[0]; i++) {
  110. minDist = Infinity;
  111. minIndex = -1;
  112. for (var j = 0; j < k; j++) {
  113. distIJ = distEuclid(data[i], centroids[j]);
  114. if (distIJ < minDist) {
  115. minDist = distIJ;
  116. minIndex = j;
  117. }
  118. }
  119. if (clusterAssigned[i][0] !== minIndex) {
  120. clusterChanged = true;
  121. }
  122. clusterAssigned[i][0] = minIndex;
  123. clusterAssigned[i][1] = mathPow(minDist, 2);
  124. }
  125. //recalculate centroids
  126. for (var i = 0; i < k; i++) {
  127. ptsInClust = [];
  128. for (var j = 0; j < clusterAssigned.length; j++) {
  129. if (clusterAssigned[j][0] === i) {
  130. ptsInClust.push(data[j]);
  131. }
  132. }
  133. centroids[i] = meanInColumns(ptsInClust);
  134. }
  135. }
  136. var clusterWithKmeans = {
  137. centroids: centroids,
  138. clusterAssigned: clusterAssigned
  139. };
  140. return clusterWithKmeans;
  141. }
  142. /**
  143. * Calculate the average of each column in a two-dimensional array
  144. * and returns the values as an array.
  145. * @param {Array.<Array>} dataList two-dimensional array
  146. * @return {Array}
  147. */
  148. function meanInColumns(dataList) {
  149. var size = arraySize(dataList);
  150. var meanArray = [];
  151. var sum;
  152. var mean;
  153. for (var j = 0; j < size[1]; j++) {
  154. sum = 0;
  155. for (var i = 0; i < size[0]; i++) {
  156. sum += dataList[i][j];
  157. }
  158. mean = sum / size[0];
  159. meanArray.push(mean);
  160. }
  161. return meanArray;
  162. }
  163. /**
  164. * The combine of hierarchical clustering and k-means.
  165. * @param {Array} data two-dimension array.
  166. * @param {[type]} k the number of clusters in a dataset. It has to be greater than 1.
  167. * @param {boolean} stepByStep
  168. * @return {}
  169. */
  170. function hierarchicalKMeans(data, k, stepByStep) {
  171. if (k < 2) {
  172. return;
  173. }
  174. var dataSet = dataPreprocess(data);
  175. var size = arraySize(dataSet);
  176. var clusterAssment = zeros(size[0], 2);
  177. // initial center point
  178. var centroid0 = meanInColumns(dataSet);
  179. var centList = [centroid0];
  180. var squareError;
  181. for (var i = 0; i < size[0]; i++) {
  182. squareError = distEuclid(dataSet[i], centroid0);
  183. clusterAssment[i][1] = mathPow(squareError, 2);
  184. }
  185. var lowestSSE;
  186. var ptsInClust;
  187. var ptsNotClust;
  188. var clusterInfo;
  189. var sseSplit;
  190. var sseNotSplit;
  191. var index = 1;
  192. var result = {
  193. isEnd: false
  194. };
  195. function oneStep() {
  196. //the existing clusters are continuously divided
  197. //until the number of clusters is k
  198. if (index < k) {
  199. lowestSSE = Infinity;
  200. var centSplit;
  201. var newCentroid;
  202. var newClusterAss;
  203. for (var j = 0; j < centList.length; j++) {
  204. ptsInClust = [];
  205. ptsNotClust = [];
  206. for (var i = 0; i < clusterAssment.length; i++) {
  207. if (clusterAssment[i][0] === j) {
  208. ptsInClust.push(dataSet[i]);
  209. } else {
  210. ptsNotClust.push(clusterAssment[i][1]);
  211. }
  212. }
  213. clusterInfo = kMeans(ptsInClust, 2);
  214. sseSplit = sumOfColumn(clusterInfo.clusterAssigned, 1);
  215. sseNotSplit = arraySum(ptsNotClust);
  216. if (sseSplit + sseNotSplit < lowestSSE) {
  217. lowestSSE = sseNotSplit + sseSplit;
  218. centSplit = j;
  219. newCentroid = clusterInfo.centroids;
  220. newClusterAss = clusterInfo.clusterAssigned;
  221. }
  222. }
  223. for (var i = 0; i < newClusterAss.length; i++) {
  224. if (newClusterAss[i][0] === 0) {
  225. newClusterAss[i][0] = centSplit;
  226. } else if (newClusterAss[i][0] === 1) {
  227. newClusterAss[i][0] = centList.length;
  228. }
  229. }
  230. centList[centSplit] = newCentroid[0];
  231. centList.push(newCentroid[1]);
  232. for (i = 0, j = 0; i < clusterAssment.length && j < newClusterAss.length; i++) {
  233. if (clusterAssment[i][0] === centSplit) {
  234. clusterAssment[i][0] = newClusterAss[j][0];
  235. clusterAssment[i][1] = newClusterAss[j++][1];
  236. }
  237. }
  238. var pointInClust = [];
  239. for (var i = 0; i < centList.length; i++) {
  240. pointInClust[i] = [];
  241. for (var j = 0; j < clusterAssment.length; j++) {
  242. if (clusterAssment[j][0] === i) {
  243. pointInClust[i].push(dataSet[j]);
  244. }
  245. }
  246. }
  247. result.clusterAssment = clusterAssment;
  248. result.centroids = centList;
  249. result.pointsInCluster = pointInClust;
  250. index++;
  251. } else {
  252. result.isEnd = true;
  253. }
  254. return result;
  255. }
  256. var step = {
  257. next: oneStep
  258. };
  259. if (!stepByStep) {
  260. var result;
  261. while (!(result = step.next()).isEnd);
  262. return result;
  263. } else {
  264. return step;
  265. }
  266. }
  267. /**
  268. * Create random centroid of kmeans.
  269. * @param {Array.<number>} dataSet two-dimension array
  270. * @param {number} k the number of centroids to be created
  271. * @return {Array.<number>} random centroids of kmeans
  272. */
  273. function createRandCent(dataSet, k) {
  274. var size = arraySize(dataSet);
  275. //constructs a two-dimensional array with all values 0
  276. var centroids = zeros(k, size[1]);
  277. var minJ;
  278. var maxJ;
  279. var rangeJ;
  280. //create random cluster centers, within bounds of each dimension
  281. for (var j = 0; j < size[1]; j++) {
  282. minJ = dataSet[0][j];
  283. maxJ = dataSet[0][j];
  284. for (var i = 1; i < size[0]; i++) {
  285. if (dataSet[i][j] < minJ) {
  286. minJ = dataSet[i][j];
  287. }
  288. if (dataSet[i][j] > maxJ) {
  289. maxJ = dataSet[i][j];
  290. }
  291. }
  292. rangeJ = maxJ - minJ;
  293. for (var i = 0; i < k; i++) {
  294. centroids[i][j] = minJ + rangeJ * Math.random();
  295. }
  296. }
  297. return centroids;
  298. }
  299. /**
  300. * Distance method for calculating similarity
  301. * @param {Array.<number>} vec1
  302. * @param {Array.<nnumber>} vec2
  303. * @return {number}
  304. */
  305. function distEuclid(vec1, vec2) {
  306. if (!isArray(vec1) && !isArray(vec2)) {
  307. return mathSqrt(mathPow(vec1 - vec2, 2));
  308. }
  309. var powerSum = 0;
  310. //subtract the corresponding elements in the vectors
  311. for (var i = 0; i < vec1.length; i++) {
  312. powerSum += mathPow(vec1[i] - vec2[i], 2);
  313. }
  314. return mathSqrt(powerSum);
  315. }
  316. return {
  317. kMeans: kMeans,
  318. hierarchicalKMeans: hierarchicalKMeans
  319. };
  320. }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
  321. /***/
  322. }),
  323. /* 2 */
  324. /***/
  325. (function (module, exports, __webpack_require__) {
  326. var __WEBPACK_AMD_DEFINE_RESULT__;
  327. !(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {
  328. var array = __webpack_require__(3);
  329. var isArray = array.isArray;
  330. var size = array.size;
  331. var number = __webpack_require__(4);
  332. var isNumber = number.isNumber;
  333. /**
  334. * Data preprocessing, filter the wrong data object.
  335. * for example [12,] --- missing y value
  336. * [,12] --- missing x value
  337. * [12, b] --- incorrect y value
  338. * ['a', 12] --- incorrect x value
  339. * @param {Array.<Array>} data
  340. * @return {Array.<Array.<number>>}
  341. */
  342. function dataPreprocess(data) {
  343. if (!isArray(data)) {
  344. throw new Error('Invalid data type, you should input an array');
  345. }
  346. var predata = [];
  347. var arraySize = size(data);
  348. if (arraySize.length === 1) {
  349. for (var i = 0; i < arraySize[0]; i++) {
  350. if (isNumber(data[i])) {
  351. predata.push(data[i]);
  352. }
  353. }
  354. } else if (arraySize.length === 2) {
  355. for (var i = 0; i < arraySize[0]; i++) {
  356. var isCorrect = true;
  357. for (var j = 0; j < arraySize[1]; j++) {
  358. if (!isNumber(data[i][j])) {
  359. isCorrect = false;
  360. }
  361. }
  362. if (isCorrect) {
  363. predata.push(data[i]);
  364. }
  365. }
  366. }
  367. return predata;
  368. }
  369. /**
  370. * @param {string|number} val
  371. * @return {number}
  372. */
  373. function getPrecision(val) {
  374. var str = val.toString();
  375. // scientific notation is not considered
  376. var dotIndex = str.indexOf('.');
  377. return dotIndex < 0 ? 0 : str.length - 1 - dotIndex;
  378. }
  379. return {
  380. dataPreprocess: dataPreprocess,
  381. getPrecision: getPrecision
  382. };
  383. }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
  384. /***/
  385. }),
  386. /* 3 */
  387. /***/
  388. (function (module, exports, __webpack_require__) {
  389. var __WEBPACK_AMD_DEFINE_RESULT__;
  390. !(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {
  391. var objToString = Object.prototype.toString;
  392. var arrayProto = Array.prototype;
  393. var nativeMap = arrayProto.map;
  394. /**
  395. * Get the size of a array
  396. * @param {Array} data
  397. * @return {Array}
  398. */
  399. function size(data) {
  400. var s = [];
  401. while (isArray(data)) {
  402. s.push(data.length);
  403. data = data[0];
  404. }
  405. return s;
  406. }
  407. /**
  408. * @param {*} value
  409. * @return {boolean}
  410. */
  411. function isArray(value) {
  412. return objToString.call(value) === '[object Array]';
  413. }
  414. /**
  415. * constructs a (m x n) array with all values 0
  416. * @param {number} m the row
  417. * @param {number} n the column
  418. * @return {Array}
  419. */
  420. function zeros(m, n) {
  421. var zeroArray = [];
  422. for (var i = 0; i < m; i++) {
  423. zeroArray[i] = [];
  424. for (var j = 0; j < n; j++) {
  425. zeroArray[i][j] = 0;
  426. }
  427. }
  428. return zeroArray;
  429. }
  430. /**
  431. * Sums each element in the array.
  432. * Internal use, for performance considerations, to avoid
  433. * unnecessary judgments and calculations.
  434. * @param {Array} vector
  435. * @return {number}
  436. */
  437. function sum(vector) {
  438. var sum = 0;
  439. for (var i = 0; i < vector.length; i++) {
  440. sum += vector[i];
  441. }
  442. return sum;
  443. }
  444. /**
  445. * Computes the sum of the specified column elements in a two-dimensional array
  446. * @param {Array.<Array>} dataList two-dimensional array
  447. * @param {number} n the specified column, zero-based
  448. * @return {number}
  449. */
  450. function sumOfColumn(dataList, n) {
  451. var sum = 0;
  452. for (var i = 0; i < dataList.length; i++) {
  453. sum += dataList[i][n];
  454. }
  455. return sum;
  456. }
  457. function ascending(a, b) {
  458. return a > b ? 1 : a < b ? -1 : a === b ? 0 : NaN;
  459. }
  460. /**
  461. * Binary search algorithm --- this bisector is specidfied to histogram, which every bin like that [a, b),
  462. * so the return value use to add 1.
  463. * @param {Array.<number>} array
  464. * @param {number} value
  465. * @param {number} start
  466. * @param {number} end
  467. * @return {number}
  468. */
  469. function bisect(array, value, start, end) { //移出去
  470. if (start == null) {
  471. start = 0;
  472. }
  473. if (end == null) {
  474. end = array.length;
  475. }
  476. while (start < end) {
  477. var mid = Math.floor((start + end) / 2);
  478. var compare = ascending(array[mid], value);
  479. if (compare > 0) {
  480. end = mid;
  481. } else if (compare < 0) {
  482. start = mid + 1;
  483. } else {
  484. return mid + 1;
  485. }
  486. }
  487. return start;
  488. }
  489. /**
  490. * 数组映射
  491. * @memberOf module:zrender/core/util
  492. * @param {Array} obj
  493. * @param {Function} cb
  494. * @param {*} [context]
  495. * @return {Array}
  496. */
  497. function map(obj, cb, context) {
  498. if (!(obj && cb)) {
  499. return;
  500. }
  501. if (obj.map && obj.map === nativeMap) {
  502. return obj.map(cb, context);
  503. } else {
  504. var result = [];
  505. for (var i = 0, len = obj.length; i < len; i++) {
  506. result.push(cb.call(context, obj[i], i, obj));
  507. }
  508. return result;
  509. }
  510. }
  511. return {
  512. size: size,
  513. isArray: isArray,
  514. zeros: zeros,
  515. sum: sum,
  516. sumOfColumn: sumOfColumn,
  517. ascending: ascending,
  518. bisect: bisect,
  519. map: map
  520. };
  521. }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
  522. /***/
  523. }),
  524. /* 4 */
  525. /***/
  526. (function (module, exports, __webpack_require__) {
  527. var __WEBPACK_AMD_DEFINE_RESULT__;
  528. !(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {
  529. /**
  530. * Test whether value is a number.
  531. * @param {*} value
  532. * @return {boolean}
  533. */
  534. function isNumber(value) {
  535. value = value === null ? NaN : +value;
  536. return typeof value === 'number' && !isNaN(value);
  537. }
  538. /**
  539. * Test if a number is integer.
  540. * @param {number} value
  541. * @return {boolean}
  542. */
  543. function isInteger(value) {
  544. return isFinite(value) && value === Math.round(value);
  545. }
  546. return {
  547. isNumber: isNumber,
  548. isInteger: isInteger
  549. };
  550. }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
  551. /***/
  552. }),
  553. /* 5 */
  554. /***/
  555. (function (module, exports, __webpack_require__) {
  556. var __WEBPACK_AMD_DEFINE_RESULT__;
  557. !(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {
  558. var dataProcess = __webpack_require__(2);
  559. var dataPreprocess = dataProcess.dataPreprocess;
  560. var regreMethods = {
  561. /**
  562. * Common linear regression algorithm
  563. * @param {Array.<Array.<number>>} data two-dimensional array
  564. * @return {Object}
  565. */
  566. linear: function (data) {
  567. var predata = dataPreprocess(data);
  568. var sumX = 0;
  569. var sumY = 0;
  570. var sumXY = 0;
  571. var sumXX = 0;
  572. var len = predata.length;
  573. for (var i = 0; i < len; i++) {
  574. sumX += predata[i][0];
  575. sumY += predata[i][1];
  576. sumXY += predata[i][0] * predata[i][1];
  577. sumXX += predata[i][0] * predata[i][0];
  578. }
  579. var gradient = ((len * sumXY) - (sumX * sumY)) / ((len * sumXX) - (sumX * sumX));
  580. var intercept = (sumY / len) - ((gradient * sumX) / len);
  581. var result = [];
  582. for (var j = 0; j < predata.length; j++) {
  583. var coordinate = [predata[j][0], gradient * predata[j][0] + intercept];
  584. result.push(coordinate);
  585. }
  586. var string = 'y = ' + Math.round(gradient * 100) / 100 + 'x + ' + Math.round(intercept * 100) / 100;
  587. return {
  588. points: result,
  589. parameter: {
  590. gradient: gradient,
  591. intercept: intercept
  592. },
  593. expression: string
  594. };
  595. },
  596. /**
  597. * If the raw data include [0,0] point, we should choose linearThroughOrigin
  598. * instead of linear.
  599. * @param {Array.<Array>} data two-dimensional number array
  600. * @return {Object}
  601. */
  602. linearThroughOrigin: function (data) {
  603. var predata = dataPreprocess(data);
  604. var sumXX = 0;
  605. var sumXY = 0;
  606. for (var i = 0; i < predata.length; i++) {
  607. sumXX += predata[i][0] * predata[i][0];
  608. sumXY += predata[i][0] * predata[i][1];
  609. }
  610. var gradient = sumXY / sumXX;
  611. var result = [];
  612. for (var j = 0; j < predata.length; j++) {
  613. var coordinate = [predata[j][0], predata[j][0] * gradient];
  614. result.push(coordinate);
  615. }
  616. var string = 'y = ' + Math.round(gradient * 100) / 100 + 'x';
  617. return {
  618. points: result,
  619. parameter: {
  620. gradient: gradient
  621. },
  622. expression: string
  623. };
  624. },
  625. /**
  626. * Exponential regression
  627. * @param {Array.<Array.<number>>} data two-dimensional number array
  628. * @return {Object}
  629. */
  630. exponential: function (data) {
  631. var predata = dataPreprocess(data);
  632. var sumX = 0;
  633. var sumY = 0;
  634. var sumXXY = 0;
  635. var sumYlny = 0;
  636. var sumXYlny = 0;
  637. var sumXY = 0;
  638. for (var i = 0; i < predata.length; i++) {
  639. sumX += predata[i][0];
  640. sumY += predata[i][1];
  641. sumXY += predata[i][0] * predata[i][1];
  642. sumXXY += predata[i][0] * predata[i][0] * predata[i][1];
  643. sumYlny += predata[i][1] * Math.log(predata[i][1]);
  644. sumXYlny += predata[i][0] * predata[i][1] * Math.log(predata[i][1]);
  645. }
  646. var denominator = (sumY * sumXXY) - (sumXY * sumXY);
  647. var coefficient = Math.pow(Math.E, (sumXXY * sumYlny - sumXY * sumXYlny) / denominator);
  648. var index = (sumY * sumXYlny - sumXY * sumYlny) / denominator;
  649. var result = [];
  650. for (var j = 0; j < predata.length; j++) {
  651. var coordinate = [predata[j][0], coefficient * Math.pow(Math.E, index * predata[j][0])];
  652. result.push(coordinate);
  653. }
  654. var string = 'y = ' + Math.round(coefficient * 100) / 100 + 'e^(' + Math.round(index * 100) / 100 + 'x)';
  655. return {
  656. points: result,
  657. parameter: {
  658. coefficient: coefficient,
  659. index: index
  660. },
  661. expression: string
  662. };
  663. },
  664. /**
  665. * Logarithmic regression
  666. * @param {Array.<Array.<number>>} data two-dimensional number array
  667. * @return {Object}
  668. */
  669. logarithmic: function (data) {
  670. var predata = dataPreprocess(data);
  671. var sumlnx = 0;
  672. var sumYlnx = 0;
  673. var sumY = 0;
  674. var sumlnxlnx = 0;
  675. for (var i = 0; i < predata.length; i++) {
  676. sumlnx += Math.log(predata[i][0]);
  677. sumYlnx += predata[i][1] * Math.log(predata[i][0]);
  678. sumY += predata[i][1];
  679. sumlnxlnx += Math.pow(Math.log(predata[i][0]), 2);
  680. }
  681. var gradient = (i * sumYlnx - sumY * sumlnx) / (i * sumlnxlnx - sumlnx * sumlnx);
  682. var intercept = (sumY - gradient * sumlnx) / i;
  683. var result = [];
  684. for (var j = 0; j < predata.length; j++) {
  685. var coordinate = [predata[j][0], gradient * Math.log(predata[j][0]) + intercept];
  686. result.push(coordinate);
  687. }
  688. var string =
  689. 'y = ' +
  690. Math.round(intercept * 100) / 100 +
  691. ' + ' +
  692. Math.round(gradient * 100) / 100 + 'ln(x)';
  693. return {
  694. points: result,
  695. parameter: {
  696. gradient: gradient,
  697. intercept: intercept
  698. },
  699. expression: string
  700. };
  701. },
  702. /**
  703. * Polynomial regression
  704. * @param {Array.<Array.<number>>} data two-dimensional number array
  705. * @param {number} order order of polynomials
  706. * @return {Object}
  707. */
  708. polynomial: function (data, order) {
  709. var predata = dataPreprocess(data);
  710. if (typeof order === 'undefined') {
  711. order = 2;
  712. }
  713. //coefficient matrix
  714. var coeMatrix = [];
  715. var lhs = [];
  716. var k = order + 1;
  717. for (var i = 0; i < k; i++) {
  718. var sumA = 0;
  719. for (var n = 0; n < predata.length; n++) {
  720. sumA += predata[n][1] * Math.pow(predata[n][0], i);
  721. }
  722. lhs.push(sumA);
  723. var temp = [];
  724. for (var j = 0; j < k; j++) {
  725. var sumB = 0;
  726. for (var m = 0; m < predata.length; m++) {
  727. sumB += Math.pow(predata[m][0], i + j);
  728. }
  729. temp.push(sumB);
  730. }
  731. coeMatrix.push(temp);
  732. }
  733. coeMatrix.push(lhs);
  734. var coeArray = gaussianElimination(coeMatrix, k);
  735. var result = [];
  736. for (var i = 0; i < predata.length; i++) {
  737. var value = 0;
  738. for (var n = 0; n < coeArray.length; n++) {
  739. value += coeArray[n] * Math.pow(predata[i][0], n);
  740. }
  741. result.push([predata[i][0], value]);
  742. }
  743. var string = 'y = ';
  744. for (var i = coeArray.length - 1; i >= 0; i--) {
  745. if (i > 1) {
  746. string += Math.round(coeArray[i] * Math.pow(10, i + 1)) / Math.pow(10, i + 1) + 'x^' + i + ' + ';
  747. } else if (i === 1) {
  748. string += Math.round(coeArray[i] * 100) / 100 + 'x' + ' + ';
  749. } else {
  750. string += Math.round(coeArray[i] * 100) / 100;
  751. }
  752. }
  753. return {
  754. points: result,
  755. parameter: coeArray,
  756. expression: string
  757. };
  758. }
  759. };
  760. /**
  761. * Gaussian elimination
  762. * @param {Array.<Array.<number>>} matrix two-dimensional number array
  763. * @param {number} number
  764. * @return {Array}
  765. */
  766. function gaussianElimination(matrix, number) {
  767. for (var i = 0; i < matrix.length - 1; i++) {
  768. var maxColumn = i;
  769. for (var j = i + 1; j < matrix.length - 1; j++) {
  770. if (Math.abs(matrix[i][j]) > Math.abs(matrix[i][maxColumn])) {
  771. maxColumn = j;
  772. }
  773. }
  774. // the matrix here is the transpose of the common Augmented matrix.
  775. // so the can perform the primary column transform, in fact, equivalent
  776. // to the primary line changes
  777. for (var k = i; k < matrix.length; k++) {
  778. var temp = matrix[k][i];
  779. matrix[k][i] = matrix[k][maxColumn];
  780. matrix[k][maxColumn] = temp;
  781. }
  782. for (var n = i + 1; n < matrix.length - 1; n++) {
  783. for (var m = matrix.length - 1; m >= i; m--) {
  784. matrix[m][n] -= matrix[m][i] / matrix[i][i] * matrix[i][n];
  785. }
  786. }
  787. }
  788. var data = new Array(number);
  789. var len = matrix.length - 1;
  790. for (var j = matrix.length - 2; j >= 0; j--) {
  791. var temp = 0;
  792. for (var i = j + 1; i < matrix.length - 1; i++) {
  793. temp += matrix[i][j] * data[i];
  794. }
  795. data[j] = (matrix[len][j] - temp) / matrix[j][j];
  796. }
  797. return data;
  798. }
  799. var regression = function (regreMethod, data, order) {
  800. return regreMethods[regreMethod](data, order);
  801. };
  802. return regression;
  803. }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
  804. /***/
  805. }),
  806. /* 6 */
  807. /***/
  808. (function (module, exports, __webpack_require__) {
  809. var __WEBPACK_AMD_DEFINE_RESULT__;
  810. !(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {
  811. var statistics = {};
  812. statistics.max = __webpack_require__(7);
  813. statistics.deviation = __webpack_require__(8);
  814. statistics.mean = __webpack_require__(10);
  815. statistics.median = __webpack_require__(12);
  816. statistics.min = __webpack_require__(14);
  817. statistics.quantile = __webpack_require__(13);
  818. statistics.sampleVariance = __webpack_require__(9);
  819. statistics.sum = __webpack_require__(11);
  820. return statistics;
  821. }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
  822. /***/
  823. }),
  824. /* 7 */
  825. /***/
  826. (function (module, exports, __webpack_require__) {
  827. var __WEBPACK_AMD_DEFINE_RESULT__;
  828. !(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {
  829. var number = __webpack_require__(4);
  830. var isNumber = number.isNumber;
  831. /**
  832. * Is a method for computing the max value of a list of numbers,
  833. * which will filter other data types.
  834. * @param {Array.<number>} data
  835. * @return {number}
  836. */
  837. function max(data) {
  838. var maxData = -Infinity;
  839. for (var i = 0; i < data.length; i++) {
  840. if (isNumber(data[i]) && data[i] > maxData) {
  841. maxData = data[i];
  842. }
  843. }
  844. return maxData;
  845. }
  846. return max;
  847. }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
  848. /***/
  849. }),
  850. /* 8 */
  851. /***/
  852. (function (module, exports, __webpack_require__) {
  853. var __WEBPACK_AMD_DEFINE_RESULT__;
  854. !(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {
  855. var variance = __webpack_require__(9);
  856. /**
  857. * Computing the deviation
  858. * @param {Array.<number>} data
  859. * @return {number}
  860. */
  861. return function (data) {
  862. var squaredDeviation = variance(data);
  863. return squaredDeviation ? Math.sqrt(squaredDeviation) : squaredDeviation;
  864. };
  865. }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
  866. /***/
  867. }),
  868. /* 9 */
  869. /***/
  870. (function (module, exports, __webpack_require__) {
  871. var __WEBPACK_AMD_DEFINE_RESULT__;
  872. !(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {
  873. var number = __webpack_require__(4);
  874. var isNumber = number.isNumber;
  875. var mean = __webpack_require__(10);
  876. /**
  877. * Computing the variance of list of sample
  878. * @param {Array.<number>} data
  879. * @return {number}
  880. */
  881. function sampleVariance(data) {
  882. var len = data.length;
  883. if (!len || len < 2) {
  884. return 0;
  885. }
  886. if (data.length >= 2) {
  887. var meanValue = mean(data);
  888. var sum = 0;
  889. var temple;
  890. for (var i = 0; i < data.length; i++) {
  891. if (isNumber(data[i])) {
  892. temple = data[i] - meanValue;
  893. sum += temple * temple;
  894. }
  895. }
  896. return sum / (data.length - 1);
  897. }
  898. }
  899. return sampleVariance;
  900. }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
  901. /***/
  902. }),
  903. /* 10 */
  904. /***/
  905. (function (module, exports, __webpack_require__) {
  906. var __WEBPACK_AMD_DEFINE_RESULT__;
  907. !(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {
  908. var sum = __webpack_require__(11);
  909. /**
  910. * Is a method for computing the mean value of a list of numbers,
  911. * which will filter other data types.
  912. * @param {Array.<number>} data
  913. * @return {number}
  914. */
  915. function mean(data) {
  916. var len = data.length;
  917. if (!len) {
  918. return 0;
  919. }
  920. return sum(data) / data.length;
  921. }
  922. return mean;
  923. }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
  924. /***/
  925. }),
  926. /* 11 */
  927. /***/
  928. (function (module, exports, __webpack_require__) {
  929. var __WEBPACK_AMD_DEFINE_RESULT__;
  930. !(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {
  931. var number = __webpack_require__(4);
  932. var isNumber = number.isNumber;
  933. /**
  934. * Is a method for computing the sum of a list of numbers,
  935. * which will filter other data types.
  936. * @param {Array.<number>} data
  937. * @return {number}
  938. */
  939. function sum(data) {
  940. var len = data.length;
  941. if (!len) {
  942. return 0;
  943. }
  944. var sumData = 0;
  945. for (var i = 0; i < len; i++) {
  946. if (isNumber(data[i])) {
  947. sumData += data[i];
  948. }
  949. }
  950. return sumData;
  951. }
  952. return sum;
  953. }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
  954. /***/
  955. }),
  956. /* 12 */
  957. /***/
  958. (function (module, exports, __webpack_require__) {
  959. var __WEBPACK_AMD_DEFINE_RESULT__;
  960. !(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {
  961. var quantile = __webpack_require__(13);
  962. /**
  963. * Is a method for computing the median value of a sorted array of numbers
  964. * @param {Array.<number>} data
  965. * @return {number}
  966. */
  967. function median(data) {
  968. return quantile(data, 0.5);
  969. }
  970. return median;
  971. }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
  972. /***/
  973. }),
  974. /* 13 */
  975. /***/
  976. (function (module, exports, __webpack_require__) {
  977. var __WEBPACK_AMD_DEFINE_RESULT__;
  978. !(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {
  979. /**
  980. * Estimating quantiles from a sorted sample of numbers
  981. * @see https://en.wikipedia.org/wiki/Quantile#Estimating_quantiles_from_a_sample
  982. * R-7 method
  983. * @param {Array.<number>} data sorted array
  984. * @param {number} p
  985. */
  986. return function (data, p) {
  987. var len = data.length;
  988. if (!len) {
  989. return 0;
  990. }
  991. if (p <= 0 || len < 2) {
  992. return data[0];
  993. }
  994. if (p >= 1) {
  995. return data[len - 1];
  996. }
  997. // in the wikipedia's R-7 method h = (N - 1)p + 1, but here array index start from 0
  998. var h = (len - 1) * p;
  999. var i = Math.floor(h);
  1000. var a = data[i];
  1001. var b = data[i + 1];
  1002. return a + (b - a) * (h - i);
  1003. };
  1004. }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
  1005. /***/
  1006. }),
  1007. /* 14 */
  1008. /***/
  1009. (function (module, exports, __webpack_require__) {
  1010. var __WEBPACK_AMD_DEFINE_RESULT__;
  1011. !(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {
  1012. var number = __webpack_require__(4);
  1013. var isNumber = number.isNumber;
  1014. /**
  1015. * Is a method for computing the min value of a list of numbers,
  1016. * which will filter other data types.
  1017. * @param {Array.<number>} data
  1018. * @return {number}
  1019. */
  1020. function min(data) {
  1021. var minData = Infinity;
  1022. for (var i = 0; i < data.length; i++) {
  1023. if (isNumber(data[i]) && data[i] < minData) {
  1024. minData = data[i];
  1025. }
  1026. }
  1027. return minData;
  1028. }
  1029. return min;
  1030. }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
  1031. /***/
  1032. }),
  1033. /* 15 */
  1034. /***/
  1035. (function (module, exports, __webpack_require__) {
  1036. var __WEBPACK_AMD_DEFINE_RESULT__;
  1037. !(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {
  1038. var max = __webpack_require__(7);
  1039. var min = __webpack_require__(14);
  1040. var quantile = __webpack_require__(13);
  1041. var deviation = __webpack_require__(8);
  1042. var dataProcess = __webpack_require__(2);
  1043. var dataPreprocess = dataProcess.dataPreprocess;
  1044. var getPrecision = dataProcess.getPrecision;
  1045. var array = __webpack_require__(3);
  1046. var ascending = array.ascending;
  1047. var map = array.map;
  1048. var range = __webpack_require__(16);
  1049. var bisect = array.bisect;
  1050. var tickStep = __webpack_require__(17);
  1051. /**
  1052. * Compute bins for histogram
  1053. * @param {Array.<number>} data
  1054. * @param {string} threshold
  1055. * @return {Object}
  1056. */
  1057. function computeBins(data, threshold) {
  1058. if (threshold == null) {
  1059. threshold = thresholdMethod.squareRoot;
  1060. } else {
  1061. threshold = thresholdMethod[threshold];
  1062. }
  1063. var values = dataPreprocess(data);
  1064. var maxValue = max(values);
  1065. var minValue = min(values);
  1066. var binsNumber = threshold(values, minValue, maxValue);
  1067. var step = tickStep(minValue, maxValue, binsNumber);
  1068. var precision = -Math.floor(Math.log(Math.abs(maxValue - minValue) / binsNumber) / Math.LN10);
  1069. // return the xAxis coordinate for each bins, except the end point of the value
  1070. var rangeArray = range(
  1071. // use function toFixed() to avoid data like '0.700000001'
  1072. +((Math.ceil(minValue / step) * step).toFixed(precision)),
  1073. +((Math.floor(maxValue / step) * step).toFixed(precision)),
  1074. step,
  1075. precision
  1076. );
  1077. var len = rangeArray.length;
  1078. var bins = new Array(len + 1);
  1079. for (var i = 0; i <= len; i++) {
  1080. bins[i] = {};
  1081. bins[i].sample = [];
  1082. bins[i].x0 = i > 0 ?
  1083. rangeArray[i - 1] :
  1084. (rangeArray[i] - minValue) === step ?
  1085. minValue :
  1086. (rangeArray[i] - step);
  1087. bins[i].x1 = i < len ?
  1088. rangeArray[i] :
  1089. (maxValue - rangeArray[i - 1]) === step ?
  1090. maxValue :
  1091. rangeArray[i - 1] + step;
  1092. }
  1093. for (var i = 0; i < values.length; i++) {
  1094. if (minValue <= values[i] && values[i] <= maxValue) {
  1095. bins[bisect(rangeArray, values[i], 0, len)].sample.push(values[i]);
  1096. }
  1097. }
  1098. var data = map(bins, function (bin) {
  1099. // use function toFixed() to avoid data like '6.5666638489'
  1100. return [+((bin.x0 + bin.x1) / 2).toFixed(precision), bin.sample.length];
  1101. });
  1102. var customData = map(bins, function (bin) {
  1103. return [bin.x0, bin.x1, bin.sample.length];
  1104. });
  1105. return {
  1106. bins: bins,
  1107. data: data,
  1108. customData: customData
  1109. };
  1110. }
  1111. /**
  1112. * Four kinds of threshold methods used to
  1113. * compute how much bins the histogram should be divided
  1114. * @see https://en.wikipedia.org/wiki/Histogram
  1115. * @type {Object}
  1116. */
  1117. var thresholdMethod = {
  1118. squareRoot: function (data) {
  1119. var bins = Math.ceil(Math.sqrt(data.length));
  1120. return bins > 50 ? 50 : bins;
  1121. },
  1122. scott: function (data, min, max) {
  1123. return Math.ceil((max - min) / (3.5 * deviation(data) * Math.pow(data.length, -1 / 3)));
  1124. },
  1125. freedmanDiaconis: function (data, min, max) {
  1126. data.sort(ascending);
  1127. return Math.ceil(
  1128. (max - min) / (2 * (quantile(data, 0.75) - quantile(data, 0.25)) * Math.pow(data.length, -1 / 3))
  1129. );
  1130. },
  1131. sturges: function (data) {
  1132. return Math.ceil(Math.log(data.length) / Math.LN2) + 1;
  1133. }
  1134. };
  1135. return computeBins;
  1136. }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
  1137. /***/
  1138. }),
  1139. /* 16 */
  1140. /***/
  1141. (function (module, exports, __webpack_require__) {
  1142. var __WEBPACK_AMD_DEFINE_RESULT__;
  1143. !(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {
  1144. var dataProcess = __webpack_require__(2);
  1145. var getPrecision = dataProcess.getPrecision;
  1146. /**
  1147. * Computing range array.
  1148. * Adding param precision to fix range value, avoiding range[i] = 0.7000000001.
  1149. * @param {number} start
  1150. * @param {number} end
  1151. * @param {number} step
  1152. * @param {number} precision
  1153. * @return {Array.<number>}
  1154. */
  1155. return function (start, end, step, precision) {
  1156. var len = arguments.length;
  1157. if (len < 2) {
  1158. end = start;
  1159. start = 0;
  1160. step = 1;
  1161. } else if (len < 3) {
  1162. step = 1;
  1163. } else if (len < 4) {
  1164. step = +step;
  1165. precision = getPrecision(step);
  1166. } else {
  1167. precision = +precision;
  1168. }
  1169. var n = Math.ceil(((end - start) / step).toFixed(precision));
  1170. var range = new Array(n + 1);
  1171. for (var i = 0; i < n + 1; i++) {
  1172. range[i] = +(start + i * step).toFixed(precision);
  1173. }
  1174. return range;
  1175. };
  1176. }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
  1177. /***/
  1178. }),
  1179. /* 17 */
  1180. /***/
  1181. (function (module, exports, __webpack_require__) {
  1182. var __WEBPACK_AMD_DEFINE_RESULT__;
  1183. !(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) {
  1184. /**
  1185. * Computing the length of step
  1186. * @see https://github.com/d3/d3-array/blob/master/src/ticks.js
  1187. * @param {number} start
  1188. * @param {number} stop
  1189. * @param {number} count
  1190. */
  1191. return function (start, stop, count) {
  1192. var step0 = Math.abs(stop - start) / count;
  1193. var precision = Math.floor(Math.log(step0) / Math.LN10);
  1194. var step1 = Math.pow(10, precision);
  1195. var error = step0 / step1;
  1196. if (error >= Math.sqrt(50)) {
  1197. step1 *= 10;
  1198. } else if (error >= Math.sqrt(10)) {
  1199. step1 *= 5;
  1200. } else if (error >= Math.sqrt(2)) {
  1201. step1 *= 2;
  1202. }
  1203. return +((stop >= start ? step1 : -step1).toFixed(-precision));
  1204. };
  1205. }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
  1206. /***/
  1207. })
  1208. /******/
  1209. ])
  1210. });;