程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

【Tablesaw】Java數據框架和可視化庫,Java中的 “Pandas”

編輯:Python

Tablesaw

  • 一. 前言
  • 二. Maven導入包
  • 三. 基本操作
    • 3.1 列操作
      • 3.1.1 創建列
      • 3.1.2 添加、編輯和刪除數據
      • 3.1.3 通用api
      • 3.1.4 篩選
        • 3.1.4.1 篩選出想要的列
        • 3.1.4.2 有條件的編輯數據
      • 3.1.5 輸出列
    • 3.2 表格操作
      • 3.2.1 創建表格(導入文件)
      • 3.2.2 添加、刪除和選擇列
        • 3.2.2.1 添加列
        • 3.2.2.2 刪除列
        • 3.2.2.3 選擇列
      • 3.2.3 拼接表格
      • 3.2.4 篩選
      • 3.2.5 輸出表格
      • 3.2.6 導出表格
  • 四. 最後

一. 前言

Tablesaw是一款Java的數據可視化庫,主要包括兩部分:

  1. 數據解析庫,主要用於加載數據,對數據進行操作(轉化,過濾,匯總等),類比Python中的Pandas庫;
  2. 數據可視化庫,將目標數據轉化為可視化的圖表,類比Python中的Matplotlib庫。

與Pandas不同的是,Tablesaw中的表格以列(Column)為基本單位,因此大部分操作都是基於列進行的。當然也包括部分對行操作的函數,但是功能比較有限。

首先我們看一下Tablesaw支持的導入和導出文件的類型:

官方教程幾乎包括了所有的操作:https://jtablesaw.github.io/tablesaw/userguide/toc,下面我就介紹一下我在寫項目中使用到的一些操作。

二. Maven導入包

<dependency>
<groupId>tech.tablesaw</groupId>
<artifactId>tablesaw-core</artifactId>
<version>LATEST</version>
</dependency>
<dependency>
<groupId>tech.tablesaw</groupId>
<artifactId>tablesaw-excel</artifactId>
<version>LATEST</version>
</dependency>

三. 基本操作

3.1 列操作

Tablesaw中的列包括很多種數據類型,常用的包括:字符串列(StringColumn)、整型列(IntColumn)、浮點列(DoubleColumn)、日期時間列(DateTimeColumn)等,每一種列提供的API都大同小異。

3.1.1 創建列

/*1. 創建一個空列*/
DoubleColumn column = DoubleColumn.create("column name");
/*2. 創建一個有初始值的列*/
double[] values = {
1, 2, 3, 7, 9.44242, 11};
DoubleColumn column = DoubleColumn.create("column name", values);

3.1.2 添加、編輯和刪除數據

/*添加數據*/
column.append(value)
/*編輯數據*/
doubleColumn.set(index, value);
/*刪除數據*/
//方式1
column.setMissing(0);
column = column.removeMissing();
//方式2
//這裡用到了後面過濾的api
column.setMissing(index);
Selection sl = column.isNotMissing();
column = column.where(sl);

3.1.3 通用api

name() // 返回列名
type() // 返回列的數據類型,比如LOCAL_DATE
size() // 返回列的長度
isEmpty() // 返回列是否為空
first(n) and last(n) // 返回列前/後n個數
max() and min() // 返回列的最大值/最小值
top(n) and bottom(n) // 返回n個最大/最小的數
print() // 返回列的字符串類型,用於輸出
copy() // 復制一份新列
unique() // 返回列中的元素並只出現一次
countUnique() // 返回列中元素的種類
void sortAscending() // 升序排列
void sortDescending() // 降序佩列 
append(otherColumn) // 將其他列添加到這個列後面
removeMissing() // 返回去除missing元素後的列

3.1.4 篩選

3.1.4.1 篩選出想要的列

篩選可以說是最重要的操作之一,它可以幫助我們選出我們想要的元素。以下面這個列為例:

double[] values = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
DoubleColumn column = DoubleColumn.create("column name", values);
Column: column name
1
2
3
4
5
6
7
8
9
10

篩選的第一步操作是創建一個表達式,比如我想篩選出所有大於5的數:

Selection limit = column.isGreaterThan(5);

然後就可以用where(Selection)函數進行篩選:

DoubleColumn column_new = column.where(limit);
Column: column name
6
7
8
9
10

Tablesaw提供了非常多的表達式,幾乎可以滿足我們所有的需求:

對於DateColumnDateTimeColumn這種時間相關的列而言,他們有一些特殊的表達式:

它可以幫助我們篩選出我們想要的日期,同時我們也可以通過先獲取日期列的年/月/日/時/分/秒來得到一個新的列,再對列進行篩選。比如我想篩選出所有凌晨6點-7點的時間:

datetimecolumn.hour().isEqualTo(6);

列篩選是表格篩選的基礎,後面還會繼續講解如何進行表格篩選。

3.1.4.2 有條件的編輯數據

以下面這個列為例:

double[] values = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
DoubleColumn column = DoubleColumn.create("column name", values);

比如我們想替換所有大於5的數為100,那麼可以:

Selection limit = doublecolumn.isGreaterThan(5);
doublecolumn.set(limit, 100.0);

比如我們可以將所有缺失值設置為平均值:

double avg = doubleColumn.mean();
doubleColumn.set(doubleColumn.isMissing(), avg)

3.1.5 輸出列

將列輸出到終端顯示:

System.out.println(doublecolumn.print());

3.2 表格操作

Tablesaw有大量創建、查詢、操作、顯示和保存表的方法,而且對表的許多操作都會返回其他表。例如,當您要求一個表描述其結構時,它會返回一個包含列名、類型和順序的新表。

