通过利用软件工程最佳实际,能够交付品质更好数据迷信的我的项目。更好的品质可能是更少的谬误、牢靠的后果和更高的编码效率。
最佳实际都是从谬误中总结进去的,所以这里咱们总结了一些遇到的最常见的谬误,并提供了如何最好地解决这些谬误的办法、想法和资源。
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"
excel_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 且速度更快的列表推导来代替。
能够在上面看到一个示例代码,该代码旨在读取目录中的 CSV 文件。能够看到,在应用列表推导时添很容易保护。
import pandas as pd
import os
DATA_PATH = "data"
filename_list = os.listdir(DATA_PATH)
#### 不好的办法 #####
csv_list = []
for fileaname in filename_list:
csv_list.append(pd.read_csv(os.path.join(DATA_PATH, filename)))
#### 倡议 ####
csv_list = [pd.read_csv(os.path.join(DATA_PATH, filename)) for filename in filename_list]
list comprehensions
csv_list = [pd.read_csv(os.path.join(DATA_PATH,
filename)) for filename in filename_list if
filename.endswith(".csv")]
6、不应用类型正文
类型正文 (或类型提醒) 是为变量调配类型的办法。在 IDE 进行智能感知的提醒时能够为咱们提供批示变量 / 参数的类型。这不仅能够进步咱们开发的速度,也能够对咱们浏览代码有很大的帮忙
def mystery_combine(a, b, times):
return (a + b) * times
如果这么写,咱们基本不晓得 a,b 和 times 的类型
def mystery_combine(a: str, b: str, times: int) -> str:
return (a + b) * times
然而加上了类型正文,咱们就晓得 a 和 b 是字符串 times 是整数
须要阐明的是:python 在 3.5 版本的时候引入了类型正文,python 并不会在执行时查看类型正文,他只是为 IDE 提供了一个不便动态类型查看工具,对动静语言做动态类型查看,来防止一些潜在的谬误。
7、pandas 代码不标准
办法链是 pandas 的一个很棒的个性,然而如果在一行中蕴含了很多的操作,代码可能会变得不可读。
有一个技巧能够让这种形式边的简略,将表达式放入括号中,则能够对表达式的每个组件应用一行。
var_list = ["clicks", "time_spent"]
var_list_Q = [varname + "_Q" for varname in var_list]
#不可读的办法
df_Q = df.groupby("id").rolling(window=3, min_periods=1, on="yearmonth[var_list].mean().reset_index().rename(columns=dict(zip(var_list, var_list_Q)))
#可读性强的办法
df_Q = (
df
.groupby("id")
.rolling(window=3, min_periods=1, on="yearmonth")[var_list]
.mean()
.reset_index()
.rename(columns=dict(zip(var_list, var_list_Q))))
8、不恪守 PEP 约定
刚开始应用 Python 进行编程时,代码可能是简陋并且不可读的,这是因为咱们并没有本人的设计规定来让我的代码看起来更好。如果咱们本人来设计这种规定是麻烦费劲的并且这种规定须要很多的实际,好在 Python 官网有曾经指定好的规定:PEP,它是 Python 的官网款式指南。
尽管 PEP 的规定很多并且很繁琐,咱们能够疏忽了一些 PEP 规定,但能够在 90% 的代码中应用了它们。
9、你不应用编码辅助工具
您想在编码方面大幅提高生产力吗?请开始应用编码辅助工具,它通过奇妙的主动实现、打开文档和提供改良代码的倡议来提供帮忙。
pylance,Kite,tabnine,copilot 都是十分好的抉择。
https://avoid.overfit.cn/post/0f27103a22b9444f80d0c7f4ba03ffde
作者:Abdelilah MOULIDA