Browse Source

feat(util): 平均值算法

zhangweicheng 3 năm trước cách đây
mục cha
commit
e8ef2b1c48
2 tập tin đã thay đổi với 26 bổ sung1 xóa
  1. 1 1
      util/package.json
  2. 25 0
      util/src/math.ts

+ 1 - 1
util/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@sc/util",
-  "version": "1.0.10",
+  "version": "1.0.11",
   "description": "通用的工具包",
   "main": "./dist/index.cjs.js",
   "module": "./dist/index.esm.js",

+ 25 - 0
util/src/math.ts

@@ -60,3 +60,28 @@ export const getNumberFromUnit = (unit: string): number => {
   }
   return getTimesFromStr(unit);
 };
+
+// 返回平均值,标准差
+export const standardDeviation = (arr: number[]) => {
+  if (arr.length === 0) return { avg: 0, stdDev: 0 };
+
+  const avg = arr.reduce((acc, val) => acc + val, 0) / arr.length;
+
+  const stdDev = Math.sqrt(
+    arr.reduce((acc: number[], val) => acc.concat((val - avg) ** 2), []).reduce((acc, val) => acc + val, 0) / arr.length
+  );
+
+  return { avg, stdDev };
+};
+
+// 是否在三倍标准差内  true 则为有效数值
+export const isValidVal = (value: number, avg: number, stdDev: number) => {
+  return Math.abs(value - avg) <= 3 * stdDev;
+};
+
+// 用三倍标准差法过滤无效数据
+export const filterByStdDev = (arr: number[]) => {
+  const { avg, stdDev } = standardDeviation(arr);
+
+  return arr.filter(n => isValidVal(n, avg, stdDev));
+};