{-# LANGUAGE BangPatterns #-}
module Utility
( sortVector
, rankVector
, medianVector
, avgVector
, transposeSamples
) where
import Data.Function (on)
import Data.List
import Control.Lens
import Statistics.Quantile
import Statistics.Sample (mean)
import qualified Data.Map.Strict as Map
import qualified Data.Set as Set
import qualified Data.Vector as V
import qualified Data.Vector.Algorithms.Merge as V
import Types
avgVector :: V.Vector Double -> Double
avgVector = mean
medianVector :: V.Vector Double -> Double
medianVector = continuousBy s 2 4
sortVector :: V.Vector Entity -> V.Vector Entity
sortVector = V.modify (V.sortBy (compare `on` view value))
rankVector :: V.Vector Entity -> V.Vector Entity
rankVector xs = V.map (over value (flip (Map.findWithDefault 0) rankMap)) xs
where
rankMap = Map.fromList
. flip zip [0,1..]
. Set.toList
. Set.fromList
. fmap (view value)
. V.toList
$ xs
transposeSamples :: Map.Map Sample (V.Vector Entity)
-> [V.Vector Double]
transposeSamples = fmap V.fromList
. transpose
. fmap (V.toList . fmap (view value))
. Map.elems