Что такое прием данных? Как это делается с помощью скриптов python?

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

Проглатывание означает «процесс всасывания питательных веществ или лекарств в организм при их употреблении в пищу или питье».

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

Данные могут присутствовать в наборах данных, размещенных в таких источниках, как Открытые данные Всемирного банка, Репозиторий машинного обучения UCI, Kaggle и т. д.

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

  • API-аутентификация
  • Загрузка необработанных файлов в формате .zip, .tgz или любом другом формате
  • Распаковка необработанных файлов
  • Извлечение заголовков и основных данных из разархивированных файлов
  • Преобразование данных в нужный формат, например .csv, .tsv и т. д.
  • Разделение на наборы данных тестового поезда. Необязательный шаг

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

Примечание. Хотя на рынке доступно множество инструментов для приема данных, для простоты мы ограничим этот процесс только сценариями Python.

Я расскажу о двух сценариях проекта машинного обучения:

1. Прием данных через Kaggle API

2. Прием данных через URL-адрес репозитория машинного обучения UCI

Прием данных через Kaggle API

Шаг 1. После входа в свою учетную запись Kaggle перейдите на https://www.kaggle.com/‹username›/account и нажмите Создать новый токен API.

Шаг 2: kaggle.json будет загружен. В рабочем каталоге создайте папку с именем .kaggle и вставьте в нее kaggle.json.

Шаг 3: Установите библиотеку Kaggle в рабочий каталог pip install kaggle

Шаг 4: Перейдите к конкретному файлу данных Kaggle, который вы хотите загрузить, скопируйте его URL-адрес и вставьте в код. В моем коде я принял это как kaggle_url=https://www.kaggle.com/datasets/uciml/pima-indians-diabetes-database?select=diabetes.csv

Шаг 5: Получите имя файла и имя набора данных из kaggle_url.

Сначала я разделю kaggle_url, используя regex split с несколькими разделителями, такими как /, ? или = для получения списка строк.

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

import regex

def dataset_and_file_name(kaggle_url:str):
    kaggle_url = re.split(r'[/?=]', kaggle_url)
    file=kaggle_url[-1]
    dataset="/".join(kaggle_url[-4:-2])
    return dataset,file

Шаг 6: Напишите функцию для извлечения имени пользователя и ключа kaggle из пути, где хранится kaggle.json

def get_kaggle_username_key(kaggle_json_path:str):
    with open(kaggle_json_path) as user:
        user_info=json.load(user)
    return user_info['username'],user_info['key']

Шаг 7. Аутентифицируйте API Kaggle и загрузите набор данных по указанному пути.

def download_kaggle_dataset(path:str):
    username,key=get_kaggle_username_key(".kaggle\kaggle.json") 
    os.environ['KAGGLE_USERNAME'] = username
    os.environ['KAGGLE_KEY'] = key    

    api = KaggleApi()
    api.authenticate()
    dataset,file=dataset_and_file_name(kaggle_url)
    api.dataset_download_file(dataset, file, path)

download_kaggle_dataset('data_ingestion/kaggle_artifacts')

Полный код доступен по ссылке на Github. Запуск этого кода создаст файл diabetes.csv в папке kaggle_artificats.

Прием данных через URL-адрес репозитория машинного обучения UCI

Шаг 1: Получение URL-адреса файла

Перейдите по адресу https://archive.ics.uci.edu/ml/machine-learning-databases/spambase. Щелкните правой кнопкой мыши spambase.zip и скопируйте адрес ссылки, вставьте этот URL-адрес в код.

uci_url= “https://archive.ics.uci.edu/ml/machine-learning-databases/spambase/spambase.zip”

Шаг 2: Загрузите необработанный файл

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

Функция request.urlretrieve в urlib.requestбиблиотеке используется для загрузки zip-папки. Функция ниже принимает путь (куда будет загружен файл .zip) в качестве аргумента. Сначала он создает каталог пути, если он не существует. Затем создает путь для пути к файлу, присоединяя data.zip к каталогу пути. Затем он загружает spambase.zip как data.zip в пути к файлу. Наконец, он возвращает путь к файлу.

import os
import urllib.request as request

def download_rawfile(path:str): 
    if not os.path.exists(path):
        os.makedirs(path)
    filepath = os.path.join(path,"data.zip").replace("\\","/")
    request.urlretrieve(uci_url,filepath) 
    return filepath

Шаг 3 Разархивируйте содержимое необработанного файла

zipfile используется библиотека, и создается простая функция распаковки, которая принимает путь (где присутствует файл .zip) и path_to_unzip (где будут храниться файлы распаковки) в качестве аргумента. Мы вызываем вышеприведенную функцию download_rawfile, чтобы получить путь к файлу, а затем открываем этот файл в режиме чтения и используем extractall для извлечения содержимого файла .zip и сохранения его в path_to_unzip.

from zipfile import ZipFile

def unzip_raw(path:str,path_to_unzip:str):
    filename=download_rawfile(path)
    with ZipFile(file=filename, mode="r") as zf:
        zf.extractall(path_to_unzip)

Шаг 4 Получение заголовков

