自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

十個編碼過程中的“坑”,一篇文章幫你填平了!

開發(fā) 前端 開發(fā)工具
數(shù)據(jù)科學家是“比任何軟件工程師都更擅長統(tǒng)計學、又比任何統(tǒng)計學家都更擅長軟件工程”的人。許多數(shù)據(jù)科學家都有統(tǒng)計學背景,但在軟件工程方面經(jīng)驗很少。本文列出了常見的10個編碼錯誤,希望你能認真閱讀并避免它們。

數(shù)據(jù)科學家是“比任何軟件工程師都更擅長統(tǒng)計學、又比任何統(tǒng)計學家都更擅長軟件工程”的人。許多數(shù)據(jù)科學家都有統(tǒng)計學背景,但在軟件工程方面經(jīng)驗很少。本文列出了常見的10個編碼錯誤,希望你能認真閱讀并避免它們。

1. 沒有共享代碼中引用的數(shù)據(jù)

數(shù)據(jù)科學既需要代碼也需要數(shù)據(jù)。因此,其他人要能夠獲取數(shù)據(jù)才能重現(xiàn)結(jié)果。這聽起來是很基本的要求,但很多人都忘記和代碼一起共享數(shù)據(jù)。

  1. import pandas as pd 
  2. df1 =pd.read_csv('file-i-dont-have.csv') # fails 
  3. do_stuff(df) 

解決方案:

使用d6tpipe(https://github.com/d6t/d6tpipe)共享數(shù)據(jù)文件和代碼,或?qū)⒍呱蟼鞯絊3 / web /google drive等或保存到數(shù)據(jù)庫,以便收件人可以檢索文件(但不要將它們添加到git,見下文)。

2. 硬編碼無法訪問的路徑

與***個錯誤類似,如果你對其他人無權(quán)訪問的路徑進行硬編碼,他們就無法運行代碼并且必須查看許多地方以手動更改路徑。

  1. import pandas as pd 
  2. df = pd.read_csv('/path/i-dont/have/data.csv')# fails 
  3. do_stuff(df) 
  4. # or 
  5. import os 
  6. os.chdir('c:\\Users\\yourname\\desktop\\python')# fails 

解決方案:使用相對路徑,全局路徑配置變量,或使用d6tpipe 讓你的數(shù)據(jù)易于訪問。

3. 混淆數(shù)據(jù)與代碼

很多人會這么想:由于數(shù)據(jù)科學代碼需要數(shù)據(jù),為什么不將它轉(zhuǎn)儲到同一目錄中?當你這么做的時候,很有可能也會把圖像,報告和其他垃圾保存到一個目錄下。這樣就一團亂麻了。

  1. ├── data.csv 
  2. ├── ingest.py 
  3. ├── other-data.csv 
  4. ├── output.png 
  5. ├── report.html 
  6.   
  7. └── run.py 

解決方案:將文件夾歸類,如數(shù)據(jù)、報告、代碼等。請參閱#5,并使用#1中提到的工具來存儲和共享數(shù)據(jù)。

4. 和源代碼一起用Gitcommit命令處理數(shù)據(jù)

大多數(shù)人會在版本控制他們的代碼(如果你不這樣做,那這也是你犯的錯誤之一!)。在嘗試共享數(shù)據(jù)時,你可能很想把數(shù)據(jù)文件添加到版本控制中。這對于非常小的文件是可以的;但是git無法針對數(shù)據(jù)進行優(yōu)化,尤其是對大文件來說。

  1. git add data.csv 

解決方案:使用#1中提到的工具來存儲和共享數(shù)據(jù)。如果你真的想版本控制數(shù)據(jù),請參閱d6tpipe, DVC(https://dvc.org/) 和Git Large File Storage(https://git-lfs.github.com/)。

5. 編寫函數(shù)而不是使用DAGs

說了這么多數(shù)據(jù),讓我們談?wù)剬嶋H的代碼。

學習編碼時學到的***件事就是函數(shù),因此數(shù)據(jù)科學代碼主要被處理為一系列線性運行的函數(shù)。這會導致一些問題。

  1. defprocess_data(data, parameter): 
  2.     data = do_stuff(data) 
  3.     data.to_pickle('data.pkl') 
  4.   
  5. data =pd.read_csv('data.csv') 
  6. process_data(data) 
  7. df_train =pd.read_pickle(df_train) 
  8. model = sklearn.svm.SVC() 
  9. model.fit(df_train.iloc[:,:-1],df_train['y']) 

解決方案:數(shù)據(jù)科學代碼***寫為一組相互之間具有依賴性的任務(wù),而不是寫為線性鏈式函數(shù)。

