Spring Boot集成tablesaw插件快速入门

1 什么是tablesaw?

Tablesaw是一款Java的数据可视化库,主要包括两部分:

  • 数据解析库,主要用于加载数据,对数据进行操作(转化,过滤,汇总等),类比Python中的Pandas库;

  • 数据可视化库,将目标数据转化为可视化的图表,类比Python中的Matplotlib库。

与Pandas不同的是,Tablesaw中的表格以列(Column)为基本单位,因此大部分操作都是基于列进行的。当然也包括部分对行操作的函数,但是功能比较有限

1.1 tablesaw目录说明

  1. aggregate:maven 的项目父级项目,主要定义项目打包的配置。

  2. beakerx:tablesaw 库的注册中心,主要注册表和列。

  3. core:tablesaw 库的核心代码,主要是数据的加工处理操作:数据的追加,排序,分组,查询等。

  4. data:项目测试数据目录。

  5. docs:项目 MarkDown 文档目录。

  6. docs-src:项目文档源码目录,主要作用是生成 MarkDown 文档。

  7. excel:解析 excel 文件数据的子项目。

  8. html:解析 html 文件数据的子项目。

  9. json:解析 json 文件数据的子项目。

  10. jsplot:数据可视化的子项目,主要作用加载数据生成可视化图表。

  11. saw:tablesaw 读写图表数据的子项目。

2 环境准备

2.1 数据库安装

数据库安装这里不做详细阐述,小伙伴们可自行安装,在docker环境下可执行:

docker run --name docker-mysql-5.7 -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7

2.2 数据库表初始化


create database springboot_demo;
create table user_info
(
user_id     varchar(64)          not null primary key,
username    varchar(100)         null ,
age         int(3)               null ,
gender      tinyint(1)           null ,
remark      varchar(255)         null ,
create_time datetime             null ,
create_id   varchar(64)          null ,
update_time datetime             null ,
update_id   varchar(64)          null ,
enabled     tinyint(1) default 1 null
);
INSERT INTO springboot_demo.user_info
(user_id, username, age, gender, remark, create_time, create_id, update_time, update_id, enabled)
VALUES('1', '1', 1, 1, '1', NULL, '1', NULL, NULL, 1);

3 代码demo

3.1 完成目标

利用tablesaw加工和处理二维数据,并且可视化

3.2 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springboot-demo</artifactId>
        <groupId>com.wkf</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>tablesaw</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>tech.tablesaw</groupId>
            <artifactId>tablesaw-core</artifactId>
            <version>0.43.1</version>
        </dependency>
        <dependency>
            <groupId>tech.tablesaw</groupId>
            <artifactId>tablesaw-jsplot</artifactId>
            <version>0.43.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.29</version>
        </dependency>
    </dependencies>
</project>

3.3 application.yaml

server:
  port: 8088
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.zaxxer.hikari.HikariDataSource
    url: jdbc:mysql://127.0.0.1:3305/springboot_demo?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: 123456

3.4 读取csv数据

    @Before
    public void before() {
        log.info("init some data");
        tornadoes = Table.read().csv("D:/gitProject/springboot-demo/tablesaw/src/main/resources/data/tornadoes_1950-2014.csv");
    }

3.5 打印列名

    @Test
    public void columnNames() {
        System.out.println(tornadoes.columnNames());
    }

运行效果:

在这里插入图片描述

3.6 查看shape

    @Test
    public void shape() {
        System.out.println(tornadoes.shape());
    }

运行效果:

在这里插入图片描述

3.7 查看表结构

    @Test
    public void structure() {
        System.out.println(tornadoes.structure().printAll());
    }

运行效果:

在这里插入图片描述

3.8 查看数据

    @Test
    public void show() {
        System.out.println(tornadoes);
    }

运行效果:

在这里插入图片描述

3.9 表结构过滤

    @Test
    public void structurefilter() {
        System.out.println( tornadoes
                .structure()
                .where(tornadoes.structure().stringColumn("Column Type").isEqualTo("DOUBLE")));

    }

运行效果:

在这里插入图片描述

3.10 预览数据

	@Test
    public void previewdata() {
        System.out.println(tornadoes.first(3));
    }

运行效果:

在这里插入图片描述

3.11 列操作

    @Test
    public void ColumnOperate() {
        StringColumn month = tornadoes.dateColumn("Date").month();
        tornadoes.addColumns(month);
        System.out.println(tornadoes.first(3));
        tornadoes.removeColumns("State No");
        System.out.println(tornadoes.first(3));

    }

运行效果:

在这里插入图片描述

3.12 排序

    @Test
    public void sort() {
        tornadoes.sortOn("-Fatalities");
        System.out.println(tornadoes.first(20));
    }

运行效果:

在这里插入图片描述

3.13 summary

    @Test
    public void summary() {
        System.out.println( tornadoes.column("Fatalities").summary().print());
    }

