Documentation
¶
Overview ¶
Package stl implements functions and data structures necessary to perform a Seasonal-Trend decomposition by LOESS, as described by Cleveland et al. (1990).
This library's code was ported over from the original Netlib library which was written in Fortran '77.
Example ¶
package main import ( "encoding/csv" "fmt" "io" "os" "strconv" "github.com/chewxy/stl" "github.com/chewxy/tightywhities" ) const ( w, h = 80, 10 // width and height of the chart producd ) func readCheck(a io.Reader, err error) io.Reader { if err != nil { panic(err) } return a } func check(r stl.Result) stl.Result { if r.Err != nil { panic(r.Err) } return r } func printResult(res stl.Result) { fmt.Println("Data:") line := tightywhities.NewLine(nil, res.Data[:w]) line.Plot(w, h, os.Stdout) fmt.Println("\nTrend:") line = tightywhities.NewLine(nil, res.Trend[:w]) line.Plot(w, h, os.Stdout) fmt.Println("\nSeasonal:") line = tightywhities.NewLine(nil, res.Seasonal[:w]) line.Plot(w, h, os.Stdout) fmt.Println("\nResiduals:") line = tightywhities.NewLine(nil, res.Resid[:w]) line.Plot(w, h, os.Stdout) } func main() { f := readCheck(os.Open("testdata/co2.csv")) r := csv.NewReader(f) var data []float64 r.Read() // read header for rec, err := r.Read(); err == nil; rec, err = r.Read() { // here we're ignoring errors because we know the file to be correct if co2, err := strconv.ParseFloat(rec[0], 64); err == nil { data = append(data, co2) } } res := check(stl.Decompose(data, 12, 35, stl.Additive(), stl.WithRobustIter(2), stl.WithIter(2))) fmt.Println("ADDITIVE MODEL\n=====================") printResult(res) // Multiplicative model res = check(stl.Decompose(data, 12, 35, stl.Multiplicative(), stl.WithRobustIter(2), stl.WithIter(2))) fmt.Println("\nMULTIPLICATIVE MODEL\n=====================") printResult(res) }
Output: ADDITIVE MODEL ===================== Data: │ │ ╭╮ ╭╮ │ ╭╯╰╮ ╭╯╰╮ │+ ╭╮ ╭──╮ │ │ ╭╯ ╰╮ │ ╭─╮ ╭╯╰╮ ╭╯ ╰╮ ╭╯ ╰╮ ╭─╯ │ │ ╭╯ │ ╭╯ ╰╮ ╭╯ │ ╭─╯ │ │ ╰╮ │ ╭─╮ ╭──╮ ╭╯ ╰╮ ╭╯ │ ╭╯ │ ╭╯ ╰╮ ╭╯ │ │ │ ╰╮ ╭╯ ╰╮ ╭╯ │ ╭╯ ╰╮ ╭╯ ╰╮ ╭╯ │ ╭╯ ╰─ │ ╯ ╰╮ ╭─╯ │ ╭─╯ ╰╮ ╭╯ │ ╭╯ ╰╮│ ╰─╯ │ ╰╮ ╭╯ ╰╮ ╭╯ │ ╭╯ ╰─╯ ╰╯ │ │ │ ╰╮│ ╰─╯ │ ╰──╯ ╰╯ Trend: │ │+ ╭───╮ ╭──╮ │ ╭───╮ ╭─╯ ╰─╮ ╭──╯ ╰─╮ │ ╭─╯ ╰─╮╭─╯ ╰──╯ ╰╮ │ ╭╯ ╰╯ ╰╮ ╭─────╮ │ ╭╯ ╰─╯ ╰╮ │ ╭╮ ╭╯ ╰─╮ │ ╭──╯╰──╯ ╰╮ ╭───╮ │ ╭─╯ ╰───╯ ╰─╮ │ ╭─╯ ╰╮ │ ───────╯ ╰╮ │ ╰─ Seasonal: │ │ ╭── │+ ╭────╯ │ ╭───╯ │ ╭───╯ │ ╭───╯ │ ╭──╯ │ ╭───╯ │ ╭─────╯ │ ─────╮ ╭────╯ │ ╰──────╮ ╭───────╯ │ ╰────────────────────╯ Residuals: │ │ ╭╮ ╭╮ │ │╰╮ ╭╮ ╭╮ ││ ╭╮ │ ╭─╮ ╭╯ │ ╭╯╰╮ ╭╯╰╮ ╭╯╰╮ ╭╯╰╮ │+ ╭──╮ ╭╯ │ │ ╰╮ │ │ │ ╰╮ │ │ │ │ │ │ │ ╭╯ ╰╮ │ │ ╭╯ ╰╮ ╭╯ │ ╭╯ ╰╮ ╭╯ ╰╮ │ │ ╰╮ ╭╯ │ ╭─╯ │ ╭╯ │ ╭╯ │ ╭╯ │ ╭─╯ │ │ ╯ │ ╭╯ │ ╭╯ │ ╭╯ │ ╭╯ │ ╭╯ │ │ │ │ ╰╮ ╭╯ ╰╮ ╭╯ ╰╮ ╭╯ ╰╮ ╭╯ ╰╮ ╭╯ ╰╮ ╭╯ ╰╮ │ │ │ │ ╭╯ │ │ │ ╭╯ │ ╭╯ │ │ │ │ ╰╮╭╯ ╰╮│ │ ╭╯ │╭╯ ╰╮│ │ ╭╯ │ │ ╰╯ ╰╯ ╰─╯ ╰╯ ╰╯ ╰─╯ ╰─ MULTIPLICATIVE MODEL ===================== Data: │ │ ╭╮ ╭╮ │ ╭╯╰╮ ╭╯╰╮ │+ ╭╮ ╭──╮ │ │ ╭╯ ╰╮ │ ╭─╮ ╭╯╰╮ ╭╯ ╰╮ ╭╯ ╰╮ ╭─╯ │ │ ╭╯ │ ╭╯ ╰╮ ╭╯ │ ╭─╯ │ │ ╰╮ │ ╭─╮ ╭──╮ ╭╯ ╰╮ ╭╯ │ ╭╯ │ ╭╯ ╰╮ ╭╯ │ │ │ ╰╮ ╭╯ ╰╮ ╭╯ │ ╭╯ ╰╮ ╭╯ ╰╮ ╭╯ │ ╭╯ ╰─ │ ╯ ╰╮ ╭─╯ │ ╭─╯ ╰╮ ╭╯ │ ╭╯ ╰╮│ ╰─╯ │ ╰╮ ╭╯ ╰╮ ╭╯ │ ╭╯ ╰─╯ ╰╯ │ │ │ ╰╮│ ╰─╯ │ ╰──╯ ╰╯ Trend: │+ │ ╭╮ │ ╭─╮ ╭────╮ ╭─╯╰─╮ │ ╭╯ ╰──╮ ╭─╯ ╰─╮ ╭─╯ ╰╮ │ ╭╯ ╰╮╭─╯ ╰─╯ ╰╮ ╭╮ │ ╭╯ ╰╯ ╰──────╯╰╮ │ ╭╯ ╰─╮ │ ╭─────╮╭╯ ╰╮ ╭╮ │ ╭╯ ╰╯ ╰╮ ╭───╯╰─╮ │ ╭╯ ╰─╯ ╰╮ │ ╭──╯ ╰╮ │ ──────╯ ╰── Seasonal: │ │ ╭───── │+ ╭───╯ │ ╭───╯ │ ╭───╯ │ ╭───╯ │ ╭──╯ │ ╭────╯ │ ╭─────╯ │ ────────╮ ╭────╯ │ ╰──────────╮ ╭─────────╯ │ ╰────────╯ Residuals: │ │ ╭╮ ╭╮ │ │╰╮ ╭╮ ╭╮ ││ ╭╮ │ ╭─╮ ╭╯ │ │╰╮ ╭╯╰╮ ╭╯╰╮ ╭╯╰╮ │+ ╭──╮ ╭╯ │ │ ╰╮ ╭╯ │ │ │ │ │ │ │ │ │ │ ╭╯ │ │ │ ╭╯ ╰╮ ╭╯ ╰╮ ╭╯ ╰╮ ╭╯ ╰╮ │ │ ╰╮ ╭╯ ╰╮ ╭─╯ │ ╭╯ │ ╭╯ │ ╭╯ │ ╭─╯ │ │ ╯ │ ╭╯ │ ╭╯ │ ╭╯ │ ╭╯ │ ╭╯ │ │ │ │ ╰╮ ╭╯ ╰╮ ╭╯ ╰╮ ╭╯ ╰╮ ╭╯ ╰╮ ╭╯ ╰╮ ╭╯ ╰╮ │ │ │ │ ╭╯ │ │ │ ╭╯ │ │ │ │ │ │ │ ╭╯ ╰╮│ │ ╭╯ │╭╯ ╰╮╭╯ │ ╭╯ │ │ ╰─╯ ╰╯ ╰─╯ ╰╯ ╰╯ ╰─╯ ╰─
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Config ¶
type Config struct { // Width represents the width of the LOESS smoother in data points Width int // Jump is the number of points to skip between smoothing, Jump int // Which weight updating function should be used? Fn loess.WeightUpdate }
Config is a configuration structure
func DefaultLowPass ¶
DefaultLowPass returns the default configuration for the operation that works on the lowpass component.
func DefaultSeasonal ¶
DefaultSeasonal returns the default configuration for the operation that works on the seasonal component.
func DefaultTrend ¶
DefaultTrend returns the default configuration for the operation that works on the trend component.
type ModelType ¶
ModelType is the type of STL model we would like to perform. A STL model type is usually additive, or multiplicative, however, it can be somewhere in between. This is done by means of a Box-Cox transform (and the reverse when we're done applying STL)
func Multiplicative ¶
func Multiplicative() ModelType
Multiplicative returns a BoxCox transform that performs and unsafe transform of the input slice
func UnsafeTransform ¶
UnsafeTransform creates a transformation function that is somewhere between an additive and multiplicative model
type Opt ¶
type Opt func(*state)
Opt is a function that helps build the conf
func WithLowpassConfig ¶
WithLowpassConfig configures the operation that performs the lowpass filter in the decomposition process
func WithRobustIter ¶
WithRobustIter indicates how many iterations of "robust" (i.e. outlier removal) to do. The default is 0.
func WithSeasonalConfig ¶
WithSeasonalConfig configures the seasonal component of the decomposition process.
func WithTrendConfig ¶
WithTrendConfig configures the trend component of the decomposition process.