После распаковки нужно быстро просмотреть различные файлы в папке распаковки для поиска необходимых данных. В этом случае основные данные находятся в файле spambase.data. Этот файл не имеет заголовков. Файл с именем spambase.names имеет заголовки в строках с 34 по 90. Также отсутствует заголовок целевого столбца.

Итак, мы создадим 2 пользовательские функции. Первая функция принимает path_to_unzip (путь, по которому находится содержимое разархивированного файла) в качестве аргумента и возвращает список путей к файлам, представленных в path_to_unzip.

def list_unzip_files(path_to_unzip:str):
    file_list=[]
    for f in os.listdir(path_to_unzip):
        file_list.append(os.path.join(path_to_unzip,f).replace("\\","/"))
    return file_list

Вторая функция принимает path_to_header (путь к файлу, содержащему заголовки) в качестве аргумента и возвращает список заголовков.

Эта функция открывает файл в режиме чтения и читает каждую строку, используя функцию readlines(). Создается список, называемый заголовком. Цикл for используется для перебора строк с 34 по 90 . В каждом цикле он удаляет символ новой строки, разбивает строку с помощью : в качестве разделителя, а затем добавляет первую строку разделенной строки в список заголовков. После этого мы добавляем заголовок целевой переменной («Spam/No_Spam») к списку заголовков и возвращаем список заголовков.

def get_headers(path_to_header:str):
    file1 = open(path_to_header, 'r')
    Lines = file1.readlines()
    header=[]
    # Strips the newline character and splits with : charater and select the first part
    for i in range(34,90):
        header.append(Lines[i].strip().split(':')[0])
    header.append("Spam/No_Spam")
    return header

Шаг 5 Преобразование и сохранение данных в нужный формат

На этом этапе заголовки и основные данные объединяются, преобразуются и сохраняются в желаемом формате (в нашем случае .csv).

Функция принимает filelist (список путей к разархивированным файлам) и path_to_csv (путь, где будет храниться csv). Вызов вышеуказанной функции get_headers с последним элементом списка файлов (который содержит путь к файлу заголовка) выполняется для получения списка заголовков. Фрейм данных Pandas с именем clean_df создается с использованием pd.read_csv().

pd.read_csv() принимает первый элемент списка файлов (который содержит путь к файлу основных данных) в качестве пути к файлу и списка заголовков в качестве аргумента имен (аргумент имен pd.read_csv() принимает имена столбцов в качестве списка). Создается путь для csvfile путем присоединения data.csv к path_to_csv. .to_csv используется для сохранения CSV-файла dataframe в csvfilepath. Возвращается путь csvfilepath.

def saving_data(filelist:list,path_to_csv:str):
    header=get_headers(filelist[-1])
    clean_df=pd.read_csv(filelist[0],sep=",",names=header)
    if not os.path.exists(path_to_csv):
        os.makedirs(path_to_csv)
    csvfilepath = os.path.join(path_to_csv,"data.csv").replace("\\","/")
    clean_df.to_csv(csvfilepath,index=False)
    return csvfilepath

Шаг 6. Разделите данные на тестовый набор данных Train.

Этот шаг является необязательным и может быть выполнен на более поздних этапах конвейера данных. Набор данных можно разделить на различные библиотеки sklearn.model_selection, такие как train_test_split, StratifiedShuffleSplit и т. д. Но для простоты кода я беру первые 4000 записей в качестве набора данных для обучения и расширяю 601 запись в качестве набора тестовых данных.

Функция принимает csvfilepath (путь, где присутствуют данные .csv) и path_to_train_test (путь директора, где будут храниться поезд и тест) в качестве аргументов. Функция сначала создает clean_dataframe по pd.read_csv(). Затем создаются train_dataframe и test test_dataframe путем разделения первых 4000 записей как train и оставшихся как test соответственно.

Train_filepath и test_filepath создаются путем присоединения train.csv и test.csv соответственно к path_to_train_test.

Затем train_dataframe и test_dataframe сохраняются в формате .csv по пути train_filepath и test_filepath соответственно с помощью функции .to_csv панд.

def train_test(csvfilepath:str,path_to_train_test:str):
    clean_dataframe=pd.read_csv(csvfilepath)
    if not os.path.exists(path_to_train_test):
        os.makedirs(path_to_train_test)
    
    train_dataframe,test_dataframe=clean_dataframe[:4000],clean_dataframe[4000:]
    train_filepath=os.path.join(path_to_train_test,"train.csv").replace("\\","/")
    test_fielpath=os.path.join(path_to_train_test,"test.csv").replace("\\","/")

    train_dataframe.to_csv(train_filepath,index=False)
    test_dataframe.to_csv(test_fielpath,index=False)

Полный код доступен по ссылке Github. Запуск этого кода создаст папку uci_artificats, аналогичную приведенной ниже.


└───uci_artifacts
    ├───clean_data
    │   │   data.csv
    │   │
    │   └───train_test
    │           test.csv
    │           train.csv
    │
    ├───raw_data
    │       data.zip
    │
    └───unzip_data
            spambase.data
            spambase.DOCUMENTATION
            spambase.names

Спасибо за прочтение.