Go 中的數據分析——如何使用 Gota 包
數據分析是過濾、操縱和處理原始數據和數據集以從中獲得洞察力的過程。
Python 和 R 通常是數據分析的首選語言。但是這些天,Go 正為此目的而變得越來越流行。
在本教程中,我們將介紹 Gota(Go 中的數據分析包)及其核心功能和用途。
先決條件
- 了解 Golang 中的函數式編程。
- 安裝了 Go 的 Golang IDE(我使用 Goland 和 Go 1.17.6,但您可以使用其他任何版本)
什么是戈塔?
Gota 是 Go 編程語言的數據框和數據整理模塊。
Gota 類似于 Python 中的 Pandas 庫,并且是為與 Gonum 接口而構建的,?Gonum 是 Golang 中的一個科學計算包,就像 Pandas 和 Numpy 一樣。
Gota 模塊使 Go 中的數據整理(轉換和操作)操作變得非常容易。它適用于 Go 內置數據類型和各種文件格式,如 JSON、CSV 和 HTML。
以下是我們將介紹的內容:
- 哥達系列。
- 得到數據框。
- 將文件作為數據框讀取。
- Gota 數據幀上的操作。
- 導出和保存文件。
如何開始使用 Gota
安裝 Gota 很容易。將以下命令粘貼到您的終端中:
go get -u https://github.com/go-gota/gota
這應該會輸出成功的安裝消息。如果沒有,請將您的 Golang 更新到較新的版本并重試安裝。
基本的 Gota 概念

