Как стать автором
Обновить
536.18
OTUS
Цифровые навыки от ведущих экспертов

Контролируем качество данных с помощью Python

Время на прочтение6 мин
Количество просмотров3.3K

Сегодня мы будем говорить о не совсем обычном тестировании. Уточнение собранных данных — большая головная боль для специалистов по анализу данных и аналитиков. Большинство специалистов по обработке данных тратят от 50 до 80% своего времени на доработку собранных ранее данных. Здесь речь может идти о текстовых данных или изображениях, найденных в Интернете. Аналитики обычно не используют данные сразу после того, как краулер закончил их извлекать. Несмотря на то, что существует множество различных инструментов для сбора данных, в том числе и на Python, работа с большими объемами данных, по прежнему, не является простым процессом.

Прежде всего давайте посмотрим, чем Python может помочь при работе с данными. Прежде всего Python — это язык программирования общего назначения, который очень интуитивно понятен в использовании. Также он имеет имеет обширное сообщество и множество библиотек, включая, помимо прочего, pandas, scikit‑learn и pyspark. Эти библиотеки могут решить практически все основные задачи по анализу и манипулированию данными. Если говорить точнее, pyspark предоставляет API для Apache Spark, который позволяет обрабатывать крупномасштабные данные в режиме реального времени. Таким образом, Python — оптимальный выбор для обработки и проверки данных.

Подготовка данных

Для начала нам необходимо загрузить тестовый набор данных. Предположим, у нас имеется файл test_dataset.csv являющийся основным набором данных, с которым мы будем работать. Начнем с загрузки его в pandas.DataFrame.

import pandas as pd
import chardet
import re
import numpy as np

with open("./test_dataset.csv", "rb") as f:
   enc = chardet.detect(f.read())
df = pd.read_csv("./test_dataset.csv", encoding= enc["encoding"])
df.dropna(how="all",axis=0,inplace=True)

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

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

Сравнение списка входных данных

Во многих случаях, нам необходимо выполнять поиск товаров с определенными SKU (Stock Keeping Unit — уникальный код, который описывает единицу ассортимента). Чтобы выполнить эти требования, мы сравниваем входящие SKU с предопределенным списком.

Количество записей совпало и там и там 18, но давайте посмотрим, совпадают ли SKU:

df[~df.SKU.isin(input_list.SKU_list.unique().tolist())].loc[:,"SKU"].unique().tolist()
input_list[~input_list.SKU_list.isin(df.SKU.unique().tolist())].loc[:,"SKU_list"].unique().tolist()

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

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

Используем правило

Если в вашем наборе данных есть столбец, для которого можно определить правила, то мы реализуем эти правила в нашем скрипте. Запустив эти скрипты, мы сможем обеспечить целостность набора данных. Допустим, вы извлекаете код_продукта с сайта электронной коммерции, который содержит комбинацию из 1 буквы и четырех цифр. Выполнив скрипт, мы можем отметить продукты, которые не соответствуют его правилам.

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

Однако простая функция может помочь нам в решении этой задачи.

def rule_checker(data_point:str) -> bool:
   alphabet_count = sum(1 for i in data_point if i.isalpha())
   numeric_count = sum(1 for i in data_point if i.isnumeric())
   if (alphabet_count == 1) & (numeric_count == 4):
       return True
   else:
       return False

df[~df.product_code.apply(rule_checker)]

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

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

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

Начнем с отсутствующих полей данных. При первом извлечении данных вполне вероятно получить пустые поля данных. Выше мы рассмотрели вариант, когда отфильтровывались строки в которых все значения NaN. Но что делать если отсутствует только какое‑то одно значение в строке.

В таком случае можно использовать конструкцию:

df[df.product_name.isna()]

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

Логическая проверка

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

phone_numeral_count = 10

df[df.vendor_contact.apply(lambda x: True if sum(1 for i in x if i.isnumeric())!=phone_numeral_count else False)]

Постобработка данных

Данные, которые мы получаем из веб‑ресурсов, не всегда пригодны для использования. Некоторые встроенные аномалии могут нарушить целостность набора данных и замедлить процесс принятия решений. Давайте рассмотрим несколько наиболее распространенных методов постобработки.

Когда исходные данные доступны напрямую через API, мы вполне можем ожидать, что они будут лишены HTML‑тегов. Однако ситуация разительно отличается, когда мы извлекаем данные путем разбора HTML‑документов.

В таких случаях наличие HTML‑тегов в наборе данных становится серьезной проблемой. Для спасения набора данных можно внедрить в поле регулярные выражения. Ниже приведен фрагмент кода Python для удаления HTML‑тегов из точек данных:

def remove_tags(raw_text):
   CLEANR = re.compile('<.*?>')
   cleantext = re.sub(CLEANR, '', str(raw_text))
   return cleantext

Мы видим, что название продукта из второго ряда свободно от HTML‑тега.

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

Пустые поля

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

Давайте рассмотрим столбец overall_rating. Отрицательное значение в этом поле может исказить данные. Поэтому первым делом мы проверяем, может ли поле иметь отрицательные значения.

overall_rating_flagged_index = df[df.overall_rating.isna() | (df.overall_rating < 0)].index

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

df.overall_rating = df.overall_rating.abs()

Далее давайте поместим медианное значение в недостающие поля столбца.

df.overall_rating.fillna(df.overall_rating.median(), inplace=True)

После использования этой простой операции мы видим, что информация о полях сохранена в максимально возможной степени.

Заключение

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


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

Теги:
Хабы:
+1
Комментарии2

Публикации

Информация

Сайт
otus.ru
Дата регистрации
Дата основания
Численность
101–200 человек
Местоположение
Россия
Представитель
OTUS