All files stats.ts

86.36% Statements 19/22
62.5% Branches 5/8
88.89% Functions 8/9
88.89% Lines 16/18

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 708x                           2x     2x   2x 2x 10x     2x 2x       2x 2x 12x 2x             12x     12x                                               8x 2x    
import { purry } from './purry';
 
export interface Stats {
  min: number;
  max: number;
  arithmetic_mean: number;
  median: number;
  geometric_mean: number;
  middle: number;
  quadratic_mean: number;
  sum: number;
}
 
function _stats<X>(data: ReadonlyArray<X>, fn?: (q: X) => number): Stats {
  const dfFn = (data: X) => {
    return (data as unknown) as number;
  };
  const numbers = data.map(fn || dfFn);
  function calcMedian(values: ReadonlyArray<number>) {
    Iif (values.length === 0) return 0;
    [...values].sort((a, b) => {
      return a - b;
    });
 
    const half = Math.floor(values.length / 2);
    Eif (values.length % 2) return values[half];
 
    return (values[half - 1] + values[half]) / 2.0;
  }
  const min = Math.min(...numbers);
  const max = Math.max(...numbers);
  const sum = numbers.reduce((acc, c) => acc + c, 0);
  return {
    sum,
    middle: (max + min) / 2,
    min: Math.min(...numbers),
    max: Math.max(...numbers),
    arithmetic_mean: sum / numbers.length,
    geometric_mean:
      numbers.reduce((acc, c) => acc * (c === 0 ? 1 : c), 1) / numbers.length,
    median: calcMedian(numbers),
    quadratic_mean: Math.sqrt(
      numbers.map(q => Math.pow(q, 2)).reduce((acc, c) => acc + c, 0)
    ),
  };
}
 
/**
 * Calculate objet numeric statistics
 * @param data - Array of data
 * @param fn - Function that maps to numeric data
 * @signature
 *    P.stats(data, fn)
 * @signature
 *    P.pipe(data,P.stats(fn))
 * @example
 *    P.stats([{ data: 1 }, { data: 2 }, { data: 3 }], (q) => q.data) // => { sum: 6, middle: 2, min: 1, max: 3, arithmetic_mean: 2, geometric_mean: 6, median: 2, quadratic_mean: 14 }
 *    P.pipe([1, 2, 3], P.stats((q) => q)) // => { sum: 6, middle: 2, min: 1, max: 3, arithmetic_mean: 2, geometric_mean: 6, median: 2, quadratic_mean: 14 }
 * @category Number, Pipe
 */
export function stats<T>(data: readonly T[], fn: (item: T) => number): Stats;
export function stats(data: readonly number[]): Stats;
export function stats<T>(
  fn: (item: T) => number
): (array: readonly T[]) => Stats;
 
export function stats() {
  return purry(_stats, arguments);
}