Может ли Kedro Создавать круглые слои

#python #kedro

#питон #кедро #python #kedro

Вопрос:

Я пытаюсь добавить атрибуты слоя в свой каталог. Один из распространенных шаблонов, который у меня есть, — это получить некоторые данные ( raw ), очистить их, а затем вывести список частей ( pri ). Затем мне нужны метаданные для тех частей, из которых я беру список частей pri и передаю в функцию, которая получает данные ( raw ). Сам конвейер не является круговым, но kedro, похоже, не нравится, когда я создаю круговые слои.

Есть ли общий шаблон, которого мне не хватает для этого варианта использования?

Можно ли разрешить слоям быть круглыми?

Пример

Я попытался собрать общий пример ниже.

 
raw_truck_sales:
  type: pandas.ParquetDataSet
  filepath: <filepath>
  layer: raw

int_truck_sales:
  type: pandas.ParquetDataSet
  filepath: <filepath>
  layer: int

pri_truck_sales:
  type: pandas.ParquetDataSet
  filepath: <filepath>
  layer: pri

pri_truck_sold_models:
  type: pandas.ParquetDataSet
  filepath: <filepath>
  layer: pri

raw_truck_metadata:
  type: pandas.ParquetDataSet
  filepath: <filepath>
  layer: raw

int_truck_metadata:
  type: pandas.ParquetDataSet
  filepath: <filepath>
  layer: int

pri_truck_metadata:
  type: pandas.ParquetDataSet
  filepath: <filepath>
  layer: pri
  
 nodes = [
    node(
        get_truck_sales,
        inputs=None,
        outputs='raw_truck_sales',
    ),
    node(
        create_int_truck_sales,
        inputs='raw_truck_sales',
        outputs='int_truck_sales',
    ),
    node(
        create_pri_truck_sales,
        inputs='int_truck_sales',
        outputs='pri_truck_sales',
    ),
    node(
        lambda truck_sales: truck_sales[['model']],
        inputs='pri_truck_sales',
        outputs='pri_truck_models_sold',
    ),

    # This node takes the list of trucks sold and gets metadata for them
    # It seems to break kedros layers model by creating a circular reference
    node(
        get_truck_metadata,
        inputs='pri_truck_models_sold',
        outputs='raw_truck_metadata',
    ),
    node(
        create_int_truck_metadata,
        inputs='raw_truck_metadata',
        outputs='int_truck_metadata',
    ),
    node(
        create_pri_truck_metadata,
        inputs='int_truck_metadata',
        outputs='pri_truck_metadata',
    ),
]
  

Комментарии:

1. Я думаю, что лучшее, что можно сделать в этом случае, это просто полностью удалить информацию о слое из этого проблемного набора данных ( pri_truck_sold_models ). Viz достаточно умен, чтобы визуализировать его в логическом месте на основе топологического порядка узла. Мы выводим круговые слои с ошибкой в viz, потому что слои линейны по определению, по крайней мере визуально.

2. Спасибо за отзыв @LimH! Это имеет смысл. Я думаю, что для нас слои не будут работать очень хорошо. Часто мы работаем с набором данных, который содержит подмножество продуктов ( trucks ) в примере выше. и нам нужно получить очень небольшое подмножество данных из гораздо большего набора данных, который может содержать больше, чем просто подмножество. —- Используя приведенный выше пример. В некоторых крайних случаях получение всех метаданных буквально занимает дни, в то время как trucks подмножество занимает секунды. Итак, нам нужна некоторая округлость.

Ответ №1:

О, привет, Вэйлон! Ха-ха.

Не могли бы вы опубликовать всю трассировку стека, которая показывает ошибку?

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

РЕДАКТИРОВАТЬ: Лим Хоанг только что указал, что в вашем примере есть c_pro_truck_models_sold , и если бы это было pro_truck_models_sold , то это было бы циклическим.

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

Смотрите следующее изображение для доказательства.

отброшенный слой, а именно

Комментарии:

1. Исправлена опечатка, спасибо Там. Теперь это имеет смысл благодаря вам и @LimH. Я надеялся улучшить выравнивание между слоями, но я в порядке, не используя слои.

Ответ №2:

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

 | Layer        | Input Layer                                 | Output Layer                                           |
|--------------|---------------------------------------------|--------------------------------------------------------|
| Reference    |                                             | Primary, Feature, Model Input, Model Output, Reporting |
| Raw          |                                             | Intermediate, Primary                                  |
| Intermediate | Raw                                         | Primary                                                |
| Primary      | Raw, Intermediate, Reference                | Feature, Reporting                                     |
| Feature      | Primary, Reference                          | Model Input, Reporting                                 |
| Model Input  | Feature, Reference                          | Reporting                                              |
| Model Output | Model Input                                 | Reporting                                              |
| Reporting    | Primary, Feature, Model Input, Model Output |                                                        |
  

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