{-# LANGUAGE GADTs #-}
module DataForecast.TimeSeries.Aggregate
( computeTotal
, computeMean
) where
import DataForecast.Prelude
import DataForecast.TimeSeries
import DataForecast.TimeSeries.Internal
computeTotal :: TimeSeries parts -> TimeSeries parts
computeTotal tts@TimeSeries{} =
case sdtotal . getSD $ tts of
Just _total ->
tts
Nothing ->
let
subparts =
subs . getSub $ tts
newSubparts =
map computeTotal subparts
subpartTotal =
sum . map getTotalOrZero $ newSubparts
newSD =
setSdTotal subpartTotal (getSD tts)
in
setSD newSD (setSub (Subparts newSubparts) tts)
computeMean :: TimeSeries parts -> TimeSeries parts
computeMean ts@TimeSeries{} =
case sdmean . getSD $ ts of
Just _mean ->
ts
Nothing ->
let
tsWithTotals = computeTotal ts
newSubparts = map computeMean . subs . getSub $ tsWithTotals
mTotal = sdtotal . getSD $ tsWithTotals
n = length newSubparts
mMean =
if n == 0 then
mTotal
else
(/ fromIntegral n) <$> mTotal
newSD = setSdMeanInternal mMean (getSD tsWithTotals)
in
setSD newSD (setSub (Subparts newSubparts) tsWithTotals)
getTotalOrZero :: TimeSeries parts -> Double
getTotalOrZero = fromMaybe 0 . sdtotal . getSD