99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁(yè)精彩閱讀數(shù)據(jù)科學(xué)家常遇到的10個(gè)錯(cuò)誤
數(shù)據(jù)科學(xué)家常遇到的10個(gè)錯(cuò)誤
2019-10-14
收藏
數(shù)據(jù)科學(xué)家常遇到的10個(gè)錯(cuò)誤

作者 | 磐懟懟

來(lái)源 | 磐創(chuàng)AI

數(shù)據(jù)科學(xué)家是“在統(tǒng)計(jì)方面比任何軟件工程師都要出色,在軟件工程方面比任何統(tǒng)計(jì)學(xué)家都出色的人”。許多數(shù)據(jù)科學(xué)家都有統(tǒng)計(jì)學(xué)背景,但很少有軟件工程經(jīng)驗(yàn)。我是一位高級(jí)數(shù)據(jù)科學(xué)家,在Python編碼的Stackoverflow上排名第一,并與許多(初級(jí))數(shù)據(jù)科學(xué)家合作。下面是我經(jīng)??吹降?0個(gè)常見(jiàn)錯(cuò)誤。

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

數(shù)據(jù)科學(xué)需要代碼和數(shù)據(jù)。因此,要使其他人能夠重現(xiàn)您的結(jié)果,他們需要有權(quán)訪問(wèn)數(shù)據(jù)。雖然看起來(lái)很基礎(chǔ),但是很多人忘記了共享代碼的數(shù)據(jù)。

import pandas as pd

df1 = pd.read_csv('file-i-dont-have.csv') # 錯(cuò)誤

do_stuff(df)

解決方案:使用d6tpipe共享數(shù)據(jù)文件,或上傳到S3 / web / google等或保存到數(shù)據(jù)庫(kù),以他人可以檢索文件(但不要將它們添加到git,詳見(jiàn)下文)。

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

2. 硬編碼無(wú)法訪問(wèn)的路徑

與錯(cuò)誤1相似,如果您對(duì)其他人無(wú)法訪問(wèn)的路徑進(jìn)行硬編碼,則他們將無(wú)法運(yùn)行您的代碼,因此要查看很多地方手動(dòng)更改路徑。

import pandas as pd

df = pd.read_csv('/path/i-dont/have/data.csv') # 錯(cuò)誤

do_stuff(df)

# or

impor os

os.chdir('c:\\Users\\yourname\\desktop\\python') # 錯(cuò)誤

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

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

由于數(shù)據(jù)科學(xué)代碼需要數(shù)據(jù),為什么不將其存儲(chǔ)到同一目錄?當(dāng)您使用它時(shí),也可以在其中保存圖像,日志和其他垃圾文件。

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

解決方案:將目錄按照類別進(jìn)行組織,例如數(shù)據(jù),日志,代碼等。

4. Git提交帶有源代碼的數(shù)據(jù)

現(xiàn)在大多數(shù)人都可以控制他們的代碼版本(如果不使用,那是另一個(gè)錯(cuò)誤!參見(jiàn)git)。為了共享數(shù)據(jù),可能想將數(shù)據(jù)文件添加到版本控制中。如果是很小的文件還可以,但是git并沒(méi)有對(duì)數(shù)據(jù)文件進(jìn)行優(yōu)化,尤其是大文件。

git add data.csv

解決方案:使用問(wèn)題1中提到的工具來(lái)存儲(chǔ)和共享數(shù)據(jù)。如果確實(shí)要對(duì)控制數(shù)據(jù)進(jìn)行版本控制,請(qǐng)參閱d6tpipe,DVC和Git大文件存儲(chǔ)。

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

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

有足夠的數(shù)據(jù),接下來(lái)談?wù)剬?shí)際的代碼!由于在學(xué)習(xí)代碼時(shí)首先要學(xué)習(xí)的內(nèi)容之一就是函數(shù),因此數(shù)據(jù)科學(xué)代碼通常被組織為一系列線性運(yùn)行的函數(shù)。這可能會(huì)導(dǎo)致幾個(gè)問(wèn)題。

