Advertisement
  1. Code
  2. Go
Code

Очистка данных с помощью Go: часть 2

by
Difficulty:IntermediateLength:MediumLanguages:
This post is part of a series called Cleaning Up Your Data With Go.
Cleaning Up Your Data With Go: Part 1

Russian (Pусский) translation by Ilya Nikov (you can also view the original English article)

Обзор

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

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

Стратегия очистки данных

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

Данные, на которых мы фокусируемся, являются табличными данными, где каждая строка независима. Не существует вложенных иерархий или связей между различными строками данных. Многие реальные наборы данных обладают этим хорошим свойством.

Удаление

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

Исправление

Лучшее решение - исправить плохое поле. В некоторых случаях легко обнаружить проблему и устранить ее. В наборе данных наблюдений НЛО поле состояния может быть одним из 52 штатов США.

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

Отчет

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

Статистика

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

Живая Очистка

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

В этом сценарии основная цель очистки состоит в том, чтобы убедиться, что неверные строки данных не нарушают весь конвейер обработки и могут быть пропущены или исправлены при необходимости.

Проверочные поля

Как вы проводите проверку полей? Вы должны точно знать, какой тип данных должен быть там, а иногда и какие значения. Вот несколько примеров.

Проверка числовых полей

Числовые поля очень распространены в наборах данных. Помимо типа числа (целое, вещественное, сложное), некоторые поля являются более специализированными. Например, поле цены может потребовать ровно две десятичные точки и быть положительным. Вот функция, которая проверяет, представляет ли строка цену:

Проверка полей URL

Иногда вам нужно выйти за пределы. Если вам нужно убедиться, что URL-адрес действителен, есть два подхода:

  1. Разобрать URL.
  2. Попробуйте и получите его (или, по крайней мере, получите заголовки).

Если вам важно, чтобы URL был правильно сформирован, тогда первый подход работает. Но если вы хотите убедиться, что URL действительно указывает на реальный пункт назначения, вам нужно использовать второй подход. Поскольку второй подход является надмножеством первого подхода, давайте просто воспользуемся им:

Проверка полей пользовательского формата

Если значения должны соответствовать пользовательскому формату, вы можете либо сопоставить его, используя простые строковые функции, такие как Split(), либо в более сложных случаях использовать регулярные выражения. Например, если ваш набор данных содержит номера социального страхования (я надеюсь, что нет) в формате XXX-XX-XXXX, то вы можете разделить на «-» и убедиться, что есть три токена, в которых первый из них состоит из трех цифр, а второй - из двух цифр. долго, а третье четыре цифры в длину. Но более кратко использовать регулярные выражения, такие как ^\d{3}-?\d{2}-?\d{4}$.

Исправление неверных значений

Исправление недопустимых значений не является тривиальной вещью. Если ваш метод исправления неверен, вы можете получить поврежденные данные. Вы должны внимательно рассмотреть важность поля, диапазон возможных допустимых значений и насколько вы уверены, что вы действительно можете исправить любое недопустимое значение автоматически.

Фиксирующий кейс

Это довольно безопасное решение. Если текстовое поле должно быть написано заглавными буквами, вы можете исправить это, не рискуя сильно, потому что символы, которые изначально были строчными, не являются важной частью информации. Нет необходимости писать специальный код, так как пакет strings имеет функцию ToUpper(). Есть также функции ToLower() и даже ToTitle() и ToTitleSpecific() для правильного использования текста.

Удаление нежелательных символов

Другое распространенное простое исправление - удаление начальных и конечных пробелов. Вы будете удивлены, сколько людей добавляют пробелы или новые строки при вводе данных. Пакет strings содержит набор функций TrimXXX(), которые могут позаботиться о большинстве ситуаций:

  • Trim()
  • TrimFunc()
  • TrimLeft()
  • TrimLeftFunc()
  • TrimPrefix()
  • TrimRight()
  • TrimRightFunc()
  • TrimSpace()
  • TrimSuffix()

Отбрасывание недействительных символов

В некоторых случаях можно удалить недопустимые символы. Я рекомендую делать это только для некритических и необязательных полей. Например, у вас может быть поле описания или примечаний, содержащее свободный текст, и вы хотите убедиться, что оно не содержит определенных символов, таких как кавычки или двойные кавычки. Вот как это сделать:

Исправление числовых значений

Числовые значения часто легко исправить. Если вам требуется точность в два десятичных знака, вы можете усечь или округлить дополнительные цифры. Таким же образом легко конвертировать целые числа в числа с плавающей точкой.

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

Фиксирование значений URL

Часто можно безопасно исправить URL-адреса, используя различные схемы («http» или «https») или добавляя или удаляя «www» субдомены. Объединение вариантов с попыткой выбрать кандидатов может дать вам уверенность в том, что исправление было правильным.

Работа с отсутствующими значениями

Пропущенные значения очень распространены при приеме реальных данных. Если отсутствует пропущенное значение, существует два основных способа его обработки (без полного отклонения строки) - использовать значения по умолчанию или восстановить значение из альтернативного источника.

Применение значений по умолчанию

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

Использование альтернативных данных

Этот подход немного сложнее. Идея состоит в том, чтобы обратиться к другому источнику данных, который имеет запрошенную информацию. Например, если у вас есть электронная почта пользователя, но имя и фамилия отсутствуют, вы можете обратиться к своей базе данных пользователей и извлечь имя пользователя. Это спасает код обработки от доступа к БД или даже от знания этой зависимости.

Собираем все вместе

Давайте очистим небольшой набор данных продуктов. Поля:

Имя столбца Описание столбца
id PRD-XXXX-XXXX (где X - это цифра)
Название до 40 символов
Цена числовое поле с фиксированной точностью (две десятичные точки)
Описание длиной до 500 символов (необязательно)

Вот набор данных в удобочитаемой форме (пробелы будут урезаны во время очистки):

Первые два продукта действительны. В третьем продукте, "PRD-1234-666", отсутствует цифра в его идентификаторе. Следующий продукт, "PRD-1234-7777", не имеет цены. Последний продукт, «prd-1234-8888», имеет недопустимый идентификатор продукта, но его можно безопасно исправить (сделать его заглавным).

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

Чтобы проверить идентификатор продукта и цену, я буду использовать регулярные выражения. Вот две вспомогательные функции:

После очистки данных и удаления всех недопустимых строк данных следующая функция запишет чистые данные в новый CSV-файл с именем «clean.csv» и распечатает их на экране.

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

Заключение

Go имеет хорошо продуманные пакеты для обработки текста. В отличие от большинства языков, строковый объект на самом деле представляет собой просто кусочек байтов. Вся логика обработки строк находится в отдельных пакетах, таких как «strings» и «strconv».

Во второй части руководства мы использовали множество концепций для решения общей реальной задачи по очистке набора данных в формате CSV перед анализом.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.