我有一堆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
答案 0 :(得分:1)
我会建议你在开始之前先学习object orientation in Python。与Luigi合作会很有帮助。
Luigi确实帮助创建了数据处理管道。管道由任务组成。 (这一步大致是一个阶段)。
关于如何将这些步骤包装到类中的问题。因人而异。我希望我的Luigi课程遵循单一责任原则。这就是每个任务都做一件事,但是对。将来调试也更容易并进行更改。
最后在您提到的示例中,您的课程没有requires()
。此函数很重要,因为它允许您将一个任务的输出提供给另一个任务,从而创建适当的依赖关系树。