def process_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é)代碼編寫(xiě)為一組任務(wù),并且它們之間具有依賴性,而不是線性鏈接函數(shù)。使用d6tflow或airflow。

6. 循環(huán)

和函數(shù)一樣,for循環(huán)是在學(xué)習(xí)編碼時(shí)首先要學(xué)習(xí)的東西。它們易于理解,但它們速度慢且過(guò)于冗長(zhǎng),通常表示您不知道有向量化的替代方案。

x = range(10)
avg = sum(x)/len(x); std = math.sqrt(sum((i-avg)**2 for i in x)/len(x));
zscore = [(i-avg)/std for x]
# should be: scipy.stats.zscore(x)
# or
groupavg = []
for i in df['g'].unique():
 dfg = df[df[g']==i]
 groupavg.append(dfg['g'].mean())
# should be: df.groupby('g').mean()

解決方案:Numpy,scipy和pandas具有向量化功能,可用于大多數(shù)的循環(huán)。

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

隨著數(shù)據(jù),參數(shù)或用戶輸入的更改,您的代碼可能會(huì)中斷,有時(shí)您可能不會(huì)注意到。這可能會(huì)導(dǎo)致錯(cuò)誤的輸出,如果有人根據(jù)您的輸出做出決策,那么錯(cuò)誤的數(shù)據(jù)將導(dǎo)致錯(cuò)誤的決策!

解決方案:使用assert語(yǔ)句檢查數(shù)據(jù)。pandas有相等測(cè)試,d6tstack有數(shù)據(jù)攝取和檢查,d6tjoin數(shù)據(jù)連接。代碼示例:

assert df['id'].unique().shape[0] == len(ids) # 數(shù)據(jù)是否有所有的id
assert df.isna().sum()<0.9 # 檢查缺失的數(shù)據(jù)
assert df.groupby(['g','date']).size().max() ==1 # 是否有重復(fù)的數(shù)據(jù)
assert d6tjoin.utils.PreJoin([df1,df2],['id','date']).is_all_matched() # 所有的id是否匹配
數(shù)據(jù)科學(xué)家常遇到的10個(gè)錯(cuò)誤

8. 不記錄代碼

我明白你著急進(jìn)行一些分析。您可以一起努力取得成果給客戶或老板。然后一個(gè)星期后,他們說(shuō)“請(qǐng)您更新此內(nèi)容”。您看著您的代碼,不記得為什么要這么做?,F(xiàn)在想象其他人需要運(yùn)行它。

def some_complicated_function(data):

data = data[data['column']!='wrong']

data = data.groupby('date').apply(lambda x: complicated_stuff(x))

data = data[data['value']<0.9]

return data

解決方案:即使在完成分析之后,也要花點(diǎn)時(shí)間記錄所做的工作。您將感謝自己,其他人更加感謝!

9. 將數(shù)據(jù)另存為csv或pickle

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

def process_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自動(dòng)將任務(wù)的數(shù)據(jù)輸出保存為parquet,不需要你進(jìn)行處理。

10. 使用jupyter筆記本

讓我們以一個(gè)有爭(zhēng)議的結(jié)論來(lái)結(jié)束:jupyter notebooks 與CSV一樣普遍。很多人使用它們,那并不是好事。Jupyter notebooks 促進(jìn)了上述許多不良的軟件工程習(xí)慣,尤其是:

  1. 很容易將所有文件存儲(chǔ)到一個(gè)目錄中
  2. 編寫(xiě)的代碼從上至下而不是DAG運(yùn)行
  3. 沒(méi)有模塊化代碼
  4. 調(diào)試?yán)щy
  5. 代碼和輸出混合在一個(gè)文件中
  6. 版本控制不好

入門(mén)很容易,但是擴(kuò)展性很差。

解決方案:使用pycharm或spyder。

數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說(shuō)明請(qǐng)參見(jiàn):http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }