最佳实践源于错误,因此在这里我们总结了一些最常见的错误,并提供了有关如何最好地修复这些错误的方法、想法和资源。1.不使用虚拟环境这本身不是编码问题,但我仍然认为为每一类项目隔离环境是一个非常好的做法。为什么要为每个项目使用专用环境?第一个原因是Python自身包管理的问题。我们希望尽量减少包和版本之间的冲突。另一个原因是我们的代码和依赖项可以使用可以从Anaconda或Pipenv启动的虚拟环境轻松部署到任何位置。如果你想更深入,那么Docker是首选。2.过度使用JupyterNotebooksNotebooks非常适合用于教育目的和进行一些快速和复杂的分析,但它并不是一个好的IDE。一个好的IDE是处理数据科学任务的真正武器,可以大大提高您的工作效率。笔记本非常适合进行实验并轻松向他人展示结果。但它容易出错,当涉及到执行长期、协作和可部署的项目时,最好使用IDE,如VScode、Pycharm、Spyder等。3.使用绝对路径而不是相对路径最大的问题是绝对路径是部署不方便。解决这个问题的主要方法是将工作目录设置为项目根目录,并且在项目中不包含项目目录之外的文件,并且在代码中所有路径都使用相对路径。importpandasaspdimportnumpyasnpimportos####WRONGWAY#####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"#要读取的文件Copy到数据目录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_excelin(DA_path.))4.不要处理警告当我们的代码可以运行但产生奇怪的警告消息时,我们很高兴最终让代码运行并接收有意义的输出。但是我们需要处理这些警告吗?首先,警告本身并不是错误,但它们是对潜在错误或问题的提醒。当您的代码中的某些行为成功但可能不是预期的方式时,会出现警告。我遇到的最常见警告是Pandas的“SettingwithCopyWarning”和“DeprecationWarning”。SettingwithCopyWarning最大的原因是Pandas检测到链式赋值(ChainedAssignment)时出现的警告。我们应该避免分配链式索引的结果,因为此操作可能会或可能不会报告警告。DeprecationWarning通常表示某些功能已被Pandas弃用,您的代码将在使用更高版本时中断。这里的建议不是对所有的warning都去处理,但是一定要了解所有warning的原因,知道在具体的项目中哪些warning可以忽略,那些warning的出现会影响结果,应该避免。5.Listcomprehensionsarenotused(很少使用)Listcomprehensions是python的一个非常强大的特性。许多for循环可以替换为更具可读性、pythonic和更快的列表理解。下面您可以看到一个示例代码,旨在读取目录中的CSV文件。如您所见,Tim在使用列表推导时易于维护。importpandasaspdimportosDATA_PATH="data"filename_list=os.listdir(DATA_PATH)####坏方法#####csv_list=[]forfileanameinfilename_list:csv_list.append(pd.read_csv(os.path.join(DATA_PATH,filename)))####建议####csv_list=[pd.read_csv(os.path.join(DATA_PATH,filename))forfilenameinfilename_list]listcomprehensionscsv_list=[pd.read_csv(os.path.join(DATA_PATH,filename))forfilenameinfilename_listiffilename.endswith(".csv")]6.不要使用类型注释类型注释(或类型提示)是为变量分配类型的方法。IDE在进行intellisense提示时,可以为我们提供指标变量/参数的类型。这样不仅可以提高我们开发的速度,对我们阅读代码也有很大的帮助,b和times的类型defmystery_combine(a:str,b:str,times:int)->str:return(a+b)*times但是有了类型注解,我们知道a和b是字符串,times是整数。描述是:python在3.5版本引入了类型注解,python在执行过程中不检查类型注解,它只是为IDE提供一个方便的静态类型检查工具,对动态语言做静态类型检查,避免一些潜在的bug。7.pandas代码不规范。方法链是pandas的一大特色,但是如果一行中包含很多操作,代码可能会变得不可读。有一个技巧可以使这种方式更容易,将表达式放在括号中,您可以为表达式的每个组件使用一行。var_list=["clicks","time_spent"]var_list_Q=[varname+"_Q"forvarnameinvar_list]#unreadablemethoddf_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)))#Readablemethoddf_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.刚开始用Python编程时不遵守PEP协议,代码可能会很丑陋且不可读,因为我们没有自己的设计规则来使我的代码看起来更好。如果我们自己设计这样的规则,是很费力的,需要大量的练习。好在Python官方有规定的规则:PEP,也就是Python的官方风格指南。虽然PEP的规则很多而且繁琐,但是我们可以忽略一些PEP规则,但是我们可以在90%的代码中使用它们。9.你不使用编码辅助工具你想在编码方面大幅提高你的生产力吗?开始使用CodingAssist,它有助于巧妙地自动完成、打开文档并提供改进代码的建议。pylance、Kite、tabnine、copilot都是非常不错的选择。
