SOURCE

function shuffleArray(arr) {
  for (let i = arr.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [arr[i], arr[j]] = [arr[j], arr[i]];
  }
  return arr;
}

function getRandomArray(len, min, max) {
  const arr = [];
  for (let i = min; i <= max; i++) {
    arr.push(i);
  }
  shuffleArray(arr);
  return arr.slice(0, len);
}

// 计算数组的四分位距
function IQR(arr) {
    const sorted = arr.slice().sort((a, b) => a - b);
    const q1 = sorted[Math.floor(sorted.length * 0.25)];
    const q3 = sorted[Math.floor(sorted.length * 0.75)];
    return q3 - q1;
}

/* 百分位数方法:计算数组的第q1分位数和第q3分位数,然后根据四分位距(q3-q1)确定一个阈值,如果一个数据超过了(q3+阈值)或者(q1-阈值),就被视为离群值。常用的阈值为1.5倍四分位距。 */
// 计算离群值
function outliers1(arr, k = 0.8) {
    const m = d3.median(arr);
    console.log('原中位数', m);
    const iqr = IQR(arr);
    const lower = m - k * iqr;
    const upper = m + k * iqr;
    console.log('四分位离群值', arr.filter(x => x < lower || x > upper).sort((a1,a2)=>a1-a2));
    return arr.filter(x => x >= lower && x <= upper);
}

// 标准差方法
function outliers2(arr, k = 1.4) {
    const mean = d3.mean(arr);
    console.log('原平均值', mean);
    // const variance = d3.variance(arr);
    const deviation = d3.deviation(arr); // 求标准差
    const lower = mean - k * deviation; // 计算下界
    const upper = mean + k * deviation; // 计算上界
    console.log("上下限", lower, upper);
    console.log('标准差离群值', arr.filter(x => x < lower || x > upper).sort((a1,a2)=>a1-a2));
    return arr.filter(x => x >= lower && x <= upper);
}

function findTimeUnit(arr, out) {
    if (arr && arr.length > 1) {
        // const out = outliers(arr);
        const median = d3.mean(out);
        console.log('新平均值', d3.mean(out))
        console.log('新中位数', d3.median(out))
        const seconds = median; // 秒数
        if (seconds < 100) {
            return 'SECOND';
        }
        const minutes = seconds / 60; // 分钟数
        if (minutes < 100) {
            return 'MINUTE';
        }
        const hours = minutes / 60; // 小时数
        if (hours < 100) {
            return 'HOUR';
        }
        const days = hours / 24; // 天数
        if (days < 100) {
            return 'DAY';
        }
        // const weeks = days / 7; // 周数
        return 'WEEK';
    }
    return 'SECOND';
}


// const arr = getRandomArray(10,0,1000000);
// console.log(arr);
// console.log()
// const unit1 = findTimeUnit(arr, outliers1(arr));
// console.log(unit1);
// console.log()
// console.log()
// const unit2 = findTimeUnit(arr, outliers2(arr));
// console.log(unit2);

console.log()
console.log()
// const arraa =  [1000000,100,200,1,0,2777,2,33333,3,11115,6,8,8888,6666,222];

// const unit3 = findTimeUnit(arraa, outliers1(arraa));
// console.log(unit3);
// const unit4 = findTimeUnit(arraa, outliers2(arraa));
// console.log(unit4);


const aaaa =  [124500,172800,172800];

const unit5 = findTimeUnit(aaaa, outliers2(aaaa));
console.log(unit5);



console 命令行工具 X clear

                    
>
console