作者|Khuyen Tran
編譯|VK
來源|Towards Data Science
動機
將代碼投入生產時,你很可能需要處理代碼文件的組織。讀取、創建和運行許多數據文件非常耗時。本文將向你展示如何自動
-
循環訪問目錄中的文件
-
如果不存在嵌套文件,創建它們
-
使用bash for loop運行一個具有不同輸入的文件
這些技巧為我在數據科學項目中節省了很多時間。我希望你也會發現它們有用!
循環訪問目錄中的文件
如果我們要像這樣讀取和處理多個數據:
├── data
│ ├── data1.csv
│ ├── data2.csv
│ └── data3.csv
└── main.py
我們可以嘗試一次手動讀取一個文件
import pandas as pd
def process_data(df):
pass
df = pd.read_csv(data1.csv)
process_data(df)
df2 = pd.read_csv(data2.csv)
process_data(df2)
df3 = pd.read_csv(data3.csv)
process_data(df3)
當我們有3個以上的數據時,這是可以的,但不是有效的。如果我們在上面的腳本中只更改了數據,為什么不使用for循環來訪問每個數據呢?
下面的腳本允許我們遍歷指定目錄中的文件
import os
import pandas as pd
def loop_directory(directory: str):
'''循環目錄中的文件'''
for filename in os.listdir(directory):
if filename.endswith(".csv"):
file_directory = os.path.join(directory, filename)
print(file_directory)
pd.read_csv(file_directory)
else:
continue
if __name__=='__main__':
loop_directory('data/')
data/data3.csv
data/data2.csv
data/data1.csv
以下是對上述腳本的解釋
for filename in os.listdir(directory)
:循環訪問特定目錄中的文件if filename.endswith(".csv")
:訪問以“.csv”結尾的文件file_directory = os.path.join(directory, filename)
:連接父目錄('data')和目錄中的文件。
現在我們可以訪問“data”目錄中的所有文件!
如果不存在嵌套文件,創建它們
有時,我們可能希望創建嵌套文件來組織代碼或模型,這使得將來更容易找到它們。例如,我們可以使用“model 1”來指定特定的特征工程。
在使用模型1時,我們可能需要使用不同類型的機器學習模型來訓練我們的數據(“model1/XGBoost”)。
在使用每個機器學習模型時,我們甚至可能希望保存模型的不同版本,因為模型使用的超參數不同。
因此,我們的模型目錄看起來像下面這樣復雜
model
├── model1
│ ├── NaiveBayes
│ └── XGBoost
│ ├── version_1
│ └── version_2
└── model2
├── NaiveBayes
└── XGBoost
├── version_1
└── version_2
對於我們創建的每個模型,手動創建一個嵌套文件可能需要很多時間。有沒有辦法讓這個過程自動化?是的,os.makedirs(datapath)
。
def create_path_if_not_exists(datapath):
'''如果不存在,則創建新文件並保存數據'''
if not os.path.exists(datapath):
os.makedirs(datapath)
if __name__=='__main__':
create_path_if_not_exists('model/model1/XGBoost/version_1')
運行上面的文件,你應該會看到嵌套文件'model/model2/XGBoost/version_2'自動創建!
現在你可以將模型或數據保存到新目錄中!
import joblib
import os
def create_path_if_not_exists(datapath):
'''如果不存在就創建'''
if not os.path.exists(datapath):
os.makedirs(datapath)
if __name__=='__main__':
# 創建目錄
model_path = 'model/model2/XGBoost/version_2'
create_path_if_not_exists(model_path)
# 保存
joblib.dump(model, model_path)
Bash for Loop:使用不同的參數運行一個文件
如果我們想用不同的參數運行一個文件呢?例如,我們可能希望使用相同的腳本來使用不同的模型來預測數據。
import joblib
# df = ...
model_path = 'model/model1/XGBoost/version_1'
model = joblib.load(model_path)
model.predict(df)
如果一個腳本需要很長時間才能運行,而我們有多個模型要運行,那么等待腳本運行完畢然后運行下一個腳本將非常耗時。有沒有一種方法可以告訴計算機用一個命令行運行1,2,3,10,然后去做其他的事情。
是的,我們可以用for bash for loop。首先,我們使用系統argv使我們能夠解析命令行參數。如果要覆蓋命令行上的配置文件,也可以使用hydra等工具。
import sys
import joblib
# df = ...
model_type = sys.argv[1]
model_version = sys.argv[2]
model_path = f'''model/model1/{model_type}/version_{model_version}'''
print('Loading model from', model_path, 'for training')
model = joblib.load(model_path)
mode.predict(df)
>>> python train.py XGBoost 1
Loading model from model/model1/XGBoost/version_1 for training
太好了!我們剛剛告訴我們的腳本使用模型XGBoost,version 1來預測命令行上的數據。現在我們可以使用bash循環遍歷模型的不同版本。
如果你可以使用Python執行for循環,那么也可以在下面這樣的終端上執行
$ for version in 2 3 4
> do
> python train.py XGBoost $version
> done
鍵入Enter分隔行
輸出:
Loading model from model/model1/XGBoost/version_1 for training
Loading model from model/model1/XGBoost/version_2 for training
Loading model from model/model1/XGBoost/version_3 for training
Loading model from model/model1/XGBoost/version_4 for training
現在,你可以在使用不同模型運行腳本的同時執行其他操作!多方便啊!
結論
祝賀你!你剛剛學習了如何同時自動讀取和創建多個文件。你還學習了如何使用不同的參數運行一個文件。手動讀、寫和運行文件的時間現在可以節省下來,用於更重要的任務。
如果你對文章中的某些部分感到困惑,我在這個倉庫中創建了具體的例子:https://github.com/khuyentran1401/Data-science/tree/master/python/python_tricks
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方文檔:
http://sklearn123.com/
歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/