golang提供Go统计处理、结构体与测量方法的插件库gosh的使用
Go Statistics Handler (gosh) 使用指南
关于 gosh
gosh
是 Go Statistics Handler 的缩写- 该库提供以下功能:
- Go 运行时统计数据结构
- Go 运行时统计 API 处理器
- Go 运行时测量方法
- 可以指定喜欢的 JSON 编码器:
encoding/json
包goccy/go-json
包- 或者你自己创建的编码器包
安装
$ go get github.com/osamingo/gosh@latest
使用示例
基础示例
package main
import (
"encoding/json"
"io"
"log"
"net/http"
"github.com/osamingo/gosh"
)
func main() {
// 创建一个新的统计处理器,使用标准库的json编码器
h, err := gosh.NewStatisticsHandler(func(w io.Writer) gosh.JSONEncoder {
return json.NewEncoder(w)
})
if err != nil {
log.Fatalln(err)
}
// 设置HTTP路由
mux := http.NewServeMux()
mux.Handle("/healthz", h) // 将统计处理器挂载到/healthz路径
// 启动HTTP服务器
if err := http.ListenAndServe(":8080", mux); err != nil {
log.Fatalln(err)
}
}
输出示例
启动服务后,可以通过curl获取统计信息:
$ curl "localhost:8080/healthz" | jq .
{
"timestamp": 1527317620,
"go_version": "go1.10.2",
"go_os": "darwin",
"go_arch": "amd64",
"cpu_num": 8,
"goroutine_num": 6,
"gomaxprocs": 8,
"cgo_call_num": 1,
"memory_alloc": 422272,
"memory_total_alloc": 422272,
"memory_sys": 3084288,
"memory_lookups": 6,
"memory_mallocs": 4720,
"memory_frees": 71,
"stack_inuse": 491520,
"heap_alloc": 422272,
"heap_sys": 1605632,
"heap_idle": 401408,
"heap_inuse": 1204224,
"heap_released": 0,
"heap_objects": 4649,
"gc_next": 4473924,
"gc_last": 0,
"gc_num": 0,
"gc_per_second": 0,
"gc_pause_per_second": 0,
"gc_pause": []
}
许可证
该项目使用 MIT 许可证。
更多关于golang提供Go统计处理、结构体与测量方法的插件库gosh的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang提供Go统计处理、结构体与测量方法的插件库gosh的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Go统计处理与测量方法库gosh使用指南
gosh是一个Go语言统计处理库,提供了丰富的统计计算、结构体操作和测量方法功能。下面我将详细介绍gosh的主要功能和使用方法。
1. 安装gosh
首先安装gosh库:
go get github.com/mohae/gosh
2. 基本统计功能
2.1 描述性统计
package main
import (
"fmt"
"github.com/mohae/gosh/stats"
)
func main() {
data := []float64{1.2, 2.3, 3.4, 4.5, 5.6}
// 计算平均值
mean := stats.Mean(data)
fmt.Printf("平均值: %.2f\n", mean)
// 计算中位数
median := stats.Median(data)
fmt.Printf("中位数: %.2f\n", median)
// 计算标准差
stdDev := stats.StdDev(data)
fmt.Printf("标准差: %.2f\n", stdDev)
// 计算方差
variance := stats.Variance(data)
fmt.Printf("方差: %.2f\n", variance)
}
2.2 统计测量
// 计算百分位数
percentile := stats.Percentile(data, 75)
fmt.Printf("75百分位数: %.2f\n", percentile)
// 计算四分位距
iqr := stats.IQR(data)
fmt.Printf("四分位距: %.2f\n", iqr)
// 计算偏度
skewness := stats.Skewness(data)
fmt.Printf("偏度: %.2f\n", skewness)
3. 结构体统计处理
gosh提供了对结构体集合的统计处理功能:
type Person struct {
Name string
Age int
Height float64
}
func main() {
people := []Person{
{"Alice", 25, 165.2},
{"Bob", 30, 175.5},
{"Charlie", 35, 180.1},
{"David", 40, 172.8},
}
// 提取结构体字段进行统计
ages := stats.ExtractField(people, "Age")
heights := stats.ExtractField(people, "Height")
fmt.Println("年龄统计:")
fmt.Printf("平均年龄: %.1f\n", stats.Mean(ages))
fmt.Println("\n身高统计:")
fmt.Printf("最大身高: %.1f\n", stats.Max(heights))
fmt.Printf("最小身高: %.1f\n", stats.Min(heights))
}
4. 概率分布
gosh支持多种概率分布计算:
// 正态分布计算
norm := stats.NewNormal(0, 1) // 均值0,标准差1
p := norm.CDF(1.96) // P(X ≤ 1.96)
fmt.Printf("标准正态分布P(X≤1.96): %.4f\n", p)
// 泊松分布
poisson := stats.NewPoisson(3.5) // λ=3.5
p = poisson.Probability(4) // P(X=4)
fmt.Printf("泊松分布P(X=4): %.4f\n", p)
5. 假设检验
// t检验示例
sample1 := []float64{1.2, 1.5, 1.7, 1.9, 2.1}
sample2 := []float64{1.8, 2.0, 2.2, 2.4, 2.6}
tTest := stats.NewTTest(sample1, sample2)
pValue := tTest.PValue()
fmt.Printf("t检验p值: %.4f\n", pValue)
if pValue < 0.05 {
fmt.Println("差异显著")
} else {
fmt.Println("差异不显著")
}
6. 回归分析
// 简单线性回归
x := []float64{1, 2, 3, 4, 5}
y := []float64{2, 4, 5, 4, 5}
reg := stats.NewLinearRegression(x, y)
slope := reg.Slope()
intercept := reg.Intercept()
rSquared := reg.RSquared()
fmt.Printf("回归方程: y = %.2fx + %.2f\n", slope, intercept)
fmt.Printf("R平方: %.4f\n", rSquared)
7. 时间序列分析
// 移动平均
series := []float64{10, 12, 14, 16, 18, 20, 22, 24, 26, 28}
window := 3
ma := stats.MovingAverage(series, window)
fmt.Println("移动平均结果:", ma)
8. 高级功能
8.1 数据分组统计
type Product struct {
Category string
Price float64
}
products := []Product{
{"Electronics", 999.99},
{"Electronics", 799.99},
{"Clothing", 49.99},
{"Clothing", 29.99},
{"Food", 5.99},
}
// 按类别分组统计价格
groupStats := stats.GroupBy(products, "Category", "Price")
for category, stat := range groupStats {
fmt.Printf("%s - 平均价格: %.2f, 数量: %d\n",
category, stat.Mean(), stat.Count())
}
8.2 数据标准化
data := []float64{10, 20, 30, 40, 50}
// Z-score标准化
normalized := stats.ZScoreNormalization(data)
fmt.Println("标准化数据:", normalized)
// Min-Max标准化
scaled := stats.MinMaxScaling(data)
fmt.Println("归一化数据:", scaled)
9. 性能考虑
gosh针对大数据集进行了优化,但对于极大数据集,建议:
- 使用流式统计方法
- 分批处理数据
- 并行计算
// 并行计算示例
var wg sync.WaitGroup
results := make(chan float64, 2)
data := make([]float64, 1000000) // 大数据集
// 填充数据...
wg.Add(2)
go func() {
defer wg.Done()
results <- stats.Mean(data[:500000])
}()
go func() {
defer wg.Done()
results <- stats.Mean(data[500000:])
}()
go func() {
wg.Wait()
close(results)
}()
var total float64
count := 0
for m := range results {
total += m
count++
}
finalMean := total / float64(count)
fmt.Println("并行计算的平均值:", finalMean)
10. 错误处理
// 处理空数据
emptyData := []float64{}
mean, err := stats.SafeMean(emptyData)
if err != nil {
fmt.Println("计算平均值错误:", err)
} else {
fmt.Println("平均值:", mean)
}
gosh库提供了丰富的统计功能,从基本的描述性统计到高级的统计模型都有涵盖。通过结构体处理功能,可以方便地对业务数据进行统计分析。使用时请根据具体需求选择合适的统计方法,并注意数据的预处理和结果解释。