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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

數(shù)據(jù)科學(xué)家常犯的10個(gè)編程錯(cuò)誤

電子工程師 ? 來(lái)源:fqj ? 2019-05-24 14:50 ? 次閱讀

數(shù)據(jù)科學(xué)家是“比軟件工程師更擅長(zhǎng)統(tǒng)計(jì)學(xué),比統(tǒng)計(jì)學(xué)家更擅長(zhǎng)軟件工程的人”。許多數(shù)據(jù)科學(xué)家都具有統(tǒng)計(jì)學(xué)背景,但是在軟件工程方面的經(jīng)驗(yàn)甚少。我是一名資深數(shù)據(jù)科學(xué)家,在Stackoverflow的python編程方面排名前1%,并與許多(初級(jí))數(shù)據(jù)科學(xué)家共事。以下是我經(jīng)常看到的10大常見(jiàn)錯(cuò)誤,本文將為你相關(guān)解決方案:

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

對(duì)無(wú)法訪問(wèn)的路徑進(jìn)行硬編碼

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

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

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

寫(xiě)for循環(huán)

不編寫(xiě)單元測(cè)試

不寫(xiě)代碼說(shuō)明文檔

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

使用jupyter notebook

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

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

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

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

2.對(duì)無(wú)法訪問(wèn)的路徑進(jìn)行硬編碼

與錯(cuò)誤1相似,如果你對(duì)別人無(wú)法訪問(wèn)的路徑進(jìn)行硬編碼,他們將無(wú)法運(yùn)行你的代碼,并且必須仔細(xì)查看代碼來(lái)手動(dòng)更改路徑。令人崩潰!

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

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

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

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

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

解決方案:將你的目錄進(jìn)行分類(lèi),比如數(shù)據(jù)、報(bào)告、代碼等。請(qǐng)參閱Cookiecutter Data Science或d6tflow項(xiàng)目模板[見(jiàn)#5],并使用#1中提到的工具來(lái)存儲(chǔ)和共享數(shù)據(jù)。

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

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

gitadddata.csv

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

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

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

這會(huì)導(dǎo)致一些問(wèn)題,請(qǐng)參閱“為什么你的機(jī)器學(xué)習(xí)代碼可能不好的4個(gè)原因”:

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ù)科學(xué)代碼不是一系列線性連接的函數(shù),而是一組具有依賴(lài)關(guān)系的任務(wù)集合。

6.寫(xiě)for循環(huán)

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

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.不編寫(xiě)單元測(cè)試

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

解決方案:使用assert語(yǔ)句來(lái)檢查數(shù)據(jù)質(zhì)量。pandas有相等測(cè)試,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.不寫(xiě)代碼說(shuō)明文檔

我明白,你急著做出一些分析結(jié)果。你把事情匯總到一起分析,將結(jié)果交給你的客戶(hù)或老板。一個(gè)星期之后,他們回來(lái)說(shuō),“可以把XXX改一下嗎”或者“可以更新一下這里嗎”。你看著你的代碼,但是并不記得你當(dāng)初為什么這么寫(xiě)。現(xiàn)在就像是在運(yù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)提交分析報(bào)告后,也要花費(fèi)額外的時(shí)間,來(lái)對(duì)你做的事情編寫(xiě)說(shuō)明文檔。以后你會(huì)感謝自己,別人更會(huì)感謝你。那樣顯得你很專(zhuān)業(yè)!

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

回到數(shù)據(jù),畢竟是在講數(shù)據(jù)科學(xué)。就像函數(shù)和for循環(huán)一樣,CSV和pickle文件很常用,但是并不好用。CSV文件不包含綱要(schema),因此每個(gè)人都必須再次解析數(shù)字和日期。Pickle文件解決了這個(gè)問(wèn)題,但是它只能在python中使用,并且不能壓縮。兩者都不是存儲(chǔ)大型數(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ù)綱要的二進(jìn)制數(shù)據(jù)格式,在理想情況下可以壓縮數(shù)據(jù)。d6tflow將任務(wù)的數(shù)據(jù)輸出保存為parquet,無(wú)需額外處理。

10.使用jupyter notebook

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

把所有文件保存在一個(gè)目錄中

編寫(xiě)從上至下運(yùn)行的代碼,而不是DAG

沒(méi)有對(duì)代碼進(jìn)行模塊化

很難調(diào)試

代碼和輸出混在一個(gè)文件中

沒(méi)有很好的版本控制

它容易上手,但是擴(kuò)展性很差。

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

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

    關(guān)注

    88

    文章

    3565

    瀏覽量

    93535
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4277

    瀏覽量

    62323

原文標(biāo)題:數(shù)據(jù)科學(xué)家常犯的 10 個(gè)編程錯(cuò)誤

文章出處:【微信號(hào):DBDevs,微信公眾號(hào):數(shù)據(jù)分析與開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    關(guān)于C語(yǔ)言編程時(shí)常犯錯(cuò)誤匯總

    17個(gè)C語(yǔ)言新手編程時(shí)常犯錯(cuò)誤及解決方式
    的頭像 發(fā)表于 06-26 09:19 ?6101次閱讀
    關(guān)于C語(yǔ)言<b class='flag-5'>編程</b>時(shí)<b class='flag-5'>常犯</b>的<b class='flag-5'>錯(cuò)誤</b>匯總

    TI科學(xué)家談浮點(diǎn)DSP未來(lái)發(fā)展

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

    科學(xué)家推出多種波動(dòng)描記傳感器

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

    生物電磁波揭密 場(chǎng)導(dǎo)發(fā)現(xiàn)(俄羅斯華裔科學(xué)家寫(xiě)的腦控技術(shù)叢書(shū))

    生物電磁波揭密場(chǎng)導(dǎo)發(fā)現(xiàn)(俄羅斯華裔科學(xué)家寫(xiě)的腦控技術(shù)叢書(shū))
    發(fā)表于 03-05 09:31

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

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

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

    AngelList提供的是列出數(shù)據(jù)科學(xué)家崗位的公司數(shù)而不是崗位數(shù)。我把AngelList從所有分析里面排除掉了,因?yàn)槠渌阉魉惴ㄋ坪醢凑誒R型的邏輯搜索進(jìn)行,沒(méi)有辦法改成AND。如果你尋找的是“數(shù)據(jù)
    的頭像 發(fā)表于 11-19 18:14 ?3035次閱讀

    什么是數(shù)據(jù)科學(xué)家?需要認(rèn)證嗎?

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

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

    十年來(lái),我們一直在談?wù)?b class='flag-5'>數(shù)據(jù)科學(xué)數(shù)據(jù)科學(xué)家。雖然在怎么才叫“數(shù)據(jù)科學(xué)家”的問(wèn)題上始終存在著爭(zhēng)議,
    的頭像 發(fā)表于 05-18 11:24 ?3192次閱讀

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

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

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

     隨著企業(yè)以數(shù)據(jù)為中心的文化,以做出決策和規(guī)劃,數(shù)據(jù)科學(xué)家對(duì)全球企業(yè)的重要性日益增加。但是企業(yè)無(wú)法足夠快地聘請(qǐng)數(shù)據(jù)科學(xué)家,因?yàn)楹细窈蜻x人仍然
    的頭像 發(fā)表于 04-18 10:31 ?3439次閱讀

    采訪資深數(shù)據(jù)科學(xué)家:成為數(shù)據(jù)科學(xué)家應(yīng)具有的品質(zhì)

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

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

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

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

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

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

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

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

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