ssa

Форк
0
/
Movmean.go 
80 строк · 1.6 Кб
1
package movmean
2

3
import (
4
	"fmt"
5
	"math"
6
)
7

8
func Movmean(data []float64, window int) ([]float64, error) {
9
	if window <= 1 {
10
		return nil, fmt.Errorf("length of slice must be greater than 1")
11
	}
12
	if window > len(data) {
13
		return nil, fmt.Errorf("m cannot be greater than length of slice")
14
	}
15
	if window%2 == 0 {
16
		window++
17
	}
18

19
	n := len(data)
20
	M := make([]float64, n)
21

22
	for i := 0; i < n; i++ {
23
		sum := 0.0
24
		count := 0
25

26
		for j := i - window/2; j < i+window/2+1; j++ {
27
			if j >= 0 && j < len(data) {
28
				// fmt.Println(data[j])
29
				sum += data[j]
30
				count++
31
			}
32
		}
33

34
		// fmt.Println(i, "<>", i-window/2, ":", i+window/2, "//", sum, float64(count))
35
		// fmt.Println()
36

37
		// for j := i - window + 1; j <= i; j++ {
38
		// 	if j >= 0 && j < n {
39
		// 		sum += data[j]
40
		// 		count++
41
		// 	}
42
		// }
43

44
		M[i] = sum / float64(count)
45
	}
46

47
	return M, nil
48
}
49
func MovMeanStd(ts []float64, m int) ([]float64, []float64, error) {
50
	if m <= 1 {
51
		return nil, nil, fmt.Errorf("length of slice must be greater than 1")
52
	}
53

54
	if m > len(ts) {
55
		return nil, nil, fmt.Errorf("m cannot be greater than length of slice")
56
	}
57

58
	var i int
59

60
	c := make([]float64, len(ts)+1)
61
	csqr := make([]float64, len(ts)+1)
62
	for i = 0; i < len(ts)+1; i++ {
63
		if i == 0 {
64
			c[i] = 0
65
			csqr[i] = 0
66
		} else {
67
			c[i] = ts[i-1] + c[i-1]
68
			csqr[i] = ts[i-1]*ts[i-1] + csqr[i-1]
69
		}
70
	}
71

72
	mean := make([]float64, len(ts)-m+1)
73
	std := make([]float64, len(ts)-m+1)
74
	for i = 0; i < len(ts)-m+1; i++ {
75
		mean[i] = (c[i+m] - c[i]) / float64(m)
76
		std[i] = math.Sqrt((csqr[i+m]-csqr[i])/float64(m) - mean[i]*mean[i])
77
	}
78

79
	return mean, std, nil
80
}
81

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.