131 lines
3.2 KiB
Plaintext
131 lines
3.2 KiB
Plaintext
|
|
package mathUtil
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"errors"
|
|||
|
|
"math"
|
|||
|
|
"sort"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
//同时计算上中下四分位数
|
|||
|
|
func Quartile_Int(intList []int) (lowerquartile, midquartile, upperquartile float64, err error) {
|
|||
|
|
n := len(intList)
|
|||
|
|
|
|||
|
|
if n == 0 {
|
|||
|
|
err = errors.New("List is empty")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//长度大于等于2的情况
|
|||
|
|
//排序 升序
|
|||
|
|
sort.Ints(intList)
|
|||
|
|
lowerquartile, err = Quartile_Int_Lower(intList, true)
|
|||
|
|
if err != nil {
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
midquartile, err = Quartile_Int_Mid(intList, true)
|
|||
|
|
if err != nil {
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
upperquartile, err = Quartile_Int_Upper(intList, true)
|
|||
|
|
if err != nil {
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 计算整数数组下四分为数据
|
|||
|
|
func Quartile_Int_Lower(intList []int, isSorted bool) (lowerquartile float64, err error) {
|
|||
|
|
n := len(intList)
|
|||
|
|
|
|||
|
|
if n == 0 {
|
|||
|
|
err = errors.New("List is empty")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
//如果长度为1,则上、中、下四分为数都等于该值
|
|||
|
|
if n == 1 {
|
|||
|
|
lowerquartile = float64(intList[0])
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
//长度大于等于2的情况
|
|||
|
|
//排序 升序 ,如果数据没有排序,则排序
|
|||
|
|
if !isSorted {
|
|||
|
|
sort.Ints(intList)
|
|||
|
|
}
|
|||
|
|
//计算下四分位数位置
|
|||
|
|
lowerPosition := 1 + float64(n-1)*0.25
|
|||
|
|
intPart, deciPart := math.Modf(lowerPosition)
|
|||
|
|
//将整数部分转换为int类型,成为取数据的索引
|
|||
|
|
index := int(intPart)
|
|||
|
|
if index < 1 || index > n-1 {
|
|||
|
|
err = errors.New("Quartile_Int_Lower Index Out of Range")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
lowerquartile = float64(intList[index-1])*(1-deciPart) + float64(intList[index])*deciPart
|
|||
|
|
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 计算整数数组中四分为数据
|
|||
|
|
func Quartile_Int_Mid(intList []int, isSorted bool) (midquartile float64, err error) {
|
|||
|
|
n := len(intList)
|
|||
|
|
|
|||
|
|
if n == 0 {
|
|||
|
|
err = errors.New("List is empty")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
//如果长度为1,则上、中、下四分为数都等于该值
|
|||
|
|
if n == 1 {
|
|||
|
|
midquartile = float64(intList[0])
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
//长度大于等于2的情况
|
|||
|
|
//排序 升序 ,如果数据没有排序,则排序
|
|||
|
|
if !isSorted {
|
|||
|
|
sort.Ints(intList)
|
|||
|
|
}
|
|||
|
|
//计算下四分位数位置
|
|||
|
|
lowerPosition := 1 + float64(n-1)*0.5
|
|||
|
|
intPart, deciPart := math.Modf(lowerPosition)
|
|||
|
|
//将整数部分转换为int类型,成为取数据的索引
|
|||
|
|
index := int(intPart)
|
|||
|
|
if index < 1 || index > n-1 {
|
|||
|
|
err = errors.New("Quartile_Int_Mid Index Out of Range")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
midquartile = float64(intList[index-1])*(1-deciPart) + float64(intList[index])*deciPart
|
|||
|
|
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 计算整数数组上四分为数据
|
|||
|
|
func Quartile_Int_Upper(intList []int, isSorted bool) (upperquartile float64, err error) {
|
|||
|
|
n := len(intList)
|
|||
|
|
|
|||
|
|
if n == 0 {
|
|||
|
|
err = errors.New("List is empty")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
//如果长度为1,则上、中、下四分为数都等于该值
|
|||
|
|
if n == 1 {
|
|||
|
|
upperquartile = float64(intList[0])
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
//长度大于等于2的情况
|
|||
|
|
//排序 升序 ,如果数据没有排序,则排序
|
|||
|
|
if !isSorted {
|
|||
|
|
sort.Ints(intList)
|
|||
|
|
}
|
|||
|
|
//计算下四分位数位置
|
|||
|
|
lowerPosition := 1 + float64(n-1)*0.75
|
|||
|
|
intPart, deciPart := math.Modf(lowerPosition)
|
|||
|
|
//将整数部分转换为int类型,成为取数据的索引
|
|||
|
|
index := int(intPart)
|
|||
|
|
if index < 1 || index > n-1 {
|
|||
|
|
err = errors.New("Quartile_Int_Upper Index Out of Range")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
upperquartile = float64(intList[index-1])*(1-deciPart) + float64(intList[index])*deciPart
|
|||
|
|
|
|||
|
|
return
|
|||
|
|
}
|