运行效果:

在这里插入图片描述

3.14 数据过滤

    @Test
    public void filter() {
        Table result = tornadoes.where(tornadoes.intColumn("Fatalities").isGreaterThan(0));
        result = tornadoes.where(result.dateColumn("Date").isInApril());
        result =
                tornadoes.where(
                        result
                                .intColumn("Width")
                                .isGreaterThan(300) // 300 yards
                                .or(result.doubleColumn("Length").isGreaterThan(10))); // 10 miles

        result = result.select("State", "Date");
        System.out.println(result);
    }

运行效果:

在这里插入图片描述

3.15 写入文件

    @Test
    public void write() {
        tornadoes.write().csv("rev_tornadoes_1950-2014-test.csv");
    }

3.16 从mysql读取数据

    @Resource
    private JdbcTemplate jdbcTemplate;
    
    @Test
    public void dataFromMySql() {
        Table table = jdbcTemplate.query("SELECT  user_id,username,age from user_info", resultSet -> {
            return Table.read().db(resultSet);
        });
        System.out.println(table);
    }

运行效果:

在这里插入图片描述

3.17 数据可视化

package com.wkf.tablesaw;

import tech.tablesaw.api.Table;
import tech.tablesaw.plotly.Plot;
import tech.tablesaw.plotly.api.BubblePlot;
import tech.tablesaw.plotly.components.Figure;

import java.io.IOException;

/**
 * @author wuKeFan
 * @date 2024-06-13 09:57:07
 */
public class BubbleExample {

    public static void main(String[] args) throws IOException {

        Table wines = Table.read().csv("D:/gitProject/springboot-demo/tablesaw/src/main/resources/data/tornadoes_1950-2014.csv");

        Table champagne =
                wines.where(
                        wines
                                .stringColumn("wine type")
                                .isEqualTo("Champagne & Sparkling")
                                .and(wines.stringColumn("region").isEqualTo("California")));

        Figure figure =
                BubblePlot.create(
                        "Average retail price for champagnes by year and rating",
                        champagne, // table namex
                        "highest pro score", // x variable column name
                        "year", // y variable column name
                        "Mean Retail" // bubble size
                );

        Plot.show(figure);
    }

}

结果如下图:

在这里插入图片描述

4 代码仓库

https://github.com/363153421/springboot-demo/tree/master/tablesaw

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/727777.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM中的垃圾回收机制

文章目录 什么是垃圾为什么需要垃圾回收早期垃圾回收Java的垃圾回收机制垃圾回收主要关注的区域垃圾判定算法引用计数算法可达性分析算法 垃圾收集算法标记清除算法复制算法标记整理算法分代收集思想增量收集算法分区算法 什么是垃圾 垃圾回收&#xff08;Garbage Collection&…

Java面试八股之Mybatis和JPA的区别

Mybatis和JPA的区别 Mybatis 和 JPA&#xff08;Java Persistence API&#xff09;是两种在 Java 应用程序中用于数据持久化的框架&#xff0c;它们各有特点和适用场景。下面是它们之间的一些主要区别&#xff1a; 映射方式&#xff1a; Mybatis 是半自动的 ORM 框架&#xf…

Vue66-vue-默认插槽

一、默认插槽需求 1-1、原本的写法&#xff1a; 在每个category组件中用v-show来做条件渲染&#xff0c;但是不方便&#xff01; 1-2、默认插槽 img标签&#xff0c;ul标签&#xff0c;video标签&#xff0c;都是在app组件中完成解析之后&#xff0c;塞到category组件中的&…

实验室装修公司教你:真菌实验室设计建设的必备技巧

在当今的科学研究和生物技术领域&#xff0c;真菌实验室设计建设显得尤为重要。然而&#xff0c;很多实验室在实际操作中常常面临空间布局不合理、设备配置不当以及环境控制不到位等诸多挑战&#xff0c;导致实验效率低下&#xff0c;甚至危及人员安全。那么要怎么才能设计建设…

【Unity】AssetBundle打包策略

【Unity】AssetBundle打包策略 在游戏开发过程中&#xff0c;AssetBundle(AB)打包策略的重要性不容忽视。游戏开发者往往手动设置游戏资源包名进行管理&#xff0c;难免会造成资源确实或导致冗余&#xff0c;因此对于AB包的打包流程来说&#xff0c;进行策略管理显得十分重要。…

卓越的 App UI 风格引领潮流

卓越的 App UI 风格引领潮流

fastadmin多语言切换设置

fastadmin版本&#xff1a;1.4.0.20230711 以简体&#xff0c;繁体&#xff0c;英文为例 一&#xff0c;在application\config.php 里开启多语言 // 是否开启多语言lang_switch_on > true, // 允许的语言列表allow_lang_list > [zh-cn, en,zh-tw], 二…

