module Model.CellExpression.Evaluator.Math (mean,median,medianSorted,stdDeviation ,firstQuartile,firstQuartileSorted ,thirdQuartile,thirdQuartileSorted) where import Data.List (sort) import Model.CellExpression.Evaluator.Common (fLength) mean :: [Double] -> Double mean values = sum values / (fLength values) median,medianSorted :: [Double] -> Double medianSorted values = let l = length values in if odd l then values !! (l `div` 2) else let x = values !! ((l - 1) `div` 2) y = values !! (l `div` 2) in (x + y) / 2 median = medianSorted . sort firstQuartile,firstQuartileSorted :: [Double] -> Double firstQuartileSorted values = let l = length values in if odd l then values !! (l `div` 4) else values !! ((l + 1) `div` 4) firstQuartile = firstQuartileSorted . sort thirdQuartile,thirdQuartileSorted :: [Double] -> Double thirdQuartileSorted values = let l = length values in if odd l then values !! ((3 * l + 2) `div` 4) else values !! ((3 * l + 1) `div` 4) thirdQuartile = thirdQuartileSorted . sort stdDeviation :: [Double] -> Double stdDeviation [_] = 0 stdDeviation values = let m = mean values in sqrt $ (sum $ map (\v -> (v - m) ** 2) values) / (fLength values - 1)