Создавайте красивые диаграммы

Эта статья продемонстрирует, как можно анализировать, обрабатывать и визуализировать данные с помощью Golang. Это учебник для начинающих, и на самом деле не требуется какого-либо уровня знаний Golang, чтобы следовать ему.

Мы будем работать с набором данных самых продаваемых компьютерных игр от Kaggle. Вы можете загрузить набор данных и сохранить его как games.csv в своем рабочем каталоге, чтобы следовать дальше.

Читать набор данных

Набор данных, с которым мы работаем, содержит данные, показывающие количество продаж нескольких компьютерных игр за определенный период времени.

Для начала нам нужно прочитать набор данных в нашу программу Go. Давайте создадим новый файл ввода main.go, а затем создадим основную функцию и добавим следующий фрагмент здесь.

Из фрагмента выше:

  1. Мы используем пакет Golang os, чтобы открыть файл набора данных, указав имя файла в качестве аргумента и сохранив этот набор данных как file.
  2. Объявите две переменные для хранения названий игр и количества продаж для каждой игры. games — это часть string, а sales — часть float64.
  3. Если при чтении файла возникает ошибка, мы регистрируем ошибку и выходим из программы.
  4. Мы создаем новую программу чтения CSV, используя пакет encoding/csv. Здесь мы предоставляем прочитанный файл в качестве аргумента. Затем мы устанавливаем для свойства LazyQuote средства чтения значение true, чтобы добавить кавычки в поля без кавычек в CSV-файле.
  5. Затем мы используем созданный ридер для чтения CSV-файла и сохраняем его как records. Если при чтении файла возникает ошибка, мы регистрируем ошибку и выходим из программы.

Здесь следует отметить, что набор данных CSV будет читаться как records, и каждая строка будет представлена ​​как элемент массива, т. е. заголовок будет первым элементом в массиве, а затем каждая строка будет следовать его примеру.

Следующее, что нам нужно сделать, это отформатировать полученные записи. Мы создаем новую функцию для обработки этого. Функция принимает record, который является фрагментом строки slice[][]string, и возвращает две переменные того же типа, что и gameNames и sales.

  1. Мы создаем новые переменные как gameName []string{} и sales []float64{}
  2. Здесь мы создаем цикл for, который перебирает каждый элемент records. Обратите внимание, что цикл начинается с 1-го индекса, а не с 0-го, это сделано для удаления заголовка CSV.
  3. Затем мы добавляем данные в созданный слайс gamesNames. Названия игр отображаются в первом столбце набора данных, что объясняет, почему мы добавляем 0-й индекс каждого элемента в records r[0].
  4. Мы также добавляем данные в созданный слайс sales. Количество продаж отображается во втором столбце набора данных, что объясняет, почему добавление индекса 1sh каждого элемента в records r[1] Обратите также внимание на то, как мы преобразовали string в float64 перед добавлением его в sales..
  5. Затем мы возвращаем два среза; gameNames и sales

Теперь из основной функции мы можем вызвать функцию formatRecords и соответствующим образом обновить переменные gameNames и sales следующим образом:

Сопоставление набора данных

Теперь нам нужно сопоставить наши записи так, чтобы они были представлены в виде карты пары ключ/значение, где ключ — это название игры, а значения — количество продаж, например map[string]float64{ "game1": 20.5, "game2": 3 } . Также отсортируем карту по убыванию количества продаж. Мы делаем это, создавая еще одну функцию, подобную этой;

  1. Мы создаем новую переменную карты dataMapс ключом string и значением float64.
  2. Перебираем слайс gameNames и для каждого имени в срезе мы устанавливаем значение dataMap на имя игры и ключ на значение текущего индекса sales

На данный момент мы смогли преобразовать нашу запись в карту gameNames против количества продаж. Следующее, что нужно сделать, это отсортировать данные. Для этого нам нужно будет реализовать пользовательскую сортировку. Подробнее о сортировке в Golang можно узнать здесь

И так, что здесь происходит???

  1. Мы создаем структуру типа Data со свойствами Value (string) и Key (float64). Это представляет формат, в котором существуют наши данные
  2. Мы также создаем переменную DataList типа []Data .
  3. Затем мы создаем три функции Len, Swap and Less . Эти функции необходимы для реализации пользовательской сортировки в Golang.
  4. Теперь внутри функции mapData мы создаем новые данные, представляющие собой срез типа DataList, длина которого будет равна длине dataMap. Затем мы перебираем dataMap и соответствующим образом заполняем срез data.
  5. Затем мы используем пакет сортировки Golang для сортировки заполненных data. Обратите внимание, что мы сделали обратную сортировку, потому что хотим отсортировать по убыванию.
  6. Затем мы возвращаем данные.

Затем мы можем вызвать функцию mapData внутри основной функции следующим образом;

На данный момент мы смогли прочитать, проанализировать и очистить наши данные. Следующим шагом является визуализация данных на диаграмме. Мы будем использовать гистограмму, где по оси X будут отображаться названия игр, а по оси Y — количество продаж. Для этого воспользуемся библиотекой go-echat. Эта библиотека очень хороша для визуализации данных в Golang.

  1. Нам нужно добавить библиотеку, запустив$ go get -u github.com/go-echarts/go-echarts/v2/. в вашем терминале.
  2. Мы будем отображать только первые 10 данных в наборе данных и помните, что мы уже отсортировали набор данных в порядке убывания количества продаж.

Итак, что здесь происходит?

  1. Внутри функции createChart мы передали отсортированные данные в качестве аргумента.
  2. Мы создаем новый экземпляр гистограммы с помощью библиотеки go-echart.
  3. Мы устанавливаем некоторые глобальные параметры гистограммы, включая заголовок и подзаголовок диаграммы.
  4. Мы устанавливаем данные по оси X, которые являются названиями игр и являются ключами нашей отсортированной карты данных.
  5. Следующее, что нужно сделать, это сгенерировать данные по оси Y, которые представляют количество продаж каждой компьютерной игры. Это делается с помощью новой функции generateBarItems, которая принимает sortedData в качестве аргумента. Внутри этой функции мы перебираем sortedData и соответственно добавляем данные бара. Это представлено как items
  6. Вернувшись в функцию createChart, мы используем метод Create пакета os для создания нового HTML-файла (games.html)). Затем мы визуализируем диаграмму внутри нового HTML-файла.

Благодаря этому мы смогли создать гистограмму из нашего набора данных. Теперь вы можете запустить go run main.go для компиляции и запуска программы. Вы можете открыть новый файл HTML, чтобы увидеть диаграмму

Итак, вот оно, мы увидели, как мы можем читать файлы (CSV), обрабатывать содержимое файла, а затем создавать диаграмму с содержимым файла. Код можно найти в этом репозитории. Спасибо за прочтение.