关于人工智能:读取创建和运行多个文件的3个Python技巧

38次阅读

共计 3379 个字符,预计需要花费 9 分钟才能阅读完成。

作者 |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/khuyentran…

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

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

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

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

正文完
 0