咱们在用Python进行机器学习建模项目的时候,每一个人都会有本身的一套项目文件管理的习惯,我本身也有一套方法,是本身曾经踩过的坑总结出来的,如今在这里分享一下给你们,但愿多少有些地方能够给你们借鉴。html
- 项目文件事先作好归档
每次开始一个新工做的时候,之前的我老是贪图方便,Code、Data、文档都集中放在一个文件夹内,看起来很乱,一度让回溯过程十分痛苦,或者是换了部电脑,文件全都运行不行了,须要自行修改路径,十分痛苦。python
通过本身一番探索,你们能够大体将项目分红几个子文件夹,code放在主文件夹里:git
- 永远不要手动修改源数据而且作好备份
咱们须要对源数据进行好备份,方便咱们下一次进行回溯,能够进行下一步的操做或者是对中间步骤的修改,并且,对代码等其余文件也是须要作好备份的,以避免出现意外丢失。github
这里来自良许Linux的一篇文章,推荐了4个工具:web
更多的工具介绍和使用我这边就不展开,你们能够去自行了解呗。api
- 作好路径的正确配置
不少同窗在写路径的时候都很喜欢直接用绝对路径,虽然通常状况下不会有什么问题,但若是代码共享给其余人学习或者运行的时候,问题就来了,不少状况下都不能直接跑通,session
这里建议:机器学习
# 设置主目录 HOME_PATH = r'E:\ML\190615- PROJECT1' # 读取数据 data = open(HOME_PATH+'/data/processed/test1.csv') data = pd.read_csv(data) data.head()
- 代码必要的地方作好备注与说明
这个我相信大多数人都感同身受了,不信?拿回一个月前本身写的代码看看吧,看一下能看懂多少(若是没有作好备注说明的话)ide
- 加速你的Python循环代码
这里推荐云哥的一篇文章:24式加速你的python:函数
https://mp.weixin.qq.com/s/8bWm4NjHAam-fIeC4a29cA
收藏起来,多看多几回,养成好习惯呗,这样子你写代码才会愈来愈快~
- 可视化你的循环代码进度
这里介绍一个Python库,tqdm,先安装一下:pip install tqdm
这个是一个能够显示循环进度的库,有了它就能够更加指挥若定了。
你们能够看下面的例子:
- 使用高效的异常捕获工具
异常bug定位,之前的我常常也是一条print()函数走到底,虽说也没什么问题,但效率上仍是会比较慢,后来发现了一个叫PySnooper的装饰器,仿佛发现了新大陆。
咱们通常debug,都是在咱们可能以为会有问题的地方,去打印输出,看下实际输出了什么,而后思考问题所在,这须要咱们去改code,很是细致地改,相比较直接加个装饰器,是十分麻烦的。
你们能够看看Example:
import pysnooper @pysnooper.snoop('./log/file.log') def number_to_bits(number): if number: bits = [] while number: number, remainder = divmod(number, 2) bits.insert(0, remainder) return bits else: return [0] number_to_bits(6)
咱们把函数每一步的输出都保存为file.log,咱们能够直接去看到底哪里出了问题。
📚 项目地址:https://github.com/cool-RR/pysnooper
https://mp.weixin.qq.com/s/zqFPVfmPa-qsPUibzQdcjQ
- 要多考虑代码健壮性
何为代码的健壮性,顾名思义,就是能够抵挡得住各类异常场景的测试,异常处理工做由“捕获”和“抛出”两部分组成。“捕获”指的是使用 try ... except 包裹特定语句,稳当的完成错误流程处理。而恰当的使用 raise 主动“抛出”异常,更是优雅代码里必不可少的组成部分,下面总结几点供你们参考:
1)知道要传入的参数是什么,类型,个数....(异常处理,逻辑判断)
def add(a, b): if isinstance(a, int) and isinstance(b, int): return a+b else: return '参数类型错误' print(add(1, 2)) print(add(1, 'a'))
2)只作最精准的异常捕获
咱们有的时候想着让脚本work才是王道,因此无论三七二十一就搞一个大大的try...except把整块代码包裹起来,但这样很容易把本来该被抛出的 AttibuteError 吞噬了。从而给咱们的 debug 过程增长了没必要要的麻烦。
因此,咱们永远只捕获那些可能会抛出异常的语句块,并且尽可能只捕获精确的异常类型,而不是模糊的 Exception。
from requests.exceptions import RequestException def save_website_title(url, filename): try: resp = requests.get(url) except RequestException as e: print(f'save failed: unable to get page content: {e}') return False # 这段正则操做自己就是不该该抛出异常的,因此咱们不必使用 try 语句块 # 假如 group 被误打成了 grop 也不要紧,程序立刻就会经过 AttributeError 来 # 告诉咱们。 obj = re.search(r'<title>(.*)</title>', resp.text) if not obj: print('save failed: title tag not found in page content') return False title = obj.group(1) try: with open(filename, 'w') as fp: fp.write(title) except IOError as e: print(f'save failed: unable to write to file {filename}: {e}') return False else: return True
3)异常处理不该该喧宾夺主
像上一条说到的异常捕获要精准,但若是每个都很精准的话,其实咱们的代码里就会有不少try...except语句块,以致于扰乱核心代码,代码总体阅读性。
这里,咱们能够利用上下文管理器来改善咱们的异常处理流程,简化重复的异常处理逻辑。
class raise_api_error: """captures specified exception and raise ApiErrorCode instead :raises: AttributeError if code_name is not valid """ def __init__(self, captures, code_name): self.captures = captures self.code = getattr(error_codes, code_name) def __enter__(self): # 该方法将在进入上下文时调用 return self def __exit__(self, exc_type, exc_val, exc_tb): # 该方法将在退出上下文时调用 # exc_type, exc_val, exc_tb 分别表示该上下文内抛出的 # 异常类型、异常值、错误栈 if exc_type is None: return False if exc_type == self.captures: raise self.code from exc_val return False
在上面的代码里,咱们定义了一个名为 raise_api_error 的上下文管理器,它在进入上下文时什么也不作。可是在退出上下文时,会判断当前上下文中是否抛出了类型为 self.captures 的异常,若是有,就用 APIErrorCode 异常类替代它。
使用上下文管理器后,简洁的代码以下:
def upload_avatar(request): """用户上传新头像""" with raise_api_error(KeyError, 'AVATAR_FILE_NOT_PROVIDED'): avatar_file = request.FILES['avatar'] with raise_api_error(ResizeAvatarError, 'AVATAR_FILE_INVALID'),\ raise_api_error(FileTooLargeError, 'AVATAR_FILE_TOO_LARGE'): resized_avatar_file = resize_avatar(avatar_file) with raise_api_error(Exception, 'INTERNAL_SERVER_ERROR'): request.user.avatar = resized_avatar_file request.user.save() return HttpResponse({})
我经常使用的4个备份工具——良许Linux
好玩的Python库tqdm
24式加速你的python
https://mp.weixin.qq.com/s/8bWm4NjHAam-fIeC4a29cA
Errors and Exceptions
掌握Python异常处理,看这篇文章就对了 | 鹅厂实战
搞不清楚Python的异常怎么用?
https://baijiahao.baidu.com/s?id=1607836559889635254&wfr=spider&for=pc