作者|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):   passdf = 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 osimport pandas as pddef 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.csvdata/data2.csvdata/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 joblibimport 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 sysimport 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 1Loading 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 trainingLoading model from model/model1/XGBoost/version_2 for trainingLoading model from model/model1/XGBoost/version_3 for trainingLoading model from model/model1/XGBoost/version_4 for training

当初,你能够在应用不同模型运行脚本的同时执行其余操作!多不便啊!

论断

恭喜你!你刚刚学习了如何同时主动读取和创立多个文件。你还学习了如何应用不同的参数运行一个文件。手动读、写和运行文件的工夫当初能够节省下来,用于更重要的工作。

如果你对文章中的某些局部感到困惑,我在这个仓库中创立了具体的例子:https://github.com/khuyentran...

原文链接:https://towardsdatascience.co...

欢送关注磐创AI博客站:
http://panchuang.net/

sklearn机器学习中文官网文档:
http://sklearn123.com/

欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/