前言
通过应用软件工程最佳实践,可以交付质量更好的数据科学项目。更好的质量意味着更少的错误、可靠的结果和更高的编码效率。
最佳实践都是从错误中总结出来的,这里总结了最常见的错误,并提供了如何最好地解决这些错误的方法、想法和资源。
1. 不使用虚拟环境
这本身不是编码问题,但我认为每种类型的项目进行环境隔离是一个非常好的实践。
为什么要为每个项目使用专用环境呢?
第一个原因是 Python 本身包管理的问题,我们想尽量减少包和版本之间的冲突。
另外一个原因是代码和依赖可以方便地部署到任意的位置。
使用虚拟环境可以从 Anaconda 或 Pipenv 开始。如果想更深入,那么 Docker 是首选。
2. 过度使用 Jupyter Notebooks
Notebooks 非常适合用于教育目的和做一些快速而复杂的分析工作,但它不能作为一个好的 IDE。
一个好的 IDE 是应对数据科学任务时的真正武器,可以极大地提高工作效率。
Notebooks 很适合做实验,而且可以轻松地将结果展示给其他人。但是它很容易出错,当涉及到执行长期、协作和可部署的项目时,最好还是使用 IDE,例如 VSCode、PyCharm、Spyder 等。
3. 使用绝对而不是相对路径
绝对路径的最大问题是无法进行方便部署,解决这个问题的主要方法是将工作目录设置为项目根目录,并且不要在项目中包含项目目录外的文件,并且在代码中的所有路径均使用相对路径。
import pandas as pd
import numpy as np
import os
# 错误的方式
excel_path1 = "C:\\Users\\abdelilah\\Desktop\\mysheet1.xlsx"
elcel_path2 = "C:\\Users\\abdelilah\\Desktop\\mysheet2.xlsx"
mydf1 = pd.read_excel(excel_path1)
mydf2 = pd.read_excel(excel_path2)
# 正确的方式
DATA_DIR = "data"
# 将要读取的文件复制到 data 目录
crime06_filename = "CrimeOneYearofData_2006.xlsx"
crime07_filename = "CrimeOneYearofData_2007.xlsx"
crime06_df = pd.read_excel(os.path.join(DATA_DIR, crime06_filename))
crime07_df = pd.read_excel(os.path.join(DATA_DIR, crime07_filename))
4. 不处理警告
当我们的代码能够运行但产生奇怪的警告消息,我们很高兴终于让代码运行并收到了有意义的输出。但是我们需要处理这些警告吗?
首先,警告本身并不是错误,但它们是会引起我们对潜在错误或问题的提示。当你的代码中能够运行成功但可能不是它的预期方式时,警告就会出现。
我遇到的最常见的警告是 Pandas 的 SettingWithCopyWarning 和 DeprecationWarning。
SettingWithCopyWarning 最大的原因是 Pandas 检测到链式赋值(Chained Assignment)时发生的警告,我们应该避免对链式索引的结果赋值,因为这个操作有可能会报 warning 也有可能不会报。
DeprecationWarning 通常指出 Pandas 弃用了某些功能,并且您的代码在使用更高版本时会中断。
这里的建议并不是要处理所有的警告,但是一定要对所有警告产生的原因有所了解,要知道在特定项目中那些警告是可以忽略的,那些警告的出现对结果会有影响,应当避免。
5. 没有使用(很少使用)列表推导式
列表推导式是 Python 的一个非常强大的特性。许多 for 循环可以用更易读、更 Python 且速度更快的列表推导来代替。


