Создавайте красивые диаграммы
Эта статья продемонстрирует, как можно анализировать, обрабатывать и визуализировать данные с помощью Golang. Это учебник для начинающих, и на самом деле не требуется какого-либо уровня знаний Golang, чтобы следовать ему.
Мы будем работать с набором данных самых продаваемых компьютерных игр от Kaggle. Вы можете загрузить набор данных и сохранить его как games.csv
в своем рабочем каталоге, чтобы следовать дальше.
Читать набор данных
Набор данных, с которым мы работаем, содержит данные, показывающие количество продаж нескольких компьютерных игр за определенный период времени.
Для начала нам нужно прочитать набор данных в нашу программу Go. Давайте создадим новый файл ввода main.go
, а затем создадим основную функцию и добавим следующий фрагмент здесь.
Из фрагмента выше:
- Мы используем пакет Golang
os
, чтобы открыть файл набора данных, указав имя файла в качестве аргумента и сохранив этот набор данных какfile
. - Объявите две переменные для хранения названий игр и количества продаж для каждой игры.
games
— это частьstring
, аsales
— частьfloat64
. - Если при чтении файла возникает ошибка, мы регистрируем ошибку и выходим из программы.
- Мы создаем новую программу чтения CSV, используя пакет
encoding/csv
. Здесь мы предоставляем прочитанный файл в качестве аргумента. Затем мы устанавливаем для свойства LazyQuote средства чтения значение true, чтобы добавить кавычки в поля без кавычек в CSV-файле. - Затем мы используем созданный ридер для чтения CSV-файла и сохраняем его как
records
. Если при чтении файла возникает ошибка, мы регистрируем ошибку и выходим из программы.
Здесь следует отметить, что набор данных CSV будет читаться как records
, и каждая строка будет представлена как элемент массива, т. е. заголовок будет первым элементом в массиве, а затем каждая строка будет следовать его примеру.
Следующее, что нам нужно сделать, это отформатировать полученные записи. Мы создаем новую функцию для обработки этого. Функция принимает record
, который является фрагментом строки slice[][]string
, и возвращает две переменные того же типа, что и gameNames
и sales
.
- Мы создаем новые переменные как
gameName []string{}
иsales []float64{}
- Здесь мы создаем цикл
for
, который перебирает каждый элементrecords
. Обратите внимание, что цикл начинается с 1-го индекса, а не с 0-го, это сделано для удаления заголовка CSV. - Затем мы добавляем данные в созданный слайс
gamesNames
. Названия игр отображаются в первом столбце набора данных, что объясняет, почему мы добавляем 0-й индекс каждого элемента вrecords
r[0]
. - Мы также добавляем данные в созданный слайс
sales
. Количество продаж отображается во втором столбце набора данных, что объясняет, почему добавление индекса 1sh каждого элемента вrecords
r[1]
Обратите также внимание на то, как мы преобразовалиstring
вfloat64
перед добавлением его вsales.
. - Затем мы возвращаем два среза;
gameNames
иsales
Теперь из основной функции мы можем вызвать функцию formatRecords
и соответствующим образом обновить переменные gameNames
и sales
следующим образом:
Сопоставление набора данных
Теперь нам нужно сопоставить наши записи так, чтобы они были представлены в виде карты пары ключ/значение, где ключ — это название игры, а значения — количество продаж, например map[string]float64{ "game1": 20.5, "game2": 3 }
. Также отсортируем карту по убыванию количества продаж. Мы делаем это, создавая еще одну функцию, подобную этой;
- Мы создаем новую переменную карты
dataMap
с ключомstring
и значениемfloat64
. - Перебираем слайс
gameNames
и для каждого имени в срезе мы устанавливаем значение dataMap на имя игры и ключ на значение текущего индексаsales
На данный момент мы смогли преобразовать нашу запись в карту gameNames
против количества продаж. Следующее, что нужно сделать, это отсортировать данные. Для этого нам нужно будет реализовать пользовательскую сортировку. Подробнее о сортировке в Golang можно узнать здесь
И так, что здесь происходит???
- Мы создаем структуру типа
Data
со свойствамиValue
(string) иKey
(float64). Это представляет формат, в котором существуют наши данные - Мы также создаем переменную
DataList
типа[]Data
. - Затем мы создаем три функции
Len, Swap and Less
. Эти функции необходимы для реализации пользовательской сортировки в Golang. - Теперь внутри функции
mapData
мы создаем новые данные, представляющие собой срез типаDataList
, длина которого будет равна длинеdataMap
. Затем мы перебираемdataMap
и соответствующим образом заполняем срезdata
. - Затем мы используем пакет сортировки Golang для сортировки заполненных
data
. Обратите внимание, что мы сделали обратную сортировку, потому что хотим отсортировать по убыванию. - Затем мы возвращаем данные.
Затем мы можем вызвать функцию mapData
внутри основной функции следующим образом;
На данный момент мы смогли прочитать, проанализировать и очистить наши данные. Следующим шагом является визуализация данных на диаграмме. Мы будем использовать гистограмму, где по оси X будут отображаться названия игр, а по оси Y — количество продаж. Для этого воспользуемся библиотекой go-echat. Эта библиотека очень хороша для визуализации данных в Golang.
- Нам нужно добавить библиотеку, запустив
$ go get -u github.com/go-echarts/go-echarts/v2/.
в вашем терминале. - Мы будем отображать только первые 10 данных в наборе данных и помните, что мы уже отсортировали набор данных в порядке убывания количества продаж.
Итак, что здесь происходит?
- Внутри функции
createChart
мы передали отсортированные данные в качестве аргумента. - Мы создаем новый экземпляр гистограммы с помощью библиотеки go-echart.
- Мы устанавливаем некоторые глобальные параметры гистограммы, включая заголовок и подзаголовок диаграммы.
- Мы устанавливаем данные по оси X, которые являются названиями игр и являются ключами нашей отсортированной карты данных.
- Следующее, что нужно сделать, это сгенерировать данные по оси Y, которые представляют количество продаж каждой компьютерной игры. Это делается с помощью новой функции
generateBarItems
, которая принимаетsortedData
в качестве аргумента. Внутри этой функции мы перебираемsortedData
и соответственно добавляем данные бара. Это представлено какitems
- Вернувшись в функцию
createChart
, мы используем методCreate
пакетаos
для создания нового HTML-файла (games.html)
). Затем мы визуализируем диаграмму внутри нового HTML-файла.
Благодаря этому мы смогли создать гистограмму из нашего набора данных. Теперь вы можете запустить go run main.go
для компиляции и запуска программы. Вы можете открыть новый файл HTML, чтобы увидеть диаграмму
Итак, вот оно, мы увидели, как мы можем читать файлы (CSV), обрабатывать содержимое файла, а затем создавать диаграмму с содержимым файла. Код можно найти в этом репозитории. Спасибо за прочтение.