数据分析python代码开发工程化编写逻辑-个人总结

文章目录

  • 团队开发
    • git提交
      • 提交方法
      • 注意细节
  • Byte-compiled / optimized / DLL files
  • C extensions
  • Distribution / packaging
  • PyCharm files
  • Jupyter Notebook
  • Unit test / coverage reports
  • Sphinx documentation
  • Django
  • Flask
    • :thinking:协同开发
  • 细节
  • 模块管理
    • 根目录
      • train.py
      • pred.py
    • data
    • 配置
      • argparse
      • yaml
    • 项目依赖管理
  • 文档
    • README文档
    • 背景
    • 项目目录介绍
    • 安装
    • 快速开始
    • 数据集
    • 方法和技术
    • 结果和可视化
    • 参考资料
    • 日志配置
    • docs(可选)

团队开发

git提交

提交方法

第1次提交方法:

需配置邮箱、git账号密码、在git上创建秘钥、在git上创建仓库

git init

git add .

git commit -m “提交代码备注”

git push

第2+次提交方法

git add .

git commit -m “提交代码备注”

git push

注意细节

上传代码应保证简洁、保证项目安全,按照本规范要求,会产生数据文件、环境配置、日志等。

因此需要额外增加.gitignore做好管理,使用方法

  1. 在.gitignore文件中指定要忽略的文件和目录。例如,如果您要忽略所有.log文件和node_modules目录,您可以在.gitignore文件中输入以下内容:
*.log
node_modules/
  1. 保存并关闭.gitignore文件。
  2. 打开Git Bash或其他终端,并进入您的Git项目的根目录。
  3. 使用以下命令将.gitignore文件添加到Git仓库中:
git add .gitignore

一份.gitignore文件示例。这个示例中包含了一些常见的规则,用于忽略Python项目中一些不必要的文件和目录,例如编译后的文件、Python虚拟环境、打包文件、IDE生成的文件等等。可以根据你的项目需要进行修改和定制。请注意,此示例可能并不适用于所有的Python项目,因此请根据你具体情况进行修改。

🤔协同开发

pycharm专业版可以联合开发

细节

模块管理

项目下如需分配应有以下几个包:

根目录

程序运行的唯一地方,应简洁,且只包含少量文件,至少包括以下文件,其中py文件都需要在开头有文档注释。

train.py

pred.py

data

​ /数据集类别,所有数据集的文件夹命名只能使用英文

​ /script --如数据源来自某种下载方式,应在script中放入下载的sh脚本

​ /描述文档

配置

配置由yaml和argparse完成,区别是

yaml首先可以将全部参数都设置一个默认值,比如网络的层数,激活函数用哪个等等,大多是模型内相关的参数以及train和test使用的数据的地址。

argparse通常设置几个train和test时经常更改的参数,比如训练的epoch,batch_size,learning_rate…

argparse

如下就是标准的argparse用法,每个参数都应有help说明

yaml

argparse接收的是命令行的输入,所以优先级应该是会高一些;假如argparse和yaml文件中都有相同的参数,如果命令行指定了参数,那么代码运行时使用的参数是命令行输入的参数。

推荐使用yaml对需要做配置的模块做配置,将yaml文件放置于根目录下。

