|
|
@@ -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));
|
|
|
+};
|