arrStd.mjs

import size from 'lodash-es/size.js'
import map from 'lodash-es/map.js'
import filter from 'lodash-es/filter.js'
import isarr from 'wsemi/src/isarr.mjs'
import isnum from 'wsemi/src/isnum.mjs'
import cdbl from 'wsemi/src/cdbl.mjs'
import jt from './jStat.mjs'


/**
 * 計算陣列內有效數字之標準差
 *
 * Unit Test: {@link https://github.com/yuda-lyu/w-statistic/blob/master/test/arrStd.test.js Github}
 * @memberOf w-statistic
 * @param {Array} arr 輸入陣列,只提取有效數字(或為字串的數字)進行計算
 * @returns {Number} 回傳標準差
 * @example
 *
 * let arr
 *
 * arr = ['abc', '-2.5', -2.5, '-1', -1, '-0.1', -0.1, '0', 0, '0.1', 0.1, '1', 1, '2.5', 2.5, 22.5, 'xyz']
 * console.log(arrStd(arr))
 * // => 5.985339231345682
 *
 * arr = ['abc', '0', 0, '0.1', 0.1, '1', 1, '2.5', 2.5, 22.5, 'xyz']
 * console.log(arrStd(arr))
 * // => 7.269456650947167
 *
 * arr = [55, 68, 45, 78, 150, 241, 162, 156, 182, 125, 75, 89, 91, 95, 92, 65, 75, 85, 95, 105, 132, 120, 142, 110, 111, 130, 128, 130, 108, 109]
 * console.log(arrStd(arr))
 * // =>  40.847473507599254, 為除以29(n-1)的std
 *
 */
function arrStd(arr) {

    //check
    if (!isarr(arr)) {
        return null
    }
    if (size(arr) === 0) {
        return null
    }

    //arr
    arr = filter(arr, (v) => {
        return isnum(v)
    })
    arr = map(arr, cdbl)

    //check
    if (size(arr) <= 1) { //標準差至少要2點才能計算
        return null
    }

    // let r = ss.sampleStandardDeviation(arr)
    let r = jt.sampleStd(arr)

    return r
}


export default arrStd