十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

创新互联建站是专业的大洼网站建设公司,大洼接单;提供成都网站设计、成都网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行大洼网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
动机
将代码投入生产时,你很可能需要处理代码文件的组织。读取、创建和运行许多数据文件非常耗时。本文将向你展示如何自动
这些技巧为我在数据科学项目中节省了很多时间。我希望你也会发现它们有用!
循环访问目录中的文件
如果我们要像这样读取和处理多个数据:
- ├── 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
 
以下是对上述脚本的解释
现在我们可以访问“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
 
现在,你可以在使用不同模型运行脚本的同时执行其他操作!多方便啊!
结论
祝贺你!你刚刚学习了如何同时自动读取和创建多个文件。你还学习了如何使用不同的参数运行一个文件。手动读、写和运行文件的时间现在可以节省下来,用于更重要的任务。