Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
This module provides incremental statistics folds based upon the foldl
library
>>>
import Statistics.Incremental
>>>
import qualified Control.Foldl as L
The folds represent incremental statistics such as `moving averages`.
Statistics are based on exponential-weighting schemes which enable statistics to be calculated in a streaming one-pass manner. The stream of moving averages with an exponential parameter of 0.1 is:
>>>
scan (ma 0.1) [1..10]
or if you just want the moving average at the end.
>>>
fold (ma 0.1) [1..10]
- data Increment = Increment {}
- incrementalize :: (a -> Double) -> Double -> Fold a Double
- incMa :: Double -> Fold Double Double
- incAbs :: Double -> Fold Double Double
- incSq :: Double -> Fold Double Double
- incStd :: Double -> Fold Double Double
- scan :: Foldable f => Fold a b -> f a -> [b]
- module Data.Foldable
- module Control.Foldl
an increment between L.fold steps
State
incrementalize :: (a -> Double) -> Double -> Fold a Double Source
takes a function and turns it into a Foldl.Fold where the step incremental is an Increment with a step function iso to a step in an exponential moving average calculation.
>>>
incrementalize id
is a moving average of a foldable
>>>
incrementalize (*2)
is a moving average of the square of a foldable
This lets you build an exponential standard deviation computation (using Foldl) as
>>>
std r = (\s ss -> sqrt (ss - s**2)) <$> incrementalize id r <*> incrementalize (*2) r
An exponential moving average approach (where average
id abstracted to function
) represents an efficient single-pass computation that attempts to keep track of a running average of some Foldable.
The rate is the parameter regulating the discount of current state and the introduction of the current value.
>>>
incrementalize id 1
tracks the sum/average of an entire Foldable.
>>>
incrementalize id 0
produces the latest value (ie current state is discounted to zero)
A exponential moving average with a duration of 10 (the average lag of the values effecting the calculation) is
>>>
incrementalize id (1/10)
convenience folds
module Data.Foldable
module Control.Foldl