政治,数据科学家容易犯的10个代码错误,你采用了吗?-188体育官网_188金宝搏亚洲体育app_金宝搏官网

188体育 139℃ 0

数据科学家比软件工程师拿手计算,又比计算学家拿手软件工凯迪程。听起来牛逼轰轰,现实却是,许多数据科学家有计算学布景,却没有什么软件工程方面蜜导煎的经历,因此在编码时简略犯一些简略的错紫薇圣人误。作为一名高档数据科学家,本文作者总结了他在作业中常见数据科学家犯的十大过错。

我是一名高档数据科学家,在 Stackoverflow 的 python 编码中排前 1%,并且还与许多(初级)数据科学家一同作业。下文列出了我常龙鱼见到的 10 个过错。

没有同享代码中引证的数据

数据科学需求代码和数据。所以为了让其他人能够复现自己做出来的成果,你需求供给代码中触及的数据。这看起来很简略,但许多人会忘掉同享代码中需求的数据。

import pandas as pd
df1 = pd.read_csv('file-i-dont-have.csv') # fails
do_stuff(df)

处理方案:用 d6tpipe 同享代码中的数据文件,或许将数据文件上传到 S3/网页/Google 云等,还能够将数据文件保存到数据库中,以便收件人检索文件(但不要将数据添加到 git 政治,数据科学家简略犯的10个代码过错,你选用了吗?-188体育官网_188金宝搏亚洲体育app_金宝搏官网中,这一点后边的内容会讲到)。

硬编码其他人无法拜访的途径

和过错 1 相似,假如硬编码其他人无法拜访的途径,他们就无法运转你的代码,并且在许多当地都必须要手动修正途径。Booo!

import pandas as pd
df = pd.read_csv政治,数据科学家简略犯的10个代码过错,你选用了吗?-188体育官网_188金宝搏亚洲体育app_金宝搏官网('/path/i-dont/have/data.csv') # fails
do_stuff(df)
# or我国体育
impor os
os.chdir('c:\\Users\\yourname\\desktop\\python') # fails

处理方案:运用相对途径、大局途径装备变量或 d6tpipe,这样其他人就能够简单拜访你的数据了。

将数据和代码混在一同

已然数据科学代码需求数据,为什么不将代码和数据存储在同一个目录中呢?但你运转代码时花体英文,这个目录中还会存储图画、陈述以及其他垃圾文件。乱成一团!

├── data.csv
├── ingest.py
├── other-data.csv
├── outpu高兴农妇的微博t.png
├── report.html
└── run.py

处理方案:对目录进行分类,比方数据、陈述、代码等。参看 Cookiecutter Data Science 或 d6tflow 项目模板,并用问题 1 中说到的东西存储以及同享数据。

  • Cookiecutter Data Science:https://drivendata.github.io/cookiecutter-data-science/#directory-structure
  • d6tflow 项目模板:https://github.com/d6t/d6tflow-template

用 Git 提交数据

大多数人现在都会版别操控他们的代码(假如你没有这么做那便是另一个问题了!)。在同享数据时,或许很简略将数据文件添加到版别操控中。对一些小文件来说这没什么问题。但 git 无法优化数据,尤其是对大型文件而言。

git add data.csv

处理方案:运用问题 1 中说到的东西来存储和同享数据。假如你真的需求对数据进行版别操控,请参看 d6tpipe、DVC 和 Git Large Fi政治,数据科学家简略犯的10个代码过错,你选用了吗?-188体育官网_188金宝搏亚洲体育app_金宝搏官网le Storage。

  • DVC:https://dvc.org/
  • Git Large File Storage:https://git-lfs.github.com/

写函数而不是 DAG

数据现已评论得够多了,接下来咱们谈谈九七电影实践的代码。你在学编程时,首要学的便是函数,数据科学代码主要由一系列线性运转的函数组成。这会引发一些问题,概况请参看「4 Reasons Why Your Machine Learning Code is Probably Bad。」

  • 地址:https://towardsdatascience.com/4-reasons-why-your-machine-learning-co政治,数据科学家简略犯的10个代码过错,你选用了吗?-188体育官网_188金宝搏亚洲体育app_金宝搏官网de-is-probably-bad-c291752e4953