使用 d6tflow(https://github.com/d6t/d6tflow) 或airflow(https://airflow.apache.org/)。

6. 寫for循環(huán)

與函數(shù)一樣,for循環(huán)是學習編碼時首先學到的。For循環(huán)容易理解,但它們很慢而且過于冗長。這通常表明了你沒意識到還有矢量化替代方案。

  1. x = range(10) 
  2. avg =sum(x)/len(x); std = math.sqrt(sum((i-avg)**2 for i in x)/len(x)); 
  3. zscore =[(i-avg)/std for x] 
  4. # should be:scipy.stats.zscore(x) 
  5.   
  6. # or 
  7. groupavg = [] 
  8. for i indf['g'].unique(): 
  9.         dfdfg = df[df[g']==i] 
  10.         groupavg.append(dfg['g'].mean()) 
  11. # should be:df.groupby('g').mean() 

解決方案:

Numpy(http://www.numpy.org/), scipy(https://www.scipy.org/)和pandas(https://pandas.pydata.org/)為大多數(shù)你認為可能需要循環(huán)的情況提供了矢量化函數(shù)。

7. 不寫單元測試

隨著數(shù)據(jù),參數(shù)或用戶輸入的變化,代碼可能會中斷,有時你甚至注意不到。這可能導致輸出錯誤,如果有人根據(jù)輸出做決策,那么糟糕的數(shù)據(jù)將導致錯誤的決策!

解決方案:使用assert語句檢查數(shù)據(jù)質(zhì)量。pandas有同等性測試,d6tstack

(https://github.com/d6t/d6tstack) 檢查數(shù)據(jù)攝取,d6tjoin

(https://github.com/d6t/d6tjoin/blob/master/examples-prejoin.ipynb)檢查數(shù)據(jù)連接。以下是數(shù)據(jù)檢查示例的代碼:

  1. assertdf['id'].unique().shape[0] == len(ids) # have data for all ids? 
  2. assertdf.isna().sum()<0.9 # catch missing values 
  3. assertdf.groupby(['g','date']).size().max() ==1 # no duplicate values/date? 
  4. assertd6tjoin.utils.PreJoin([df1,df2],['id','date']).is_all_matched() # all idsmatched? 

8. 不記錄代碼

為了急著做分析,你可能囫圇吞棗地弄出結(jié)果,然后把結(jié)果交給客戶或老板;一個星期后,他們找到你說“能改一下這里嗎”或“能更新一下這個嗎”。這時你看看代碼,完全不記得當初為什么這么寫了。現(xiàn)在想象一下,其他人還必須運行你的代碼……

  1. defsome_complicated_function(data): 
  2.         datadata = data[data['column']!='wrong'] 
  3.         datadata = data.groupby('date').apply(lambdax: complicated_stuff(x)) 
  4.         datadata = data[data['value']<0.9
  5.         return data 

解決方案:在提供分析之后,也要花費額外的時間來記錄編碼時做了什么。你會慶幸自己這么做了的,其他人更會感謝你!這樣你會看起來更專業(yè)。

9. 將數(shù)據(jù)保存為csv或pickle格式

回到數(shù)據(jù),畢竟我們在談數(shù)據(jù)科學。就像函數(shù)和for循環(huán)一樣,CSV和pickle文件很常用,但它們實際上并不是很好。CSV不包含架構(gòu),因此每個人都必須再次解析數(shù)字和日期。Pickles解決了這個問題但只能在python中使用并且不會被壓縮。兩者都不是存儲大型數(shù)據(jù)集的好格式。

  1. defprocess_data(data, parameter): 
  2.     data = do_stuff(data) 
  3.     data.to_pickle('data.pkl') 
  4.   
  5. data =pd.read_csv('data.csv') 
  6. process_data(data) 
  7. df_train = pd.read_pickle(df_train) 

解決方案:

對數(shù)據(jù)模式使用 parquet(https://github.com/dask/fastparquet)或其他二進制數(shù)據(jù)格式,這兩者是壓縮數(shù)據(jù)的理想格式。d6tflow自動將任務(wù)的數(shù)據(jù)輸出保存為parquet,這樣就不用再操心格式問題了。

10. 使用jupyternotebooks筆記本

這一點也許頗具爭議:jupyternotebooks和CSV一樣普遍。很多人都使用它們。但這并不意味它們就是很好的工具。jupyternotebooks助長了上面提到的軟件工程中的壞習慣,特別是:

  • 你很想將所有文件轉(zhuǎn)儲到一個目錄中
  • 編寫自上而下運行的代碼,而不是DAGs
  • 沒有將代碼模塊化
  • 難以糾錯
  • 代碼和輸出混在一個文件中
  • 沒有很好地進行版本控制
  • 上手很容易,但擴展很難。

解決方案:

使用pycharm (https://www.jetbrains.com/pycharm/)和/或spyder(https://www.spyder-ide.org/)。

責任編輯:趙寧寧 來源: 讀芯術(shù)
相關(guān)推薦

2020-02-18 09:49:33

物聯(lián)網(wǎng)IOT物聯(lián)網(wǎng)技術(shù)

2020-10-09 08:15:11

JsBridge

2019-07-23 08:55:46

Base64編碼底層

2021-05-18 09:00:28

Pythonclass

2021-08-12 14:19:14

Slice數(shù)組類型內(nèi)存

2022-02-21 09:44:45

Git開源分布式

2023-05-12 08:19:12

Netty程序框架

2021-06-30 00:20:12

Hangfire.NET平臺

2019-04-17 15:16:00

Sparkshuffle算法

2021-04-09 08:40:51

網(wǎng)絡(luò)保險網(wǎng)絡(luò)安全網(wǎng)絡(luò)風險

2024-06-25 08:18:55

2017-09-05 08:52:37

Git程序員命令

2020-10-23 07:56:04

Java中的IO流

2022-01-15 10:02:03

Java Hashtable類 Java 基礎(chǔ)

2013-05-14 15:43:53

綜合布線布線技術(shù)通信網(wǎng)絡(luò)

2021-11-10 09:19:41

PythonShutil模塊

2021-11-17 10:11:08

PythonLogging模塊

2011-07-12 13:35:04

程序員

2019-10-17 19:15:22

jQueryJavaScript前端

2021-05-15 09:18:04

Python進程
點贊
收藏

51CTO技術(shù)棧公眾號