3.2.1 創建表格(導入文件)

/*方式一:添加列到表格中*/
Table t = Table.create("name", column1, column2, column3...)
//比如:
double[] values1 = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
DoubleColumn column1 = DoubleColumn.create("column1", values1);
double[] values2 = {
2, 1, 4, 4, 5, 6, 6, 1, 8, 4};
DoubleColumn column2 = DoubleColumn.create("column2", values2);
/*方式二:從文件中導入*/
Table t = Table.read().csv("myFile.csv");

當我們想從文件中導入表格時,我建議采用以下方法:

Table.read().file(File file);
Table.read().file(String path);

采用這種方式可以既可以導入.csv格式的文件,也可以導入.xlsx.xls格式的文件,但是這種方式不能指定導入文件的sheet,如果想要指定sheet,采用下面這種方法:

Table cap = Table.read().usingOptions(XlsxReadOptions
.builder(String path)
.sheetIndex(String sheet));

3.2.2 添加、刪除和選擇列

3.2.2.1 添加列

可以使用向表中添加一列或多列addColumns()方法:

t.addColumns(aColumn...)

還可以通過提供索引來指定在特定位置插入列:

t.addColumn(3, aColumn);

需要注意的是,新添加的列必須為空,或者與表中的其他列具有相同數量的元素。

3.2.2.2 刪除列

要刪除一列或多列:

t.removeColumns(int... columnindexes)
t.removeColumns(String... columnnames)

或者指定想要保存的列,刪除其他列,但是這種操作會在原列上進行,如果想要選擇某幾列而不改變原始數據,建議使用下面的選擇列

t.retainColumns(int... columnindexes)
t.retainColumns(String... columnnames)

3.2.2.3 選擇列

當前官方文檔中選擇列給的是select()函數,但是我建議使用selectColumns(),因為前者不能通過指定index來選擇列,而後者既可以用名稱選擇也可以用index選擇:

Table t2 = t.selectColumns("column1");
Table t2 = t.selectColumns(0);

也可以通過在當前表格中指定不需要的列來創建新表格,這可能會節省一些鍵入時間,同樣這個函數也可以用名稱和index來指定列:

Table t2 = t.rejectColumns("column1");
Table t2 = t.rejectColumns(0);

如果只選擇一列,通常需要將返回的列轉換為更具體的類型。例如:

DoubleColumn dc = t.doubleColumn();

3.2.3 拼接表格

拼接表格有兩種形式,一種是橫向拼接,也就是行數相同,增加列數;零一周是縱向拼接,也就是列數相同,增加行數。

/*1. 橫向組合*/
Table result = t.concat(t2);
/*2. 縱向組合*/
Table result = t.append(t2);

需要注意的是,橫向拼接時兩個表格的列名不能有重復,縱向拼接時對應列的列名必須相同。

3.2.4 篩選

篩選是在列篩選的基礎上進行的,我們以下面這個表格為例:

LocalDate currentdate = LocalDate.of(Integer.parseInt("2022"), 1, 1);
List<LocalDate> date_list = new ArrayList<LocalDate>();
for(int d=0;d<10;d++)
{

date_list.add(currentdate.plusDays(d));
}
DateColumn date = DateColumn.create("Time", date_list);
double[] values = {
1, 2, 3, 4, 5,6,7,8,9,10};
DoubleColumn value = DoubleColumn.create("value", values);
Table t = Table.create("a",date,value);
 a
Time | value |
------------------------
2022-01-01 | 1 |
2022-01-02 | 2 |
2022-01-03 | 3 |
2022-01-04 | 4 |
2022-01-05 | 5 |
2022-01-06 | 6 |
2022-01-07 | 7 |
2022-01-08 | 8 |
2022-01-09 | 9 |
2022-01-10 | 10 |

這裡將篩選出2022年1月5日以後的數據。

篩選的第一步是選擇我們想要篩選的列:

DateColumn date_column = t.dateColumn(0);

第二步是創建一個約束的表達式:

Selection limit = date_column.dayOfMonth().isGreaterThan(5);

第三步就可以用where()函數進行篩選了:

Table t2 = t.where(limit);
 a
Time | value |
------------------------
2022-01-06 | 6 |
2022-01-07 | 7 |
2022-01-08 | 8 |
2022-01-09 | 9 |
2022-01-10 | 10 |

篩選時我們也可以同時指定多個約束,比如我想要篩選出2022年1月5日以後並且value大於7的數據:

DateColumn date_column = t.dateColumn(0);
Selection limit1 = date_column.dayOfMonth().isGreaterThan(5);
DoubleColumn value_column = t.doubleColumn(1);
Selection limit2 = value_column.isGreaterThan(7);
Table t2 = t.where(limit1.and(limit2));
 a
Time | value |
------------------------
2022-01-08 | 8 |
2022-01-09 | 9 |
2022-01-10 | 10 |

3.2.5 輸出表格

將表格輸出到終端顯示:

System.out.println(t.print());

3.2.6 導出表格

table.write().csv("filename.csv");

表格只能導出為.csv格式,後面我會寫一下如何利用EasyExcel庫將.csv文件另存為.xlsx中的某個sheet當中。

四. 最後

本文介紹了Tablesaw中的一些常用的基本操作,這些操作基本上能滿足我們工作中的大部分需求,如果有其他需要可以去官網上查找對應的方法。總而言之Tablesaw是一個非常強大的數據處理庫,但是也有一些不足之處,比如無法導出.xlsx格式的文件。目前這個庫應該還在不斷完善當中,期待Tablesaw能夠實現更多的功能!


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved