java数据分析及数据可视化库tableSaw(转)
转自:https://blog.csdn.net/qq_44525150/article/details/111768704
参考:https://juejin.cn/post/6844904073670590478
配置
Tablesaw需要Java8或更新的版本。
使用Maven导入包。
<dependency> <groupId>tech.tablesaw</groupId> <artifactId>tablesaw-core</artifactId> <version>LATEST</version> </dependency>
1.表和列
Tablesaw整个都是关于表格的,而表格又是由列组成的,所以我们的学习先从列开始。
列
一个Column是一个被命名的,一维数据集,它可能是一个Table的一部分,也可能不是。一个Column中的数据必须是同一种类型。
创建一个数据列
使用DoubleColumn.create(String name,double ... arr)方法来创建一个元素类型为double的column;
根据包含元素类型的不同,还有IntColumn,StringColumn等。
double[] numbers = {1,2,3,4}; DoubleColumn nc = DoubleColumn.create("nc",numbers); // DoubleColumn nc = DoubleColumn.create("nc",1,2,3,4); 这样也是可以的 System.out.println(nc.print());
2.获取数列中的某个数据
使用 nc.get(int index)方法来获取column某个元素,index从0开始。
// 创建数据列
double[] numbers = {1,2,3,4}; DoubleColumn nc = DoubleColumn.create("nc",numbers); // index为2,所以获取到nc中的第三个元素 Double three = nc.get(2); System.out.println(three);
3.columnar operations(柱状运算)
Tablesaw中有很多针对一列数据的运算,如下面的multiply(Number value)是原来列中的每个元素都乘以value。
// 创建数据列 double[] numbers = {1,2,3,4}; DoubleColumn nc1 = DoubleColumn.create("nc",numbers); System.out.println(nc1.print()); // 使用multiply(Number value)是原来列中的每个元素都乘以value // 这个方法并不会修改nc,而是返回一个新的Column对象nc1,nc1的列名为[nc列名*value],我们可以使用 setName(String name),设置列名; DoubleColumn nc2 = nc1.multiply(8); // nc1.setName("nc2"); System.out.println(nc2.print());
4.Selections(选择项)
Selections被用来筛选表和列。我们对一个Column对象使用形如isLessThan(aNumber)方法来附加筛选条件,就可以生成一个Selection对象,一个Selection对象包含一个有序的int类型的集合,该集合包含了Column对象中满足设定条件的元素的索引。
// 创建数据列 double[] numbers = {1,2,3,4}; DoubleColumn nc1 = DoubleColumn.create("nc",numbers); // 使用isLessThan(double value)方法 获取筛选出nc中小于3的元素的Selection对象 Selection lessThanThreeSelection = nc1.isLessThan(3); //A selection maintains an ordered set of ints that can be used to eval rows from a table or column System.out.println(Arrays.toString(lessThanThreeSelection.toArray()));
5.使用where(Selection selection)方法,获取经过指定selection筛选后的Column或Table
DoubleColumn nc2 = nc1.where(lessThanThreeSelection);
System.out.println(nc2.print());
6.组合过滤器
DoubleColumn nc3 = nc1.where(nc1.isGreaterThan(1).and(nc1.isLessThan(3)));
System.out.println(nc3.print());
7.通过index选择
DoubleColumn nc4 = nc1.where(Selection.with(1, 3)); System.out.println(nc4.print()); DoubleColumn nc5 = nc1.where(Selection.withRange(1, 3)); System.out.println(nc5.print());
9.Map functions
Map functions是一些定义在columns上的方法,它们返回一个新的Columns,
之前的 Column multiply(Number value)方法就是一个有一个标量参数的map function
我们也可以使用multiply(NumberColumn numberColumn)的方法,来是两个column中的值对应相乘
DoubleColumn nc1 = DoubleColumn.create("nc",new double[]{1,2,3,4,5}); DoubleColumn nc2 = DoubleColumn.create("nc1",new double[]{1,2,3,4,5}); DoubleColumn nc3 = nc1.multiply(nc2); System.out.println(nc3.print());
Tablesaw针对各种Column类型内置了很多的map functions,下面是一些例子
StringColumn s = StringColumn.create("sc", new String[] {"foo", "bar", "baz", "foobarbaz"}); StringColumn s2 = s.copy(); // 以下方法全部都是针对StringColumn中所有字符串进行的操作 s2 = s2.replaceFirst("foo", "bar"); // 字符串替换 s2 = s2.upperCase(); // 转化成大写 s2 = s2.padEnd(5, 'x'); // 字符串的长度小于minlength(第一个参数)时,在字符串的尾部填充某字符,使其长度达到minlength s2 = s2.substring(1, 5); // 获取[1,5)子串 System.out.println(s2.print());
10.Reduce (aggregate) functions: Summarizing a column(汇总功能)
有时我们想计算一些值从某种意义上总结一列中的数据,汇总函数就是用来做这个的。
DoubleColumn nc1 = DoubleColumn.create("nc",new double[]{1,2,3,4,5}); double max = nc1.max(); // 列中的最大值 System.out.println(max); double min = nc1.min(); // 列中的最小值 System.out.println(min); double sum = nc1.sum(); // 最大值 System.out.println(sum); double stdDev = nc1.standardDeviation(); // 标准差 System.out.println(stdDev);
11.表
一个Table是一个被命名的columns的容器,虽然缺失值是允许的,但是table中所有的column的元素数量应该一样。
一个Table可以包含任何类型的columns组合。
创建Table
String[] animals = {"bear", "cat", "giraffe"}; double[] cuteness = {90.1, 84.3, 99.7}; // 使用create(String name)方法创建Table对象,使用addColumns(Column<?>...cols)方法向表中添加列 Table cuteAnimals = Table.create("Cute Animals").addColumns( StringColumn.create("Animal types", animals), DoubleColumn.create("rating", cuteness)); System.out.println(cuteAnimals.print());
11.导入数据
很多时候我们会直接从csv文件中导入数据,使用下面的语句可以很方便的从csv文件中读取一个Table对象,Tablesaw可以很好的猜测出每一列的类型,当它猜错类型或者是我们想要提高性能的时候可以指明类型。
Table bushTable = Table.read().csv("data/bush.csv");
System.out.println(bushTable.print());
12.浏览Tables
Tablesaw提供了一些方法,让帮助我们了解新数据集的结构,形状等信息。
Table的结构(列名,列类型)
Table bushTable = Table.read().csv("data/bush.csv");
System.out.println(bushTable.structure());
//Table的形状(rows*cols) System.out.println(bushTable.shape());
System.out.println(bushTable.first(3));
System.out.println(bushTable.last(3));
//Table的toString()方法也表示为上面那种表格的形式 Table bushTable = Table.read().csv("data/bush.csv"); // 默认只显示20rows,其他数据会省略; System.out.println(bushTable.toString()); // 我们可以使用printAll()来打印所有的数据 System.out.println(bushTable.printAll()); // 也可以使用print(int rowLimit)来指定打印的行数 System.out.println(bushTable.print(100));
13.处理表中的column
//构造表 Table table = Table.create("table").addColumns(IntColumn.create("col1", 1, 2, 3, 4, 5), IntColumn.create("col2", 2, 4, 6, 8, 0), IntColumn.create("col3", 3, 6, 9, 12, 13)); System.out.println(table); // 移除列 // 移除 名字为"col1"的列 table.removeColumns("col1"); System.out.println(table); // 只保留 名字为"col2"的列 table.retainColumns("col2"); System.out.println(table); // 添加列 table.addColumns(IntColumn.create("col4", 4, 8, 12, 16, 20)); System.out.println(table);
14.从table中获取特定类型的column
Table studentTable = Table.create("student").addColumns(IntColumn.create("id", 20200001, 20200002, 20200003, 20200004, 20200005), StringColumn.create("name", "Jim", "Bob", "John", "lily", "lucy")); // column(String colName)方法,通过列名获取指定列,不区分大小写 Column<?> idCol1 = studentTable.column("id"); System.out.println(idCol1.print()); // column(int colIndex)方法,通过索引获取指定列,索引从0开始 Column<?> idCol2 = studentTable.column(0); System.out.println(idCol2.print()); // System.out.println(idCol1 == idCol2); // true // 上面的方法返回的都是Column<?>类型,必要时需要转换成特定的类型 // 1.强制类型转换 IntColumn idCol3 = (IntColumn) studentTable.column("id"); // 2.使用numberColumn(),stringColumn()等方法 NumericColumn<?> idColumn = studentTable.numberColumn("id");
15.处理行
//删除行 Table studentTable = Table.create("student").addColumns(IntColumn.create("id", 20200001, 20200001, 20200002, 20200003, 20200004, 20200005), StringColumn.create("name", "Jim", "Jim", "Bob", "John", "lily", "lucy")); System.out.println(studentTable.print()); // drop...()方法不在原表上修改,而是先创建一个和原表结构一样的空表,然后把不需要删除的行放到新的而表中,然后返回新的表。 Table table1 = studentTable.dropDuplicateRows(); System.out.println(table1.print()); Table table2 = studentTable.dropWhere(studentTable.numberColumn(0).isLessThan(20200003)); System.out.println(table2); //增加行 // 修改原表 studentTable.addRow(0, studentTable);
16.随机抽样
Table table3 = studentTable.sampleN(3); System.out.println(table3.print()); //我们也可以对表中的行执行任意的操作 // 遍历表中的行,并执行操作 for (Row r : studentTable) { System.out.println("学号:" + r.getString(1) + ":" + r.getString(1)); } // 另外一种实现形式 studentTable.stream().forEach(row -> { System.out.println("学号:" + row.getString(1) + ":" + row.getString(1)); });
17.table排序
Table studentTable = Table.create("student").addColumns(IntColumn.create("id", 20200001,20200002, 20200003, 20200004, 20200005), StringColumn.create("name", "Jim", "Bob", "John", "lily", "lucy")); // 升序 studentTable = studentTable.sortOn("id", "name");// or sortAscendingOn("id","name"); System.out.println(studentTable.print()); // 降序 studentTable = studentTable.sortDescendingOn("id"); System.out.println(studentTable);
18.筛选
查询filter(过滤器)可以使用逻辑运算符or,and,not来组合,它们都在QuerySupport中实现,所以在使用前要先导入:
import static tech.tablesaw.api.QuerySupport.and; import static tech.tablesaw.api.QuerySupport.or; import static tech.tablesaw.api.QuerySupport.not; Table studentTable = Table.create("student").addColumns(IntColumn.create("id", 20200001, 20200002, 20200003, 20200004, 20200005), StringColumn.create("name", "Jim", "Bob", "John", "lily", "lucy"), IntColumn.create("age", 18, 18, 17, 16, 16)); Table result = studentTable.where(and(t -> t.numberColumn("id").isGreaterThan(20200001), t -> t.numberColumn("age").isEqualTo(18))); System.out.println(result);
19.join
//field tech.tablesaw.api.Table left = sourceConn.query(sql21, rs -> { return tech.tablesaw.api.Table.read().db(rs); }); log.info(left.printAll()); tech.tablesaw.api.Table right = sourceConn.query(sql2, rs -> { return tech.tablesaw.api.Table.read().db(rs); }); log.info(right.printAll()); // left.column("field").setName("col_name"); tech.tablesaw.api.Table result = left.joinOn("field").leftOuter(right,"col_name");
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
2019-02-10 Kafka笔记7