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