2

我有一堆 python 文件,它们对各种数据源进行端到端的文件处理。

例如,survey.py 将使用 pandas 读取文件、添加列、重命名内容、进行一些计算,然后将修改后的文件保存回磁盘。

driver.py 将对该文件遵循相同的过程,等等。这种相同的结构正在发生在数十个文件中。

然后我有一个名为 process_all 的文件,它基本上只是按特定顺序运行每个 python 文件(一些文件依赖于其他文件)。经过进一步研究,我偶然发现了一个名为 luigi 的库,如果我需要扩展,它似乎可以更稳健地完成相同的任务。

问题:我是继续编写单独的 .py 文件来处理数据,还是将所有这些东西都放在我的 luigi 类中?我假设我要处理的每个原始文件都有一个类,对吗?

还是我写出 luigi 类中的所有处理步骤,比如下面的 CleanDriver 类?这似乎会变得非常冗长,因为很多这些单独的代码文件每个都是 20-50 行,而且有几十行。

class CleanSurvey(luigi.Task):
    date_interval = luigi.DateIntervalParameter()

    def run(self):
        os.system('../py_files/run_ftp.py')

    def output(self):
        return luigi.LocalTarget(path + 'test_survey.csv')

class CleanDriver(luigi.Task):
    date_interval = luigi.DateIntervalParameter()

    def run(self):
        df = pd.read_csv('../file.csv')
        df['col5'] = do stuff
        df.rename(columns={:}, inplace=True)

    def output(self):
        return luigi.LocalTarget(path + 'test_driver.csv')

if __name__ == '__main__':
    luigi.run
4

1 回答 1

1

我会建议你在开始之前学习Python 中的面向对象。与 Luigi 一起工作会很有帮助。

Luigi 确实通过帮助创建数据处理管道来提供帮助。管道由任务组成。(这大约是每一步的一个类)。

关于您关于如何将这些步骤包装到类中的问题。YMMV。我喜欢让我的 Luigi 课程遵循单一责任原则。那就是每个任务只做一件事,但是对的。将来调试和进行更改也更容易。

最后,在您提到的示例中,您有没有requires(). 此功能很重要,因为它允许您将一项任务的输出提供给另一项任务,从而创建适当的依赖关系树。

于 2016-06-20T10:32:45.630 回答