golang中关于dataFrame聚合数据类型的使用

golang中关于dataFrame聚合数据类型的使用,第1张

一·数据结构及其功能介绍

dataframe主要是以二维的数据结构形式展现,突出一点比较像数据库中的表格,可以自定义一些虚拟字段,有自己的行和列,配合自带的一些函数可以对于数据进行较为复杂过滤和聚合。

二·使用详解  1· 如其名,整个的数据都承托在其dataframe这个数据结构上,依靠着这个数据结构来构建过滤的结果集或者其他的数据源。

2.初始化一个dataframe
//直接.New就可以初始化一个简单的dataFrame结构	
a:=dataframe.New(
//series.New(value,type,colName) 
//value是你要输入进来的列中的值,从左到右依次对应着dataframe中从上到下
//type是你初始化的值的数据类型int,float..
//colName是这个列的名称
		series.New([]int{1,2,3,4,5}, series.Int, "Id"),
		series.New([]string{"xiaoming","xiaojun","xiaohong","xiaoli","xiaolan"}, series.String, "Name"),
		series.New([]int{12,14,21,17,20}, series.Int, "age"),
		series.New([]string{"China","China","China","China","China"}, series.String, "contry"),
	)
3.dataframe的遍历

直接正常的for循环即可,但是有一点需要注意,我们的dataframe是个虚拟的表形式,

所以你无法直接对它进行遍历,我们知道go中的有个map的数据结构,而且dataframe也提供图化的函数即  dataframe.map()  可直接图化对其遍历。

	for key,value :=range a.Maps(){
		fmt.Println("key :",key)
		fmt.Println("value :",value)
	}

 可以看到Key是它自增的序号,在最上面的图中我们可以看到的,Value是这个dataframe的每一行,并且每一行都存在一个map中。

4·过滤聚合数据

分组聚合:首先我们说说如何分组聚合,其实处理大批量的数据时候,如果我们在DB中聚合对整体的性能会有一定的影响,在业务逻辑中进行聚合,必定少不了多次的遍历,然后使用多个结构体,效率自然也会降低不少,所以dataframe提供了一个groupby函数,有一点需要知道我们通过groupby的函数返回的是一个group的指针,其中包含着分组的信息,分组的列名,等等,所以我们需要借用一个函数,GetGroups() 这样就可以正确拿到所有的分组信息了由于dataframe已经用map来接收结果集了,无需我们后续 *** 作。   例子中以age进行了分组,当然也可以传入多组列名进行groupby。

	a:=dataframe.New(
		series.New([]int{1,2,3,4,5}, series.Int, "Id"),
		series.New([]string{"xiaoming","xiaojun","xiaohong","xiaoli","xiaolan"}, series.String, "Name"),
		series.New([]int{12,20,17,17,20}, series.Int, "age"),
		series.New([]string{"China","China","China","China","China"}, series.String, "contry"),
	)
b:=a.GroupBy("age").GetGroups()
type Groups struct {
	groups      map[string]DataFrame
	colnames    []string
	aggregation DataFrame
	Err         error
}

结果如下:

如图所示根据age进行了分组。 

过滤:dataframe提供的过滤函数较为丰富,并且易于使用。主要说下FilterAggregation

这个函数,通过看它的源码,主要传两个参数,一个是过滤条件的关联类型,是“且”还是“或
”;这里的第二个参数其实一个结构体,它包含了过滤条件所在列,列的名称,要过滤列使用的条件符号,以及过滤值,如下所示。这里我们以过滤年龄低于15岁为条件举例。

//解释一下参数1的作用,就是选择多个筛选条件的关联关系是且还是或,在源码中也有体现。
//ColName要进行过滤的列名,Comparator过滤条件> < = != 等等,Comparando是过滤的数值
filterAge:= a.FilterAggregation(1,dataframe.F{
		Colname: "age",
		Comparator: series.Greater,
		Comparando:  "15",
	})

参数1的源码:

switch agg {
//0代表或  1代表且
			case Or:
				res[j] = res[j] || nextRes[j]
			case And:
				res[j] = res[j] && nextRes[j]
			default:
				panic(agg)
			}

参数结构体F的源码:

type F struct {
	Colidx     int
	Colname    string
	Comparator series.Comparator
	Comparando interface{}
}
5·数据列求和

非常的简单,直接利用sum函数即可。

	新的dataframe:=  你的dataFrame.Col("求和的列名").Sum()
6·获取列名,列类型
	a:=dataframe.New(
		series.New([]int{1,2,3,4,5}, series.Int, "Id"),
		series.New([]string{"xiaoming","xiaojun","xiaohong","xiaoli","xiaolan"}, series.String, "Name"),
		series.New([]int{12,20,17,17,20}, series.Int, "age"),
		series.New([]string{"China","China","China","China","China"}, series.String, "contry"),
	)
	e:= a.Names()
f:=a.Col("age").Type()

这里说下用dataframe去.names得到的是所有的列名,也可以获取所求列的数据类型,非常的简便易懂。

三·总结

dataframe这个函数在golang方面在业务层进行简单或中等的数据筛选或者分组过滤是非常的简便有效的,其中也包括leftjoin,rightjoin等等连表 *** 作函数,如果了解了以上内容,都是非常的轻松使用其所包含的函数,可以说是golang版的pandas,上述内容如有错误,欢迎指正。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/994284.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存