加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

十个编码进程中的“坑”,一篇文章帮你填平了!

发布时间:2019-06-12 08:10:50 所属栏目:建站 来源:读芯术
导读:数据科学家是比任何软件工程师都更善于统计学、又比任何统计学家都更善于软件工程的人。许大都据科学家都有统计学配景,但在软件工程方面履历很少。本文列出了常见的10个编码错误,但愿你能当真阅读并停止它们。 1. 没有共享代码中引用的数据 数据科学既需
副问题[/!--empirenews.page--]

数据科学家是“比任何软件工程师都更善于统计学、又比任何统计学家都更善于软件工程”的人。许大都据科学家都有统计学配景,但在软件工程方面履历很少。本文列出了常见的10个编码错误,但愿你能当真阅读并停止它们。

十个编码进程中的“坑”,一篇文章帮你填平了!

1. 没有共享代码中引用的数据

数据科学既必要代码也必要数据。因此,其他人要可以或许获取数据才气重现功效。这听起来是很根基的要求,但许多人都健忘和代码一路共享数据。

  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)共享数据文件和代码,或将二者上传到S3 / web /google drive等或生涯到数据库,以便收件人可以检索文件(但不要将它们添加到git,见下文)。

2. 硬编码无法会见的路径

与第一个错误相同,假如你对其他人无权会见的路径举办硬编码,他们就无法运行代码而且必需查察很多处以是手动变动路径。

  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:Usersyournamedesktoppython')# fails 

办理方案:行使相对路径,全局路径设置变量,或行使d6tpipe 让你的数据易于会见。

3. 夹杂数据与代码

许多人会这么想:因为数据科学代码必要数据,为什么不将它转储到统一目次中?当你这么做的时辰,很有也许也会把图像,陈诉和其他垃圾生涯到一个目次下。这样就一团乱麻了。

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

办理方案:将文件夹归类,如数据、陈诉、代码等。请参阅#5,并行使#1中提到的器材来存储和共享数据。

4. 和源代码一路用Gitcommit呼吁处理赏罚数据

大大都人会在版本节制他们的代码(假如你不这样做,那这也是你犯的错误之一!)。在实行共享数据时,你也许很想把数据文件添加到版本节制中。这对付很是小的文件是可以的;可是git无法针对数据举办优化,尤其是对大文件来说。

  1. git add data.csv 

办理方案:行使#1中提到的器材来存储和共享数据。假如你真的想版本节制数据,请参阅d6tpipe, DVC(https://dvc.org/) 和Git Large File Storage(https://git-lfs.github.com/)。

5. 编写函数而不是行使DAGs

说了这么大都据,让我们谈谈现实的代码。

进修编码时学到的第一件事就是函数,因此数据科学代码首要被处理赏罚为一系列线性运行的函数。这会导致一些题目。

  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']) 

办理方案:数据科学代码最好写为一组彼此之间具有依靠性的使命,而不是写为线性链式函数。

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

6. 写for轮回

与函数一样,for轮回是进修编码时起首学到的。For轮回轻易领略,但它们很慢并且过于冗长。这凡是表白了你没意识到尚有矢量化更换方案。

  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/)为大大都你以为也许必要轮回的环境提供了矢量化函数。

7. 不写单位测试

跟着数据,参数或用户输入的变革,代码也许会间断,偶然你乃至留意不到。这也许导致输堕落误,假若有人按照输出做决定,那么糟糕的数据将导致错误的决定!

办理方案:行使assert语句搜查数据质量。pandas有平等性测试,d6tstack

(https://github.com/d6t/d6tstack) 搜查数据摄取,d6tjoin

(https://github.com/d6t/d6tjoin/blob/master/examples-prejoin.ipynb)搜查数据毗连。以下是数据搜查示例的代码:

  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. 不记录代码

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读