0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

數(shù)據(jù)科學家常犯的10個編程錯誤

電子工程師 ? 來源:fqj ? 2019-05-24 14:50 ? 次閱讀

數(shù)據(jù)科學家是“比軟件工程師更擅長統(tǒng)計學,比統(tǒng)計學家更擅長軟件工程的人”。許多數(shù)據(jù)科學家都具有統(tǒng)計學背景,但是在軟件工程方面的經(jīng)驗甚少。我是一名資深數(shù)據(jù)科學家,在Stackoverflow的python編程方面排名前1%,并與許多(初級)數(shù)據(jù)科學家共事。以下是我經(jīng)??吹降?0大常見錯誤,本文將為你相關解決方案:

不共享代碼中引用的數(shù)據(jù)

對無法訪問的路徑進行硬編碼

將代碼與數(shù)據(jù)混合

在Git中和源碼一起提交數(shù)據(jù)

編寫函數(shù)而不是DAG

寫for循環(huán)

不編寫單元測試

不寫代碼說明文檔

將數(shù)據(jù)保存為csv或pickle文件

使用jupyter notebook

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

數(shù)據(jù)科學需要代碼和數(shù)據(jù)。因此,為了讓別人可以復現(xiàn)你的結果,他們需要能夠訪問到數(shù)據(jù)。道理很簡單,但是很多人忘記分享他們代碼中的數(shù)據(jù)。

importpandasaspddf1=pd.read_csv('file-i-dont-have.csv')#failsdo_stuff(df)

解決方案:使用d6tpipe來共享你的代碼中的數(shù)據(jù)文件、將其上傳到S3/web/google驅動等,或者保存到數(shù)據(jù)庫,以便于別人可以檢索到文件(但是不要將其添加到git,原因見下文)。

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

與錯誤1相似,如果你對別人無法訪問的路徑進行硬編碼,他們將無法運行你的代碼,并且必須仔細查看代碼來手動更改路徑。令人崩潰!

importpandasaspddf=pd.read_csv('/path/i-dont/have/data.csv')#failsdo_stuff(df)#orimportosos.chdir('c:\Users\yourname\desktop\python') # fails

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

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

既然數(shù)據(jù)科學的代碼中包含數(shù)據(jù),為什么不把它們放到同一目錄中?那樣你還可以在其中保存圖像、報告和其他垃圾。哎呀,真是一團糟!

├──data.csv├──ingest.py├──other-data.csv├──output.png├──report.html└── run.py