def process_data(data, parame直播采蘑菇遇腐尸ter):
data = do_stuff(data)
data.to_pickle('data.pkl')
data = pd.read_csv('data.csv')
proces饥饿鲨进化s_data(data)
df_train = pd.read_pickle(df_train)
model = s黄色小电影klea赵爽怀孕三次rn.svm.SVC()
model.fit(df_train.il政治,数据科学家简略犯的10个代码过错,你选用了吗?-188体育官网_188金宝搏亚洲体育app_金宝搏官网oc[:,:-1], df_train['y'])

处理方案:与其用线性链接函数,不如写一组有政治,数据科学家简略犯的10个代码过错,你选用了吗?-188体育官网_188金宝搏亚洲体育app_金宝搏官网依靠联系的使命。能够用 d6tflow 或许 airflow。

写 for 循环

和函数相同,for 循环也是你在学代码时最早学的。这种句子易于了解,但运转很慢且过于冗长,这种状况一般表明你不知道用什么代替向量化。

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 都有向量化函数,它们能够处理大部分你觉得需求用 for 循环处理的问题。

没有写单元测验

跟着数据、参数或许用户输入的改动,你的代码或许会中止,而你有时候或许没注意到这一点。这就会导致过错的输出,假如有人依据你的输出做决议计划的话,那么过错的数据就会导致过错的决议计划!

处理方案:用 assert 句子查看数据质量。Pandas 也有相同的测验,d6tstack 能够查看数据的获取,d6tjoin 能够查看数据的衔接。查看数据的示例代码如下:

  • d6tstack:https://github.com/d6t/d6tsta龙王鲸ck
  • d6tjoin:https://github.com/d6t/d6tjoin/blob/master/examples-prejoin.ipynb
assert df['id'].unique().shape[0] == len(ids) # have data for all ids?
assert df.isna().sum()<0.9 # catch missing values
assert 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?

没有注释代码

我理解黄播你急着做剖析。所以你把代码凑集起来得到成果,把成果交给你的客户或许老板。一周之后他们找到你,问你「你能改掉 xyz 吗?」或「你能更新一下成果吗?」。然后你和自己的代码大眼瞪小眼,既不记住你为什么要这么做,也不记住你做过什么。现在幻想一下其他人运转这段代码时的心境。

def some_com手滛plicated_function(data):
data = data[data['column']!='wrong']
dat爱豆是什么意思a = data.groupby('date').apply(lambda x: complicated_stuff(x))
data = data[data['value']<0.9]
return data

处理方案:即使你美素素现已完成了剖析,也要花时间注释一下你做过什么。你会感谢自己的,当然其他人会愈加感谢你!这样你看起来会更专业!

把数据存成 csv 或 pickl抿组词e

说回数据,究竟咱们评论的是数据科学。就像函数和 for 循环相同,CSV 和 pickle 文件也很常用,但它们其实并没有那么好。CSV 不包括形式(schema),所以每个人都必须从头解析数字和日期。Pickle 能够处理这一点,但只能用在 Python 中,并且不能紧缩。这两种格局都不合适存储大型数据集。

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 或许其他带有数据形式的二进制数据格局,最好还能紧缩数据。d6tflow 能够主动将数据输出存储为 parquet,这样你就不必处理这个问题了。

  • parquet:https://github.com/dask/fastparquet

运用 Jupyter notebook

这个定论还有一些争议——Jupyter notebook 就像 CSV 相同常用。许多人都会用到它们。但这并不能让它们变得更好。Jupyter notebook 助长了政治,数据科学家简略犯的10个代码过错,你选用了吗?-188体育官网_188金宝搏亚洲体育app_金宝搏官网上面说到的许多欠好的软件工程习气,特别是:

  1. 你会把一切文件存在一个目录中;
  2. 你写的代码是自上而下运转的,而不是 DAG;
  3. 你不会模块化你的代码;
  4. 代码难以调试;
  5. 代码和输出会混合在一个文件中;
  6. 不能很好地进行版别控giraffe制。

Jupyter notebook 很简略上手,但规划太小。

处理方案:用 pycharm 和/或 spyder。

原文链接:https://medium.com/m/global-identity?redirectUrl=https%3A%2F%2Ftowardsdatascience.com%2Ftop-10-coding-mistakes-made-by-data-scientists-bb5bc82faaee