成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

十個(gè)編碼過(guò)程中的“坑”,一篇文章幫你填平了!

開(kāi)發(fā) 前端 開(kāi)發(fā)工具
數(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)很少。本文列出了常見(jiàn)的10個(gè)編碼錯(cuò)誤,希望你能認(rèn)真閱讀并避免它們。

數(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)很少。本文列出了常見(jiàn)的10個(gè)編碼錯(cuò)誤,希望你能認(rèn)真閱讀并避免它們。

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

數(shù)據(jù)科學(xué)既需要代碼也需要數(shù)據(jù)。因此,其他人要能夠獲取數(shù)據(jù)才能重現(xiàn)結(jié)果。這聽(tīng)起來(lái)是很基本的要求,但很多人都忘記和代碼一起共享數(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ù)庫(kù),以便收件人可以檢索文件(但不要將它們添加到git,見(jiàn)下文)。

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

與***個(gè)錯(cuò)誤類(lèi)似,如果你對(duì)其他人無(wú)權(quán)訪(fǎng)問(wèn)的路徑進(jìn)行硬編碼,他們就無(wú)法運(yùn)行代碼并且必須查看許多地方以手動(dòng)更改路徑。

  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 

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

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

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

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

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

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

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

  1. git add data.csv 

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

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

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

學(xué)習(xí)編碼時(shí)學(xué)到的***件事就是函數(shù),因此數(shù)據(jù)科學(xué)代碼主要被處理為一系列線(xiàn)性運(yùn)行的函數(shù)。這會(huì)導(dǎo)致一些問(wèn)題。

  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ù)科學(xué)代碼***寫(xiě)為一組相互之間具有依賴(lài)性的任務(wù),而不是寫(xiě)為線(xiàn)性鏈?zhǔn)胶瘮?shù)。

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

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

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

  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ù)你認(rèn)為可能需要循環(huán)的情況提供了矢量化函數(shù)。

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

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

解決方案:使用assert語(yǔ)句檢查數(shù)據(jù)質(zhì)量。pandas有同等性測(cè)試,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é)果交給客戶(hù)或老板;一個(gè)星期后,他們找到你說(shuō)“能改一下這里嗎”或“能更新一下這個(gè)嗎”。這時(shí)你看看代碼,完全不記得當(dāng)初為什么這么寫(xiě)了。現(xiàn)在想象一下,其他人還必須運(yù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 

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

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

回到數(shù)據(jù),畢竟我們?cè)谡剶?shù)據(jù)科學(xué)。就像函數(shù)和for循環(huán)一樣,CSV和pickle文件很常用,但它們實(shí)際上并不是很好。CSV不包含架構(gòu),因此每個(gè)人都必須再次解析數(shù)字和日期。Pickles解決了這個(gè)問(wèn)題但只能在python中使用并且不會(huì)被壓縮。兩者都不是存儲(chǔ)大型數(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) 

解決方案:

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

10. 使用jupyternotebooks筆記本

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

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

解決方案:

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

責(zé)任編輯:趙寧寧 來(lái)源: 讀芯術(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

Python類(lèi)class

2021-08-12 14:19:14

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

2017-09-05 08:52:37

Git程序員命令

2022-02-21 09:44:45

Git開(kāi)源分布式

2019-04-17 15:16:00

Sparkshuffle算法

2024-06-25 08:18:55

2021-06-30 00:20:12

Hangfire.NET平臺(tái)

2023-05-12 08:19:12

Netty程序框架

2021-04-09 08:40:51

網(wǎng)絡(luò)保險(xiǎn)網(wǎng)絡(luò)安全網(wǎng)絡(luò)風(fēng)險(xiǎn)

2022-01-15 10:02:03

Java Hashtable類(lèi) Java 基礎(chǔ)

2021-11-17 10:11:08

PythonLogging模塊

2020-10-23 07:56:04

Java中的IO流

2021-11-10 09:19:41

PythonShutil模塊

2019-09-24 14:19:12

PythonC語(yǔ)言文章

2023-07-28 07:14:13

2022-10-08 15:07:06

ChatOps運(yùn)維

2022-08-04 09:39:39

Kubernetes聲明式系統(tǒng)
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 成人av一区二区亚洲精 | 午夜欧美一区二区三区在线播放 | 午夜免费观看 | 午夜久草 | 国产精品视频一区二区三区四蜜臂 | 欧美一级做a爰片免费视频 国产美女特级嫩嫩嫩bbb片 | 一区二区三区四区在线视频 | 精品中文字幕一区二区三区 | 国内自拍视频在线观看 | 久久一区二区三区四区 | 亚洲午夜精品 | 亚洲精品一区二区二区 | 美女久久 | 精品一区二区三区中文字幕 | 午夜久久久久久久久久一区二区 | 极品销魂美女一区二区 | 日韩在线免费视频 | 日本福利片 | 欧美精品一区二区三区蜜桃视频 | 久久久久免费精品国产 | 精品久久久久久久 | 成人在线不卡 | 久久青青 | 九九国产在线观看 | 亚洲风情在线观看 | 精品国产乱码久久久久久牛牛 | 久久精品国产一区二区三区不卡 | 亚洲成人一区 | 午夜资源 | 欧美日韩在线播放 | 中文字幕在线一区 | 日韩av视屏| 中文字字幕在线中文乱码范文 | 成人精品免费视频 | 日本高清视频网站 | 午夜tv免费观看 | 久久精彩 | 91大神新作在线观看 | 久久久久久久久淑女av国产精品 | 美女黄网 | 97超碰免费 |