2016-05-16 107 views
1

我有一堆python文件,爲各種數據源做端到端的文件處理。Luigi每天運行熊貓腳本?

例如,survey.py會用熊貓讀取文件,添加列,重命名內容,做一些計算,然後將修改的文件保存回磁盤。

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

哦,順便說一句。我從來沒有在我的任何代碼中使用過類,所以我不習慣它。 – trench

回答

1

我會建議你在進入這個之前學習object orientation in Python。與Luigi合作會有幫助。

Luigi的確幫助創建數據處理管道。管道由任務組成。 (這大概是每一步的一類)。

關於如何將這些步驟包裝到類中的問題。因人而異。我喜歡遵循單一責任原則讓我的Luigi班上課。這是每個任務做一件事,但是正確的。未來的調試和更改也更容易。

最後在你提到的例子中,你有沒有requires()的類。這個函數非常重要,因爲它允許您將一個任務的輸出提供給另一個任務,從而創建適當的依賴關係樹。

+2

謝謝,我通讀了鏈接。我非常習慣將文件讀入內存(熊貓),然後對其進行處理,如添加/刪除/重命名列,執行計算,聚合或連接數據等。所有這些事情都需要在文件仍然存在時完成在內存中,每個文件都會有所不同。您是否遇到過使用類來清理文件或執行大量文件IO操作的教程?有些東西看起來像是需要明確的(例如將一個文件的id_col重命名爲employee_id,將另一個文件的id_col重命名爲customer_id等) – trench

+1

我通常將管道本身和業務邏輯分開,所以我建議您另一個帶'do_stuff()'函數的python文件,然後導入它並在luigi任務中運行。這樣您就不會混淆數據管道邏輯和業務邏輯,並且會盡可能地保持任務。 –