如下就是标准的yaml文件

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
# VisDrone2019-DET dataset https://github.com/VisDrone/VisDrone-Dataset by Tianjin University
# Example usage: python train.py --data VisDrone.yaml
# parent
# ├── yolov5
# └── datasets
#     └── VisDrone  ← downloads here (2.3 GB)# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../datasets/VisDrone  # dataset root dir
train: VisDrone2019-DET-train/images  # train images (relative to 'path')  6471 images
val: VisDrone2019-DET-val/images  # val images (relative to 'path')  548 images
test: VisDrone2019-DET-test-dev/images  # test images (optional)  1610 images# Classes
names:0: pedestrian1: people2: bicycle3: car4: van5: truck6: tricycle7: awning-tricycle8: bus9: motor# Download script/URL (optional) ---------------------------------------------------------------------------------------
download: |from utils.general import download, os, Pathdef visdrone2yolo(dir):from PIL import Imagefrom tqdm import tqdmdef convert_box(size, box):# Convert VisDrone box to YOLO xywh boxdw = 1. / size[0]dh = 1. / size[1]return (box[0] + box[2] / 2) * dw, (box[1] + box[3] / 2) * dh, box[2] * dw, box[3] * dh(dir / 'labels').mkdir(parents=True, exist_ok=True)  # make labels directorypbar = tqdm((dir / 'annotations').glob('*.txt'), desc=f'Converting {dir}')for f in pbar:img_size = Image.open((dir / 'images' / f.name).with_suffix('.jpg')).sizelines = []with open(f, 'r') as file:  # read annotation.txtfor row in [x.split(',') for x in file.read().strip().splitlines()]:if row[4] == '0':  # VisDrone 'ignored regions' class 0continuecls = int(row[5]) - 1box = convert_box(img_size, tuple(map(int, row[:4])))lines.append(f"{cls} {' '.join(f'{x:.6f}' for x in box)}\n")with open(str(f).replace(os.sep + 'annotations' + os.sep, os.sep + 'labels' + os.sep), 'w') as fl:fl.writelines(lines)  # write label.txt# Downloaddir = Path(yaml['path'])  # dataset root dirurls = ['https://github.com/ultralytics/yolov5/releases/download/v1.0/VisDrone2019-DET-train.zip','https://github.com/ultralytics/yolov5/releases/download/v1.0/VisDrone2019-DET-val.zip','https://github.com/ultralytics/yolov5/releases/download/v1.0/VisDrone2019-DET-test-dev.zip','https://github.com/ultralytics/yolov5/releases/download/v1.0/VisDrone2019-DET-test-challenge.zip']download(urls, dir=dir, curl=True, threads=4)# Convertfor d in 'VisDrone2019-DET-train', 'VisDrone2019-DET-val', 'VisDrone2019-DET-test-dev':visdrone2yolo(dir / d)  # convert VisDrone annotations to YOLO labels

项目依赖管理

正式上线推荐使用Poetry而不是requirements.txt,因为它会更方便部署,包括自动创建虚拟环境等

使用方法

  1. 使用 poetry init 生成基本的 pyproject.toml 文件。你可以在这个过程中跳过依赖的添加,因为我们将在下一步添加所有依赖。

    poetry init
    
  2. 添加依赖库:

    bashCopy code
    poetry add package_name
    
  3. 添加依赖库:

    poetry add package_name
    

    这将把指定的库添加到项目的 pyproject.toml 文件中。

  4. 移除依赖库:

    poetry remove package_name
    

    这将从项目的 pyproject.toml 文件中移除指定的库。

  5. 安装项目依赖:

    poetry install
    

    这将根据 pyproject.toml 文件中的依赖创建一个虚拟环境,并在其中安装库。

  6. 更新项目依赖:

    poetry update
    

    这将根据 pyproject.toml 文件中的依赖更新 poetry.lock 文件,并重新安装虚拟环境中的库。

  7. 运行项目中的脚本:

    poetry run python your_script.py
    

    这将在虚拟环境中运行指定的 Python 脚本。

  8. 打包项目:

    poetry build
    

这将为项目创建一个源代码分发包(.tar.gz)和一个轮子分发包(.whl)。

文档

README文档

项目至少要有一个README文档,放置于项目根目录下,来解释项目的结构、作用、运行方式。

若代码与机理性强挂钩或数据集复杂,至少再加一个描述性文件对其进行说明

若模块复杂,应在模块下加上README的描述

日志配置

docs(可选)

由于数据分析项目与数据、应用强相关性,看是否有必要在项目的背景说明等,格式为md

本文链接:https://my.lmcjl.com/post/11502.html

展开阅读全文

4 评论

留下您的评论.