-
Notifications
You must be signed in to change notification settings - Fork 1
/
avg.go
107 lines (91 loc) · 2.76 KB
/
avg.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package valuator
import (
"errors"
"log"
"reflect"
)
// Average is a interface for computed averages from collected filings
type Average interface {
AvgRevenueGrowth() float64
AvgEarningsGrowth() float64
AvgOlGrowth() float64
AvgGrossMarginGrowth() float64
AvgDebtGrowth() float64
AvgEquityGrowth() float64
AvgCashFlowGrowth() float64
AvgDividendGrowth() float64
AvgBookValueGrowth() float64
}
type averages struct {
Revenue float64 `json:"Average Revenue Growth (%)"`
Earnings float64 `json:"Average Earning Growth (%)"`
Oleverage float64 `json:"Average Operating Leverage Growth (%)"`
Margin float64 `json:"Average Gross Margin Growth (%)"`
Debt float64 `json:"Average Debt Growth (%)"`
Equity float64 `json:"Average Equity Growth (%)"`
Cf float64 `json:"Average Cash Flow Growth (%)"`
Div float64 `json:"Average Dividend Growth"`
Bv float64 `json:"Average Book Value Growth"`
}
func newAverages(m []Measures) (Average, error) {
var y []Yoy
for _, val := range m {
lvar := val.Yoy()
if !reflect.ValueOf(lvar).IsNil() {
y = append(y, lvar)
}
}
if len(y) == 0 {
log.Println("No year over year calculations found. Skipping averages")
return nil, errors.New("No YoY information found. Skipping averages")
}
avg := new(averages)
for _, val := range y {
avg.Revenue = avg.Revenue + val.RevenueGrowth()
avg.Earnings = avg.Earnings + val.EarningsGrowth()
avg.Oleverage = avg.Oleverage + val.OlGrowth()
avg.Margin = avg.Margin + val.GrossMarginGrowth()
avg.Debt = avg.Debt + val.DebtGrowth()
avg.Equity = avg.Equity + val.EquityGrowth()
avg.Cf = avg.Cf + val.CashFlowGrowth()
avg.Div = avg.Div + val.DividendGrowth()
avg.Bv = avg.Bv + val.BookValueGrowth()
}
avg.Revenue = avgCalc(avg.Revenue, float64(len(y)))
avg.Earnings = avgCalc(avg.Earnings, float64(len(y)))
avg.Oleverage = avgCalc(avg.Oleverage, float64(len(y)))
avg.Margin = avgCalc(avg.Margin, float64(len(y)))
avg.Debt = avgCalc(avg.Debt, float64(len(y)))
avg.Equity = avgCalc(avg.Equity, float64(len(y)))
avg.Cf = avgCalc(avg.Cf, float64(len(y)))
avg.Div = avgCalc(avg.Div, float64(len(y)))
avg.Bv = avgCalc(avg.Bv, float64(len(y)))
return avg, nil
}
func (a *averages) AvgRevenueGrowth() float64 {
return a.Revenue
}
func (a *averages) AvgEarningsGrowth() float64 {
return a.Earnings
}
func (a *averages) AvgOlGrowth() float64 {
return a.Oleverage
}
func (a *averages) AvgGrossMarginGrowth() float64 {
return a.Margin
}
func (a *averages) AvgDebtGrowth() float64 {
return a.Debt
}
func (a *averages) AvgEquityGrowth() float64 {
return a.Equity
}
func (a *averages) AvgCashFlowGrowth() float64 {
return a.Cf
}
func (a *averages) AvgDividendGrowth() float64 {
return a.Div
}
func (a *averages) AvgBookValueGrowth() float64 {
return a.Bv
}