Новая библиотека Python для конвейеров данных, готовых к производству

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

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

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

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

Любой код, который используется в процессе принятия бизнес-решений, следует рассматривать как производственный код

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

  • Управление версиями - используйте git или аналогичный инструмент для регулярного сохранения изменений, независимо от того, работаете ли вы в одиночку или в команде.
  • Воспроизводимость. У вас должна быть возможность перенести проект на другой компьютер и запустить его без значительных усилий или перенастройки.
  • Соблюдайте стандарты. Общая структура проекта, стандартные правила кодирования и инструменты.
  • Документация - автоматизированная документация, позволяющая поддерживать документацию в актуальном состоянии с учетом кода.
  • Модульность. Код можно легко выполнить и протестировать.

Более подробно об этих принципах можно прочитать в полезном сообщении в блоге Томаса Хейскенса из QuantumBlack.

Что такое Кедро?

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

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

Kedro был создан QuantumBlack, аналитической фирмой, которая была приобретена консалтинговым гигантом McKinsey & Company в 2015 году. QuantumBlack использовала Kedro в более чем 60 проектах с McKinsey и теперь решила открыть его исходный код. Их цель - дать возможность сотрудникам, клиентам и сторонним разработчикам использовать Kedro и развивать его. Расширяя этот открытый инструмент для своих нужд, специалисты по обработке данных могут эффективно выполнять свои обычные задачи и, возможно, делиться своими улучшениями с сообществом.

Кедро - это планировщик рабочих процессов?

Kedro - это не планировщик рабочих процессов, как Airflow и Luigi. Kedro упрощает создание прототипа конвейера данных, а Airflow и Luigi - это взаимодополняющие фреймворки, которые отлично подходят для управления развертыванием, планированием, мониторингом и предупреждением. Трубопровод Kedro похож на машину, которая строит автомобильную деталь. Airflow или Луиджи приказывают различным машинам включаться или выключаться, чтобы работать вместе и производить автомобиль. QuantumBlack разработал плагин Kedro-Airflow, который обеспечивает более быстрое создание прототипа и снижает барьеры для входа, связанные с перемещением конвейеров для обоих планировщиков рабочих процессов.

Что мне нужно знать?

Документация Kedro предназначена для новичков, которые могут начать создавать свои собственные проекты Kedro (на Python 3.5+). Если у вас есть только самые базовые знания Python, вам может показаться, что процесс обучения более сложен, но смиритесь с этим и следуйте документации в качестве руководства.

Пятнадцатиминутный космический полет с Кедро

Мое простое пятнадцатиминутное руководство будет основано на следующем сценарии:

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

Подготовка к настройке

Первый шаг - установить kedro с помощью pip install kedro в новую виртуальную среду Python 3.5+ (мы рекомендуем conda) и подтвердить, что он правильно установлен, набрав

kedro info

Вы должны увидеть изображение Kedro, как показано ниже:

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

Кедро рабочий процесс

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

Настройте шаблон проекта

Для простоты команда QuantumBlack предоставила весь необходимый вам код, поэтому вам просто нужно клонировать пример проекта из его Github Repo. Вам не нужно создавать шаблон проекта в этом руководстве.

Когда у вас есть код для проекта Spaceflights, чтобы убедиться, что у вас есть необходимые зависимости для него, запустите следующее в виртуальной среде Python 3.5+:

kedro install

Настроить данные

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

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

В этом руководстве используются три набора данных для космических компаний, доставляющих клиентов на Луну и обратно, и используются два формата данных: .csv и .xlsx. Файлы хранятся в папке data/01_raw/ каталога проекта.

Для работы с предоставленными наборами данных все проекты Kedro имеют файл conf/base/catalog.yml, который действует как реестр используемых наборов данных. Зарегистрировать набор данных так же просто, как добавить именованную запись в файл .yml, чтобы указать местоположение файла (путь), параметры для данного набора данных, тип данных и управление версиями. Kedro поддерживает несколько типов данных, например csv, и если вы посмотрите файл catalog.yml для учебника по космическим полетам, вы увидите следующие записи для используемых наборов данных:

companies:
  type: CSVLocalDataSet
  filepath: data/01_raw/companies.csv
reviews:
  type: CSVLocalDataSet
  filepath: data/01_raw/reviews.csv

