diff --git a/formula/max.go b/formula/max.go new file mode 100644 index 0000000000000000000000000000000000000000..c00d93f41ca5746e7f5733eaca84ba8234fb5d3f --- /dev/null +++ b/formula/max.go @@ -0,0 +1,12 @@ +package formula + +import ( + "gitee.com/quant1x/pandas" + "gitee.com/quant1x/pandas/stat" +) + +func MAX(S1, S2 pandas.Series) pandas.Series { + d := stat.Maxinum(S1.Float(), S2.Float()) + return pandas.NewSeries(pandas.SERIES_TYPE_FLOAT32, "", d) + +} diff --git a/formula/max_test.go b/formula/max_test.go new file mode 100644 index 0000000000000000000000000000000000000000..79a109d786ae16a73d57443722808afdd126b267 --- /dev/null +++ b/formula/max_test.go @@ -0,0 +1,15 @@ +package formula + +import ( + "fmt" + "gitee.com/quant1x/pandas" + "testing" +) + +func TestMax(t *testing.T) { + f1 := []float32{1.1, 2.2, 1.3, 1.4} + f2 := []float32{1.2, 1.2, 3.3} + s1 := pandas.NewSeries(pandas.SERIES_TYPE_FLOAT64, "x1", f1) + s2 := pandas.NewSeries(pandas.SERIES_TYPE_FLOAT64, "x2", f2) + fmt.Println(MAX(s1, s2)) +} diff --git a/generic.go b/generic.go index c03103806701192b1ed36cd0743b030e6fce485a..87479e90f2e5062d045dbca664955c54b0b7389c 100644 --- a/generic.go +++ b/generic.go @@ -151,6 +151,10 @@ func (self *NDFrame) NaN() any { } } +func (self *NDFrame) Float() []float32 { + return ToFloat32(self) +} + func (self *NDFrame) Empty() Series { var frame NDFrame if self.type_ == SERIES_TYPE_STRING { diff --git a/series.go b/series.go index e4afc96ae19cc650921d3a27fc0816f0855315c8..2820de3bd107876990e9c634c6fb8f6107efc63d 100644 --- a/series.go +++ b/series.go @@ -37,7 +37,8 @@ type Series interface { // NaN 输出默认的NaN NaN() any - + // Float 强制转成[]float32 + Float() []float32 // sort.Interface // Len 获得行数, 实现sort.Interface接口的获取元素数量方法 diff --git a/stat/init.go b/stat/init.go new file mode 100644 index 0000000000000000000000000000000000000000..2942a6cfa7beceb3279ada4ee3b35f35533425f0 --- /dev/null +++ b/stat/init.go @@ -0,0 +1,10 @@ +package stat + +import "github.com/viterin/vek" + +// 初始化 avx2 +// 可以参考另一个实现库 gonum.org/v1/gonum/stat +func init() { + // 开启加速选项 + vek.SetAcceleration(true) +} diff --git a/stat/maxinum.go b/stat/maxinum.go new file mode 100644 index 0000000000000000000000000000000000000000..99b7f3bd438494aa8ea0a9202853d42360b4b0a8 --- /dev/null +++ b/stat/maxinum.go @@ -0,0 +1,46 @@ +package stat + +import ( + "github.com/viterin/vek" + "github.com/viterin/vek/vek32" + "unsafe" +) + +// Maxinum 两个序列横向比较最大值 +func Maxinum[T Float](f1, f2 []T) []T { + xlen := len(f1) + ylen := len(f2) + // 第找出最大长度 + + maxLength := xlen + if maxLength < ylen { + maxLength = ylen + } + + // 处理默认值 + defaultValue := typeDefault(T(0)) + // 对齐所有长度 + if xlen < maxLength { + f1 = Align(f1, defaultValue, maxLength) + } + if ylen < maxLength { + f2 = Align(f2, defaultValue, maxLength) + } + // 初始化返回值 + var s1, s2 any + s1 = f1 + s2 = f2 + + var d any + + bitSize := unsafe.Sizeof(f1[0]) + if bitSize == 4 { + d = vek32.Maximum(s1.([]float32), s2.([]float32)) + } else if bitSize == 8 { + d = vek.Maximum(s1.([]float64), s2.([]float64)) + } else { + // 应该不会走到这里 + panic("不支持其它类型") + } + return d.([]T) +} diff --git a/stat/maxinum_test.go b/stat/maxinum_test.go new file mode 100644 index 0000000000000000000000000000000000000000..dfd136d770c370ab542434c32c3bff9568d681fc --- /dev/null +++ b/stat/maxinum_test.go @@ -0,0 +1,12 @@ +package stat + +import ( + "fmt" + "testing" +) + +func TestMaxinum(t *testing.T) { + f1 := []float32{1.1, 2.2, 1.3, 1.4} + f2 := []float32{1.2, 1.2, 3.3} + fmt.Println(Maxinum(f1, f2)) +}