【问题标题】:dynamic parameters on datasets in KedroKedro 中数据集的动态参数
【发布时间】:2022-11-02 00:34:58
【问题描述】:

我想调用一个 api 来丰富现有的数据集。

现有数据集是目录中配置的 CSVDataSet。
现在我想创建一个节点,用来自 api 的数据丰富 CSVDataSet,我必须为 CSV 文件中的每一行调用它。然后将数据保存到数据库(SQLTableDataSet)中。我的方法是在目录中创建一个APIDataSet 条目,并将其作为节点的输入提供,位于 CSVDataSet 旁边。
这里的问题是,APIDataSet 是静态的(通常数据集似乎非常静态)。我需要在运行时在节点内为 csv 文件中的每个条目调用加载函数。

我没有找到办法做到这一点。这只是一个不好的方法吗?我是否必须在节点内调用 api 而不是创建 APIDataSet?

【问题讨论】:

    标签: kedro


    【解决方案1】:

    所以通常情况下,我们不喜欢我们的节点了解 IO 配置。人们相信功能纯 Python 函数更容易测试、维护和构建。

    通常,我们保持这种区别的方式是让您子类化我们的 APIDataSet / CSVDataSet 或两者,然后添加您的自定义逻辑来完成这一切。

    【讨论】:

    • 在我的情况下,来自 APIDataSet 的数据取决于来自 CSVDataSet 的数据。你对如何实现/设计这个有什么建议吗?
    • 我将 CSVDataSet 子类化,然后使用 requests.get() 进行 API 调用
    • 因此,如果我没记错的话,您将在创建数据集时处理数据。这将隐藏子类中的数据处理。在 kedro 文档中的太空飞行示例中使用这种方法,例如这意味着我将继承 AbstractDataSet ,这将给我一个 DataSet 与与航天飞机合并的公司。想象一下,您只能通过 api 获取航天飞机数据,但无法从 api 一次获取所有航天飞机。
    • 我更喜欢自定义的、延迟加载的 DataSet 之类的东西,它一开始无法迭代,但是当提供数据(例如,shuttle_ids)时,它会加载数据(穿梭数据)。不确定熊猫数据框是否可以做到这一点。刚开始进入数据工程/科学。
    • 是的,您必须隐藏数据集类中的处理逻辑并通过目录定义对其进行配置。在 Kedro 中,节点不应该了解 IO 是一个硬性规定。
    【解决方案2】:

    我已经在我的GDALRasterDataSet 实现中做到了这一点。这个想法是,如果您需要在旅途中丰富数据集,您可以在自定义数据集中重载 load() 方法并在那里传递其他参数。

    您可以看到一个实现here 和一个使用示例here

    您需要做的唯一额外事情是重新编写load() 方法以接受kwargs(第143 行)并编写您自己的_load 方法来丰富您的数据集。其他一切都是样板。

    【讨论】:

    • @datajoely 你能看看这个解决方案吗?它是否符合 kedro 规则,或者至少不与它们相矛盾?
    猜你喜欢
    • 2023-02-10
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-24
    • 2022-12-21
    • 1970-01-01
    相关资源
    最近更新 更多