Чтобы проверить, правильно ли Kedro загружает данные и проверить первые пять строк данных, откройте окно терминала и запустите сеанс IPython в каталоге проекта Kedro (и просто введите (exit(), если вы хотите завершить сеанс и продолжить руководство):

kedro ipython
io.load(‘companies’).head()

Создать и запустить конвейер

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

  • Напишите и задокументируйте свои функции узла
  • Создайте свой конвейер (ы), указав входы и выходы для каждого из его узлов.
  • Запустите Kedro, выбирая, запускать ли узлы, последовательно или параллельно.

Конвейер обработки данных

Мы рассмотрели необработанные наборы данных для проекта Spaceflights, и теперь пора рассмотреть конвейер инженерии данных, который обрабатывает данные и подготавливает их для модели в конвейере обработки данных. Этот конвейер предварительно обрабатывает два набора данных и объединяет их с третьим в главную таблицу.

В файле data_engineering.py внутри папки узлов вы найдете функции preprocess_companies и preprocess_shuttles (указанные как узлы в конвейере в pipeline.py). Каждая функция принимает фрейм данных и выводит предварительно обработанные данные, preprocessed_companies и preprocessed_shuttles соответственно.

Когда Kedro запускает конвейер разработки данных, он определяет, зарегистрированы ли наборы данных в каталоге данных (conf/base/catalog.yml). Если набор данных зарегистрирован, он автоматически сохраняется по указанному пути без необходимости указывать какой-либо код в самой функции. Если набор данных не зарегистрирован, Kedro сохраняет его в памяти для запуска конвейера и впоследствии удаляет.

В учебнике предварительно обработанные данные регистрируются в conf/base/catalog.yml:

preprocessed_companies:
  type: CSVLocalDataSet
  filepath: data/02_intermediate/preprocessed_companies.csv
preprocessed_shuttles:
  type: CSVLocalDataSet
  filepath: data/02_intermediate/preprocessed_shuttles.csv

CSVLocalDataSet выбран из-за его простоты, но вы можете выбрать любой другой доступный класс реализации набора данных для сохранения данных, например, в таблицу базы данных, облачное хранилище (например, S3, Azure Blob Store и т. Д.) И другие.

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

Пайплайн науки о данных

Конвейер науки о данных, который строит модель, использующую наборы данных, состоит из модели прогнозирования цен, в которой используется простая реализация LinearRegression из библиотеки scikit-learn. Код находится в файле src/kedro_tutorial/nodes/price_prediction.py.

Размер теста и параметры случайного состояния для модели прогнозирования указаны в conf/base/parameters.yml, и Kedro передает их в каталог при выполнении конвейера.

Объединение трубопроводов

Конвейеры проекта указаны в pipeline.py:

def create_pipeline(**kwargs):
  de_pipeline = Pipeline(
    [
      node(preprocess_companies, “companies”, “preprocessed_companies”),
      node(preprocess_shuttles, “shuttles”, “preprocessed_shuttles”),
      node(create_master_table,[“preprocessed_shuttles”, “preprocessed_companies”, “reviews”],“master_table”,),
    ],
    name=”de”,
  )
ds_pipeline = Pipeline(
    [
      node(split_data,[“master_table”, “parameters”],[“X_train”, “X_test”, “y_train”, “y_test”],),
      node(train_model, [“X_train”, “y_train”], “regressor”),
      node(evaluate_model, [“regressor”, “X_test”, “y_test”], None),
    ],
    name=”ds”,
  )
return de_pipeline + ds_pipeline

de_pipeline будет предварительно обрабатывать данные, а затем использовать create_master_table для объединения preprocessed_shuttles, preprocessed_companies и reviews в набор данных master_table. ds_pipeline затем создаст элементы, обучит и оценит модель. Первый узел ds_pipeline выводит 4 объекта: X_train, X_test, y_train, y_test], которые затем используются для обучения модели и, в последнем узле, для оценки модели.

Два конвейера объединяются в de_pipeline + ds_pipeline. Порядок, в котором вы добавляете конвейеры вместе, не имеет значения, поскольку Kedro автоматически определяет правильный порядок выполнения для всех узлов. Такой же общий конвейер будет, если вы укажете ds_pipeline + de_pipeline.

Оба конвейера будут выполнены, когда вы вызовете kedro run, и вы должны увидеть результат, подобный следующему:

Если у вас возникли проблемы с запуском и запуском кода учебника, вам следует убедиться, что вы работаете в среде Python 3.5 и у вас установлены все зависимости для проекта. Если проблемы по-прежнему возникают, вам следует перейти в Stack Overflow, чтобы получить рекомендации от сообщества, и, если поведение, которое вы наблюдаете, кажется проблемой для Kedro, вы можете поднять вопрос в репозитории Kedro на Github.

Кедро бегуны

Есть два разных способа запустить трубопровод Kedro. Вы можете указать:

  • SequentialRunner - запускает ваши узлы последовательно: как только узел выполнил свою задачу, запускается следующий
  • ParallelRunner - ваши узлы работают параллельно: независимые узлы могут работать одновременно, что позволяет вам использовать преимущества нескольких ядер ЦП и быть более эффективным, когда в вашем конвейере есть независимые ветви. Обратите внимание, что ParallelRunner выполняет распараллеливание задач (т.е. может запускать несколько задач одновременно), но не распараллеливает вычисления внутри задачи.

По умолчанию Kedro использует SequentialRunner, когда вы вызываете kedro run. Переключиться на использование ParallelRunner так же просто, как установить дополнительный флаг, как показано ниже:

kedro run — parallel

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

Взносы приветствуются!

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

Благодарности

Пример космических полетов основан на учебнике, написанном командой Кедро в QuantumBlack Labs (Йетунде Дада, Иван Данов, Дмитрий Дерябин, Лорена Балан, Гордон Ригли, Киёхито Куни, Насеф Хан, Ричард Вестенра и Николаос Цаусис), которые любезно предоставили предоставили мне ранний доступ к их коду и документации, чтобы подготовить этот учебник для TowardsDataScience. Спасибо всем!