通過應用軟件工程最佳實踐,可以交付質量更好數據科學的項目。更好的質量可能是更少的錯誤、可靠的結果和更高的編碼效率。
最佳實踐都是從錯誤中總結出來的,所以這里我們總結了一些遇到的最常見的錯誤,并提供了如何最好地解決這些錯誤的方法、想法和資源。
1、不使用虛擬環境
這本身不是編碼問題,但我仍然認為每種類型的項目進行環境的隔離是一個非常好的實踐。
為什么要為每個項目使用專用環境呢?
第一個原因是Python本身包管理的問題,我們想盡量減少包和版本之間的沖突。
另外一個原因是我們代碼和依賴可以方便的部署到任意的位置
使用虛擬環境可以從Anaconda或Pipenv開始。如果想更深入那么Docker 是首選。
2、過度使用Jupyter Notebook
Notebooks非常適合用于教育目的和做一些快速而復雜的分析工作,但它不能作為一個好的IDE。
一個好的IDE是應對數據科學任務時的真正武器,可以極大地提高您的工作效率。
Notebooks很適合做實驗,而且可以輕松地將結果展示給其他人。但是它很容易出錯,當涉及到執行長期、協作和可部署的項目時,最好還是使用IDE,例如VScode、Pycharm、Spyder等。
3、使用絕對而不是相對路徑
絕對路徑的最大問題是無法進行方便部署,解決這個問題的主要方法是將工作目錄設置為項目根目錄,并且不要再項目中包含項目目錄外的文件,并且在代碼中的所有路徑均使用相對路徑。
4、不處理警告
當我們的代碼能夠運行但產生奇怪的警告消息,我們很高興終于讓代碼運行并收到了有意義的輸出。但是我們需要處理這些警告嗎?
首先,警告本身并不是錯誤,但它們是會引起我們對潛在錯誤或問題的提示。當你的代碼中能夠運行成功但可能不是它的預期方式時,警告就會出現。
我遇到的最常見的警告是Pandas的SettingwithCopyWarning和DeprecationWarning。
SettingwithCopyWarning最大的原因是Pandas檢測到鏈式賦值(Chained Assignment)時發生的警告,我們應該避免對鏈式索引的結果賦值,因為這個操作有可能會報warning也有可能不會報。
DeprecationWarning通常指出Pandas棄用了某些功能,并且您的代碼在使用更高版本時會中斷。
這里的建議并不是要處理所有的警告,但是一定要對所有警告產生的原因有所了解,要知道在特定項目中那些警告式可以忽略的,那些警告的出現對結果會有影響,應當避免。
5、沒有使用(很少使用)列表推導式
列表推導式是Python的一個非常強大的特性。許多for循環可以用更易讀、更Python且速度更快的列表推導來代替。
可以在下面看到一個示例代碼,該代碼旨在讀取目錄中的CSV文件。可以看到,在使用列表推導時添很容易維護。
6、不適用類型注釋
類型注釋(或類型提示)是為變量分配類型的方法。在IDE進行智能感知的提示時可以為我們提供指示變量/參數的類型。這不僅可以提高我們開發的速度,也可以對我們閱讀代碼有很大的幫助
如果這么寫,我們根本不知道a,b和times的類型
但是加上了類型注釋,我們就知道a和b是字符串times是整數
需要說明的是:Python在3.5版本的時候引入了類型注釋,Python并不會在執行時檢查類型注釋,他只是為IDE提供了一個方便靜態類型檢查工具,對動態語言做靜態類型檢查,來避免一些潛在的錯誤。
7、Pandas代碼不規范
方法鏈是Pandas的一個很棒的特性,但是如果在一行中包含了很多的操作,代碼可能會變得不可讀。
有一個技巧可以讓這種方式邊的簡單,將表達式放入括號中,則可以對表達式的每個組件使用一行。
8、不遵守 PEP 約定
剛開始使用Python進行編程時,代碼可能是簡陋并且不可讀的,這是因為我們并沒有自己的設計規則來讓我的代碼看起來更好。如果我們自己來設計這種規則是費事費力的并且這種規則需要很多的實踐,好在Python官方有已經指定好的規則:PEP,它是Python的官方樣式指南。
雖然PEP的規則很多并且很繁瑣,我們可以忽略了一些PEP規則,但可以在90% 的代碼中使用了它們。
9、不適用編碼輔助工具
您想在編碼方面大幅提高生產力嗎?請開始使用編碼輔助工具,它通過巧妙的自動完成、打開文檔和提供改進代碼的建議來提供幫助。