Linux环境编程基础学习2

For循环累加求和&#xff0c;两种方式&#xff0c;c方式的运算更快 打开文件操作 cat操作的实现 EOF: 1.diff A B比较两个文件是否一样&#xff0c;一样则什么结果都没有 Od -c 文件名可以显示出文件中的不可见字符

Stable Diffusion WebUI 使用ControlNet:IP-Adapter保持生图的角色一致性

IP-Adapter-FaceID可以在保持人脸一致的条件下生成各种风格的图像。 下载 IP Adapter 需要的 Face ID 模型和 Lora 下载地址&#xff1a;https://huggingface.co/h94/IP-Adapter-FaceID/ 下载 ip-adapter-faceid-plusv2_sd15.bin 和 ip-adapter-faceid-plusv2_sd15_lora.saf…

Linux:文件描述符

文件描述符实际上就是一个小整数 0 & 1 & 2 Linux进程默认情况下会有3个缺省打开的文件描述符&#xff0c;分别是标准输入0&#xff0c; 标准输出1&#xff0c; 标准错误2. 0,1,2对应的物理设备一般是&#xff1a;键盘&#xff0c;显示器&#xff0c;显示器 所以输入输…

SpingBoot快速入门下

响应HttpServietResponse 介绍 将ResponseBody 加到Controller方法/类上 作用&#xff1a;将方法返回值直接响应&#xff0c;如果返回值是 实体对象/集合&#xff0c;将会自动转JSON格式响应 RestController Controller ResponseBody; 一般响应 统一响应 在实际开发中一般…

多线程下JVM内存模型 和 volatile关键字

1、线程的概念 线程&#xff08;thread&#xff09;是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流&#xff0c;一个进程中可以并发多个线程&#xff0c;每条线程并行执行不同的任务…

20240620每日一题-测试瓶子的硬度

小明用2个玻璃瓶&#xff0c;在总高88层大楼测试瓶子硬度&#xff0c;拿1个瓶子从某层摔下去&#xff0c;瓶子没摔碎&#xff0c;到更高层去摔&#xff0c;如果碎了&#xff0c;拿另1瓶子到更低层摔 问测试出瓶子最大硬度最少摔几次&#xff1f; 分析 1只有1个瓶子 为了保证…

C语言数据存储大小端问题

大小端 什么是大小端 大端模式&#xff08;Big-endian&#xff09;&#xff0c;是指数据的高字节&#xff0c;保存在内存的低地址中&#xff0c;而数据的低字节&#xff0c;保存在内存的高地址中; 小端模式&#xff08;Little-endian&#xff09;&#xff0c;是指数据的高字…

静态网页处理复杂请求

目录 1.定制请求头 (1)&#xff0e;查看请求头 (2)&#xff0e;设置请求头 2.验证 Cookie 3.保持会话 4. SSL 证书验证 在互联网中&#xff0c;网页中的内容是千变万化的&#xff0c;如果只根据请求 URL 发送基本请求&#xff0c;则可能 无法获取网站的响应数据&#xff0…

基 CanMV 的 C 开发环境搭建(Linux,Ubuntu篇)

不论是使用 CanMV 提供的基于 C 语言和 FreeRTOS 的应用开发方式开发应用程序或是编译 CanMV 固件&#xff0c;都需要搭建基于 CanMV 的 C 开发环境&#xff0c;用于编译 CanMV 源码。 1. 开发环境搭建说明 CanMV 提供了基于 C 语言和 FreeRTOS 的应用开发…

如何调用讯飞星火认知大模型的API以利用其卓越功能

摘要 讯飞星火认知大模型&#xff0c;作为科大讯飞精心打造的一款人工智能模型&#xff0c;在自然语言理解和生成方面展现出了卓越的能力。这款模型通过深度学习技术和大量数据的训练&#xff0c;具备了强大的语言理解、文本生成和对话交互等功能。 一、模型功能概述 讯飞星…

XXL-Job实战(一)

​需求介绍&#xff1a;构建一个分布式短信发送系统&#xff0c;应对双十一活动需向1000万用户快速推送营销短信的挑战&#xff0c;每条数据的业务处理逻辑为0.1s。对于普通任务来说&#xff0c;只有一个线程来处理 可能需要10万秒才能处理完&#xff0c;业务则严重受影响。 常…

【Maven】项目的Maven插件报错

1. 找到本地maven库 2. 删除本地插件 3. 在IDEA上更新pom.xml

从零开始学代码写了一个心理学知识导航站

我从零编码经验开始开发一个网站。最初我只是想把自己收集到的心理学知识和一些资源分享出来&#xff0c;希望能够让更多的用户受益。 然而&#xff0c;在写作时&#xff0c;我意识到&#xff0c;尽管函数和界面是使用 GPT 从头开始​​手工编写的&#xff0c;而且我没有使用所…