在深入研究之前,讓我們先了解一些 Gota 基礎知識:
數據集是數據的集合,表格或其他形式。
數據框是將數據組織成二維(行和列)表的數據結構,通常用于分析目的。
系列是屬于數據框的一維數據的集合。
請注意,這DataFrame
是本文中用作示例的數據框對象的變量名稱。
什么是戈塔系列?
import "github.com/go-gota/gota/series"
Gota 系列是使用series.New
復合數據類型(如切片和地圖)的方法創建的。
對于切片,[series.New](http://series.New)
接受三個參數:切片、系列類型(要包含在系列中的元素的類型)和列名。
series.New([]string{"z", "y", "d", "e"}, series.String, "col")
系列也可以通過將鍵初始化為類型series
并使用 Type 方法插入系列類型來從映射中創建。
a := map[string]series.Type{
"A": series.String,
"D": series.Bool,
}
這些切片可以傳遞到數據幀中以進行進一步的操作和操作。
什么是 Gota 數據框?
Dataframe 函數包含在 Gota 中的 dataframe 子模塊中。
import "github.com/go-gota/gota/dataframe"
數據幀是其他數據結構的數據結構。本質上,它們將數據格式化為二維表,以便您可以操作這些數據。因此,要使用數據幀,我們需要讀取其他數據結構和數據類型。
我們將在本教程中閱讀系列、結構、JSON 和 CSV 文件。
如何將系列轉換為數據框對象
您可以使用該方法將一個系列或一組系列轉換為數據框對象[dataframe.New](http://dataframe.New)
。它以系列作為參數。
dataFrame := dataframe.New(
series.New([]string{"a", "b", "c", "d", "e"}, series.String, "alphas"),
series.New([]int{5, 4, 2, 3, 1}, series.Int, "numbers"),
series.New([]string{"a1", "b2", "c3", "d4", "e5"}, series.String, "alnums"),
series.New([]bool{true, false, true, true, false}, series.Bool, "state"),
)
fmt.Println(dataFrame)
輸出:
alphas numbers alnums state
0: a 5 a1 true
1: b 4 b2 false
2: c 2 c3 true
3: d 3 d4 true
4: e 1 e5 false
<string> <int> <string> <bool>
結構類型的數據框
您可以使用結構來創建數據框。
type Dog struct {
Name string
Colour string
Height int
Vaccinated bool
}
dogs := []Dog{
{"buster", "black", 56, false},
{"jake", "white", 61, false},
{"bingo", "brown", 50, true},
{"gray", "cream", 68, false},
}
dogsDf := dataframe.LoadStructs(dogs)
fmt.Println(dogsDf)
您可以通過創建 struct 類型的實例切片并使用dataframe.Loadstructs
接收切片的方法創建數據幀來做到這一點。
輸出:
Name Colour Height Vaccinated
0: buster black 56 false
1: jake white 61 false
2: bingo brown 50 true
3: gray cream 68 false
<string> <string> <int> <bool>
如何在 Gota 中查詢數據框
當我們有一個數據框對象時,我們可以使用各種方法查詢它以獲取有關數據框組成的信息。
dataFrame.Dims()
→ 輸出數據框對象的維度。dataFrame.Types()
→ 輸出構成數據幀的數據類型。dataFrame.Names()
→ 輸出數據框的列名。dataFrame.Nrow()
→ 輸出行數。dataFrame.Ncol()
→ 輸出列數。
如何查詢列
Gota 數據框列附帶了許多方法,可幫助查詢列值。
.IsNaN()
→ 檢查它是否為空列。.Mean()
→ 返回列的平均值。.Copy()
→ 創建列的新副本。.HasNaN()
→ 檢查列中是否有空值。.Records()
→ 返回列中的值。
aCol := dataFrame.Col("column_name") //selects a column
fmt.Println(aCol.HasNaN)
如何將文件讀入數據框對象
JSON 和 CSV 字符串可以分別傳遞給dataframe.ReadJSON
和dataframe.ReadCSV
。
如何讀取 JSON 字符串
JSON 字符串變量作為參數傳遞給dataframe.ReadJSON
usingstrings.NewReader
返回緩沖的 JSON 字符串。
jsonString := `[
{
"Name": "John",
"Age": 44,
"Colour": "Red",
"Height(ft)": 6.7
},
{
"Name": "Mary",
"Age": 40,
"Colour": "Blue",
"Height(ft)": 5.7
}
]`
dataRead := dataframe.ReadJSON(strings.NewReader(jsonString))
fmt.Println(dataRead)
}
如何讀取 CSV 字符串
在這里,我們有 CSV 格式的相同字符串:
import (
"fmt"
"github.com/go-gota/gota/dataframe"
"strings"
)
csvString := `
Name, Age, Colour, Height(ft)
John,44,Red,6.7
Mary,40,Blue,5.7`
dataRead := dataframe.ReadCSV(strings.NewReader(csvString))
fmt.Println(dataRead)
輸出:
Name Age Colour Height(ft)
0: John 44 Red 6.700000
1: Mary 40 Blue 5.700000
如何讀取 CSV 文件
這是 CSV:
Name,Age,Colour,Height(ft)
John,44,Red,6.7
Mary,40,Blue,5.7
Esther,35,Black,4.9
Jason,36,Green,5.2
您可以通過讀取包含[os.Open](http://os.Open)
文件名的文件來讀取 CSV 文件。defer file.Close()
是一個上下文管理器,它可以幫助我們在程序運行后關閉文件以防止數據丟失。
file, err := os.Open("example.csv")
defer file.Close()
if err != nil {
log.Fatal(err)
}
dataFrame := dataframe.ReadCSV(file)
fmt.Println(dataFrame)
如何讀取 JSON 文件
讀取 JSON 文件與讀取 CSV 文件完全一樣。
這是 JSON:
[
{
"Name": "John",
"Age": 44,
"Colour": "Red",
"Height(ft)": 6.7
},
{
"Name": "Mary",
"Age": 40,
"Colour": "Blue",
"Height(ft)": 5.7
},
{
"Name": "Esther",
"Age": 35,
"Colour": "Black",
"Height(ft)": 4.9
},
{
"Name": "Mary",
"Age": 40,
"Colour": "Green",
"Height(ft)": 5.2
}
]
以下是您閱讀文件的方式:
file, err := os.Open("example.json")
defer file.Close()
if err != nil {
log.Fatal(err)
}
dataFrame := dataframe.ReadJSON(file)
fmt.Println(dataFrame)
輸出:
Age Colour Height(ft) Name
0: 44 Red 6.700000 John
1: 40 Blue 5.700000 Mary
2: 35 Black 4.900000 Esther
3: 40 Green 5.200000 Mary
<int> <string> <float> <string>
Gota 數據框操作
如何在 Gota 中選擇行
Subset
您可以使用數據框對象的方法選擇行。dataFrame.Subset
接受兩個整數的切片,表示可以選擇的行數。
Gota 為數據幀操作提供了多種功能。使用上面的示例數據框,讓我們回顧一下其中的一些操作:
row := dataFrame.Subset([]int{0, 2})
這將選擇數據框的前兩行。
輸出:
Age Colour Height(ft) Name
0: 44 Red 6.700000 John
1: 35 Black 4.900000 Esther
<int> <string> <float> <string>
如何在 Gota 中選擇列
該Select
方法幫助我們選擇數據框的列。[df.Select](http://df.Select)
接受兩個整數的切片,表示可以選擇多少列。
column := dataFrame.Select([]int{0, 2})
我們還可以通過傳遞一個字符串切片按索引(列名)選擇列。
column := dataFrame.Select([]string{"Name", "Colour"})
輸出:
Name Colour
0: John Red
1: Mary Blue
2: Esther Black
3: Mary Green
<string> <string>
如何在 Gota 中更新數據框
我們使用.Set
數據框對象的方法來更新條目。dataFrame.Set
接收指定要更新的行數限制的整數切片,以及dataframe.LoadRecords
接收要傳入類型的二維切片的函數。
dataFrame2 := dataFrame.Set(
[]int{0, 3},
dataframe.LoadRecords(
[][]string{
[]string{"Jenny", "23", "purple", "2.2"},
[]string{"Jesse", "34", "indigo", "3.5"},
[]string{"Peter", "33", "violet", "3.3"},
},
),
)
輸出:
Name Age Colour Height(ft)
0: Jesse 34 indigo 3.500000
1: Mary 40 Blue 5.700000
2: Esther 35 Black 4.900000
3: Peter 33 violet 3.300000
<string> <int> <string> <float>
如何在 Gota 中過濾值
為了過濾值,我們.Filter
在數據框對象上使用。這需要dataframe.F
我們將結構文字傳遞給。
struct 文字包含一個列名Colname
、一個比較器Comparator
和一個值Comparando
,該值是我們要過濾數據幀的值。
比較器:
series.Eq
→ 等于 =。series.Neq
→ 不等于≠。series.Greater
→ 大于 >。series.GreaterEq
→ 大于或等于 ≥。series.Less
→ 小于 <。series.LessEq
→ 小于或等于 ≤。[series.In](http://series.In)
→ 包含在。
在此示例中,我們使用從系列到上面的數據框部分的數據框對象。
fil := dataFrame.Filter(
dataframe.F{Colname: "alphas", Comparator: series.Eq, Comparando: "b"},
)
輸出:
alphas numbers alnums state
0: b 2 b2 false
<string> <int> <string> <bool>
如何在 Gota 中對數據框進行排序
.Arrange
您可以使用數據框對象的方法對數據框進行排序。它分別按升序dataframe.Sort
或dataframe.RevSort
降序排列。它還接受要作為字符串排序的列的名稱。
按升序排序:
sorted := dataFrame.Arrange(
dataframe.Sort("numbers")
)
輸出:
alphas numbers alnums state
0: e 1 e5 false
1: c 2 c3 true
2: d 3 d4 true
3: b 4 b2 false
4: a 5 a1 true
<string> <int> <string> <bool>
按降序排序:
sorted := dataFrame.Arrange(
dataframe.RevSort("numbers"),
)
如何在 Gota 中使用 Groupby
您可以使用 groupby 根據特定列對數據進行分類。
要使用 Gota 對列進行分組,我們使用該Groupby
方法并傳入列名。
categorise := dataFrame.GroupBy("Name", "Age")
fmt.Println(categorise)
如何在 Gota 中加入數據框
連接是數據框的組合。使用 Gota 連接數據幀就像在 SQL(結構化查詢語言)中一樣。
連接類型:
- 內連接 →
dataFrame.InnerJoin
返回兩個表中匹配值的數據框。 - Left Join →
dataFrame.LeftJoin
匹配右數據幀與左數據幀的相似性。 - Right Join →
dataFrame.RightJoin
將左側數據幀中的相似性與右側數據幀匹配。 - Outer Join → dataFrame
.OuterJoin
返回數據框的所有值。
加入數據框對象的語法是:
joinVariableName := dataFrameObject.joinType(OtherDataframe, JoinKey)
Join 鍵是要執行連接的數據框對象的列。
左連接示例
df := dataframe.New(
series.New([]string{"a", "b", "c", "d", "e"}, series.String, "alphas"),
series.New([]int{5, 4, 2, 3, 1}, series.Int, "numbers"),
series.New([]string{"a1", "b2", "c3", "d4", "e5"}, series.String, "alnums"),
series.New([]bool{true, false, true, true, false}, series.Bool, "state"),
)
df2 := dataframe.New(
series.New([]string{"f", "g", "h", "i", "j"}, series.String, "alphas"),
series.New([]int{1, 2, 3, 4, 5}, series.Int, "numbers"),
series.New([]string{"f6", "g7", "h8", "i9", "j10"}, series.String, "alnums"),
series.New([]bool{false, true, false, false, true}, series.Bool, "state"),
)
join := df.RightJoin(df2, "state")
fmt.Println(join)
輸出:
[12x7] DataFrame
state alphas_0 numbers_0 alnums_0 alphas_1 numbers_1 alnums_1
0: false b 4 b2 f 1 f6
1: false e 1 e5 f 1 f6
2: true a 5 a1 g 2 g7
3: true c 2 c3 g 2 g7
4: true d 3 d4 g 2 g7
5: false b 4 b2 h 3 h8
6: false e 1 e5 h 3 h8
7: false b 4 b2 i 4 i9
8: false e 1 e5 i 4 i9
9: true a 5 a1 j 5 j10
... ... ... ... ... ... ...
<bool> <string> <int> <string> <string> <int> <string>
如何在 Gota 中將函數應用于數據框
要將函數應用于數據框的列和行,我們分別使用Capply
和Rapply
。這些接受要應用于列或行的函數。
dataFrame.Capply(function)
dataFrame.Rapply(function)
如何在 Gota 中對數據框使用描述
在數據框對象上使用Describe()
會返回有關數據框值的描述性統計信息。
description := dataFrame.Describe()
輸出:
column alphas numbers alnums state
0: mean - 3.000000 - 0.600000
1: median - 3.000000 - NaN
2: stddev - 1.581139 - 0.547723
3: min a 1.000000 a1 0.000000
4: 25% - 2.000000 - 0.000000
5: 50% - 3.000000 - 1.000000
6: 75% - 4.000000 - 1.000000
7: max e 5.000000 e5 1.000000
<string> <string> <float> <string> <float>
如何導出數據框(在 Go 中編寫文件)
WriteCSV
我們使用數據框對象的方法導出操作數據。dataFrame.WriteCSV
接受它創建或插入的文件名。
file, err := os.Create("output.csv")
if err != nil {
log.Fatal(err)
}
dataFrame.WriteCSV(file.extension)
要導出 JSON,我們dataFrame.WriteJSON
以相同的方式使用。
結論
在本教程中,您學習了如何在 Go 中執行數據分析。您還了解了 Gota 包的各種功能。
主要使用 Python 和 R 進行數據分析仍然是一個好主意,因為它們被認為是行業標準。但是 Gota 對于需要速度和同質性的應用程序很有用。