解決方案:將你的目錄進行分類,比如數(shù)據(jù)、報告、代碼等。請參閱Cookiecutter Data Science或d6tflow項目模板[見#5],并使用#1中提到的工具來存儲和共享數(shù)據(jù)。

4.在Git中和源碼一起提交數(shù)據(jù)

現(xiàn)在,大多數(shù)人對他們的代碼使用版本控制(如果你不使用,那就是另外一個錯誤,請參閱git:https://git-scm.com/)。在嘗試共享數(shù)據(jù)時,很容易將數(shù)據(jù)文件添加到版本控制中。當文件很小時是可以的,但是git并沒有針對數(shù)據(jù)進行優(yōu)化,尤其是大文件。

gitadddata.csv

解決方案:使用第1點中提到的工具來存儲和共享數(shù)據(jù)。如果你真的希望對數(shù)據(jù)進行版本控制,請參閱d6tpipe,DVC和Git大文件存儲。

5.編寫函數(shù)而不是DAG

關于數(shù)據(jù)部分已經(jīng)夠多了,現(xiàn)在來談一談實際的代碼!在學習編程時最先學習的內容之一就是函數(shù),數(shù)據(jù)科學代碼通常由一系列線性運行的函數(shù)組成。

這會導致一些問題,請參閱“為什么你的機器學習代碼可能不好的4個原因”:

defprocess_data(data,parameter):data=do_stuff(data)data.to_pickle('data.pkl')data = pd.read_csv('data.csv')process_data(data)df_train=pd.read_pickle(df_train)model=sklearn.svm.SVC()model.fit(df_train.iloc[:,:-1],df_train['y'])

解決方案:數(shù)據(jù)科學代碼不是一系列線性連接的函數(shù),而是一組具有依賴關系的任務集合。

6.寫for循環(huán)

與函數(shù)類似,for循環(huán)也是你學習編程時最初學習的內容。它們易于理解,但是運行緩慢且過于冗長,通常意味著你不了解矢量化的替代方案。

x = range(10)avg=sum(x)/len(x);std=math.sqrt(sum((i-avg)**2foriinx)/len(x));zscore=[(i-avg)/stdforx]#shouldbe:scipy.stats.zscore(x)# orgroupavg=[]foriindf['g'].unique():dfg=df[df[g']==i]groupavg.append(dfg['g'].mean())#shouldbe:df.groupby('g').mean()

解決方案:Numpy,scipy和pandas為你需要for循環(huán)的情況提供了矢量化函數(shù)。

7.不編寫單元測試

隨著數(shù)據(jù)、參數(shù)或用戶輸入的改變,你的代碼可能會出現(xiàn)問題,有時你并沒有注意到。這可能會導致糟糕的輸出結果,而如果有人基于你的輸出做出決策,那么糟糕的數(shù)據(jù)將會導致糟糕的決策。

解決方案:使用assert語句來檢查數(shù)據(jù)質量。pandas有相等測試,d6tstack有數(shù)據(jù)提取檢查以及用于數(shù)據(jù)連接的d6tjoin。

以下是數(shù)據(jù)檢查的示例代碼:

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

8.不寫代碼說明文檔

我明白,你急著做出一些分析結果。你把事情匯總到一起分析,將結果交給你的客戶或老板。一個星期之后,他們回來說,“可以把XXX改一下嗎”或者“可以更新一下這里嗎”。你看著你的代碼,但是并不記得你當初為什么這么寫?,F(xiàn)在就像是在運行別人的代碼。

defsome_complicated_function(data):data=data[data['column']!='wrong']data=data.groupby('date').apply(lambdax:complicated_stuff(x))data=data[data['value']<0.9] return data

解決方案:即使在你已經(jīng)提交分析報告后,也要花費額外的時間,來對你做的事情編寫說明文檔。以后你會感謝自己,別人更會感謝你。那樣顯得你很專業(yè)!

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

回到數(shù)據(jù),畢竟是在講數(shù)據(jù)科學。就像函數(shù)和for循環(huán)一樣,CSV和pickle文件很常用,但是并不好用。CSV文件不包含綱要(schema),因此每個人都必須再次解析數(shù)字和日期。Pickle文件解決了這個問題,但是它只能在python中使用,并且不能壓縮。兩者都不是存儲大型數(shù)據(jù)集的最優(yōu)格式。

defprocess_data(data,parameter):data=do_stuff(data)data.to_pickle('data.pkl')data=pd.read_csv('data.csv')process_data(data)df_train = pd.read_pickle(df_train)

解決方案:使用parquet或其他帶有數(shù)據(jù)綱要的二進制數(shù)據(jù)格式,在理想情況下可以壓縮數(shù)據(jù)。d6tflow將任務的數(shù)據(jù)輸出保存為parquet,無需額外處理。

10.使用jupyter notebook

最后一個是頗有爭議的錯誤:jupyter notebook和csv文件一樣普遍。許多人使用它們,但是這并不意味著它們很好。jupyter notebook助長了上述提到的許多不良編程習慣,尤其是:

把所有文件保存在一個目錄中

編寫從上至下運行的代碼,而不是DAG

沒有對代碼進行模塊化

很難調試

代碼和輸出混在一個文件中

沒有很好的版本控制

它容易上手,但是擴展性很差。

解決方案:使用pycharm和/或spyder。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 編程
    +關注

    關注

    88

    文章

    3543

    瀏覽量

    93466
  • 函數(shù)
    +關注

    關注

    3

    文章

    4256

    瀏覽量

    62223

原文標題:數(shù)據(jù)科學家常犯的 10 個編程錯誤

文章出處:【微信號:DBDevs,微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    關于C語言編程常犯錯誤匯總

    17C語言新手編程常犯錯誤及解決方式
    的頭像 發(fā)表于 06-26 09:19 ?6070次閱讀
    關于C語言<b class='flag-5'>編程</b>時<b class='flag-5'>常犯</b>的<b class='flag-5'>錯誤</b>匯總

    TI科學家談浮點DSP未來發(fā)展

    TI科學家談浮點DSP未來發(fā)展 自十多年前浮點數(shù)字信號處理器(DSP)誕生以來,便為實時信號處理提供了算術上更為先進的備選方案。不過,定點器件至今仍是業(yè)界的主流--當然低成本是主要原因。定點DSP每
    發(fā)表于 11-03 15:18

    科學家推出多種波動描記傳感器

      美國得克薩斯大學的科學家們最新一項研究結果表明,人們很快將根據(jù)腸子的波動情況當場揭穿騙子的謊言?! ≡摯髮W的科研小組還認為,將來有一天,以記錄心臟活動為主的多種波動描記器將極大地提高其工作質量
    發(fā)表于 10-24 11:40

    生物電磁波揭密 場導發(fā)現(xiàn)(俄羅斯華裔科學家寫的腦控技術叢書)

    生物電磁波揭密場導發(fā)現(xiàn)(俄羅斯華裔科學家寫的腦控技術叢書)
    發(fā)表于 03-05 09:31

    通往數(shù)據(jù)科學家的崎嶇道路

    如果你曾經(jīng)查看過數(shù)據(jù)科學家的崗位要求,你就知道它的職責范圍有多廣。有的數(shù)據(jù)科學家致力于自然語言處理、計算機視覺、深度學習,有的則從事A/B測試、產(chǎn)品分析。確定哪些工作適合自己,哪些不適
    的頭像 發(fā)表于 07-26 09:17 ?2497次閱讀

    哪些才是對數(shù)據(jù)科學家最迫切的技能呢?

    AngelList提供的是列出數(shù)據(jù)科學家崗位的公司數(shù)而不是崗位數(shù)。我把AngelList從所有分析里面排除掉了,因為其搜索算法似乎按照OR型的邏輯搜索進行,沒有辦法改成AND。如果你尋找的是“數(shù)據(jù)
    的頭像 發(fā)表于 11-19 18:14 ?3013次閱讀

    什么是數(shù)據(jù)科學家?需要認證嗎?

    得以清晰化。”Fleming指出,IBM目前雇傭了大約1.5萬名被定義為數(shù)據(jù)科學家的技術人員,預計數(shù)據(jù)科學家人數(shù)的增長速度超過其雇員總數(shù)的增長速度。
    的頭像 發(fā)表于 02-14 09:41 ?6506次閱讀

    數(shù)據(jù)科學家與機器學習工程師怎么區(qū)分

    十年來,我們一直在談論數(shù)據(jù)科學數(shù)據(jù)科學家。雖然在怎么才叫“數(shù)據(jù)科學家”的問題上始終存在著爭議,
    的頭像 發(fā)表于 05-18 11:24 ?3163次閱讀

    數(shù)據(jù)科學家數(shù)據(jù)工程師的區(qū)別

    數(shù)據(jù)科學家和數(shù)據(jù)工程師的主要區(qū)別,可以用ETL和DAD的區(qū)別來解釋。
    的頭像 發(fā)表于 07-10 17:06 ?2591次閱讀

    企業(yè)如何解決數(shù)據(jù)科學家短缺詳細方法什么

     隨著企業(yè)以數(shù)據(jù)為中心的文化,以做出決策和規(guī)劃,數(shù)據(jù)科學家對全球企業(yè)的重要性日益增加。但是企業(yè)無法足夠快地聘請數(shù)據(jù)科學家,因為合格候選人仍然
    的頭像 發(fā)表于 04-18 10:31 ?3409次閱讀

    采訪資深數(shù)據(jù)科學家:成為數(shù)據(jù)科學家應具有的品質

    作為一門逐漸成熟的新興領域,與數(shù)據(jù)科學相關的很多領域開始變得備受青睞,比如數(shù)據(jù)工程,數(shù)據(jù)分析以及機器學習和深度學習。數(shù)據(jù)
    的頭像 發(fā)表于 06-30 11:28 ?2224次閱讀

    什么是數(shù)據(jù)科學家的最佳編程語言?

    每個數(shù)據(jù)科學學習者都最常問的問題:“ 什么是數(shù)據(jù)科學家的最佳編程語言?”。
    的頭像 發(fā)表于 07-05 11:32 ?2454次閱讀

    數(shù)據(jù)科學家和數(shù)據(jù)工程師能合二為一嗎?

    雖然數(shù)據(jù)科學家和數(shù)據(jù)工程師的角色似乎截然不同,但數(shù)據(jù)科學家和數(shù)據(jù)工程師有許多共同的特點和共技能。這些重疊的技能包括處理和操作大數(shù)據(jù)集、應用
    的頭像 發(fā)表于 07-25 10:17 ?2494次閱讀

    面向工程師和科學家的大數(shù)據(jù)

      為了有效地利用大數(shù)據(jù)的優(yōu)勢,工程師和科學家需要一可擴展的工具,例如 MATLAB,以提供對用于存儲和管理數(shù)據(jù)的各種系統(tǒng)和格式的訪問。
    的頭像 發(fā)表于 10-06 07:52 ?593次閱讀

    中國聯(lián)通AI科學家廉士國入選全球前2%頂尖科學家榜單

    %頂尖科學家榜單是Elsevier和斯坦福大學John P.A. Ioannidis教授團隊合作的具有全球影響力的項目成果,為全球學術界提供了一面向科學家長期科研表現(xiàn)的衡量指標,旨在更客觀、更真實地反映
    的頭像 發(fā)表于 11-07 16:18 ?2592次閱讀