0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

数据科学家常犯的10个编程错误

电子工程师 来源:fqj 2019-05-24 14:50 次阅读

数据科学家是“比软件工程师更擅长统计学,比统计学家更擅长软件工程的人”。许多数据科学家都具有统计学背景,但是在软件工程方面的经验甚少。我是一名资深数据科学家,在Stackoverflow的python编程方面排名前1%,并与许多(初级)数据科学家共事。以下是我经常看到的10大常见错误,本文将为你相关解决方案:

不共享代码中引用的数据

对无法访问的路径进行硬编码

将代码与数据混合

在Git中和源码一起提交数据

编写函数而不是DAG

写for循环

不编写单元测试

不写代码说明文档

将数据保存为csv或pickle文件

使用jupyter notebook

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

数据科学需要代码和数据。因此,为了让别人可以复现你的结果,他们需要能够访问到数据。道理很简单,但是很多人忘记分享他们代码中的数据。

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

解决方案:使用d6tpipe来共享你的代码中的数据文件、将其上传到S3/web/google驱动等,或者保存到数据库,以便于别人可以检索到文件(但是不要将其添加到git,原因见下文)。

2.对无法访问的路径进行硬编码

与错误1相似,如果你对别人无法访问的路径进行硬编码,他们将无法运行你的代码,并且必须仔细查看代码来手动更改路径。令人崩溃!

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

解决方案:使用相对路径、全局路径配置变量或d6tpipe,使你的数据易于访问。

3.将代码与数据混合

既然数据科学的代码中包含数据,为什么不把它们放到同一目录中?那样你还可以在其中保存图像、报告和其他垃圾。哎呀,真是一团糟!

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

解决方案:将你的目录进行分类,比如数据、报告、代码等。请参阅Cookiecutter Data Science或d6tflow项目模板[见#5],并使用#1中提到的工具来存储和共享数据。

4.在Git中和源码一起提交数据

现在,大多数人对他们的代码使用版本控制(如果你不使用,那就是另外一个错误,请参阅git:https://git-scm.com/)。在尝试共享数据时,很容易将数据文件添加到版本控制中。当文件很小时是可以的,但是git并没有针对数据进行优化,尤其是大文件。

gitadddata.csv

解决方案:使用第1点中提到的工具来存储和共享数据。如果你真的希望对数据进行版本控制,请参阅d6tpipe,DVC和Git大文件存储。

5.编写函数而不是DAG

关于数据部分已经够多了,现在来谈一谈实际的代码!在学习编程时最先学习的内容之一就是函数,数据科学代码通常由一系列线性运行的函数组成。

这会导致一些问题,请参阅“为什么你的机器学习代码可能不好的4个原因”:

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

解决方案:数据科学代码不是一系列线性连接的函数,而是一组具有依赖关系的任务集合。

6.写for循环

与函数类似,for循环也是你学习编程时最初学习的内容。它们易于理解,但是运行缓慢且过于冗长,通常意味着你不了解矢量化的替代方案。

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循环的情况提供了矢量化函数。

7.不编写单元测试

随着数据、参数或用户输入的改变,你的代码可能会出现问题,有时你并没有注意到。这可能会导致糟糕的输出结果,而如果有人基于你的输出做出决策,那么糟糕的数据将会导致糟糕的决策。

解决方案:使用assert语句来检查数据质量。pandas有相等测试,d6tstack有数据提取检查以及用于数据连接的d6tjoin。

以下是数据检查的示例代码:

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.不写代码说明文档

我明白,你急着做出一些分析结果。你把事情汇总到一起分析,将结果交给你的客户或老板。一个星期之后,他们回来说,“可以把XXX改一下吗”或者“可以更新一下这里吗”。你看着你的代码,但是并不记得你当初为什么这么写。现在就像是在运行别人的代码。

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

解决方案:即使在你已经提交分析报告后,也要花费额外的时间,来对你做的事情编写说明文档。以后你会感谢自己,别人更会感谢你。那样显得你很专业!

9.将数据保存为csv或pickle文件

回到数据,毕竟是在讲数据科学。就像函数和for循环一样,CSV和pickle文件很常用,但是并不好用。CSV文件不包含纲要(schema),因此每个人都必须再次解析数字和日期。Pickle文件解决了这个问题,但是它只能在python中使用,并且不能压缩。两者都不是存储大型数据集的最优格式。

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或其他带有数据纲要的二进制数据格式,在理想情况下可以压缩数据。d6tflow将任务的数据输出保存为parquet,无需额外处理。

10.使用jupyter notebook

最后一个是颇有争议的错误:jupyter notebook和csv文件一样普遍。许多人使用它们,但是这并不意味着它们很好。jupyter notebook助长了上述提到的许多不良编程习惯,尤其是:

把所有文件保存在一个目录中

编写从上至下运行的代码,而不是DAG

没有对代码进行模块化

很难调试

代码和输出混在一个文件中

没有很好的版本控制

它容易上手,但是扩展性很差。

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程
    +关注

    关注

    88

    文章

    3440

    浏览量

    92401
  • 函数
    +关注

    关注

    3

    文章

    3868

    浏览量

    61309

原文标题:数据科学家常犯的 10 个编程错误

文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    关于C语言编程常犯错误汇总

    17个C语言新手编程常犯错误及解决方式
    的头像 发表于 06-26 09:19 5864次阅读
    关于C语言<b class='flag-5'>编程</b>时<b class='flag-5'>常犯</b>的<b class='flag-5'>错误</b>汇总

    TI科学家谈浮点DSP未来发展

    TI科学家谈浮点DSP未来发展 自十多年前浮点数字信号处理器(DSP)诞生以来,便为实时信号处理提供了算术上更为先进的备选方案。不过,定点器件至今仍是业界的主流--当然低成本是主要原因。定点DSP每
    发表于 11-03 15:18

    科学家推出多种波动描记传感器

      美国得克萨斯大学的科学家们最新一项研究结果表明,人们很快将根据肠子的波动情况当场揭穿骗子的谎言。  该大学的科研小组还认为,将来有一天,以记录心脏活动为主的多种波动描记器将极大地提高其工作质量
    发表于 10-24 11:40

    生物电磁波揭密 场导发现(俄罗斯华裔科学家写的脑控技术丛书)

    生物电磁波揭密场导发现(俄罗斯华裔科学家写的脑控技术丛书)
    发表于 03-05 09:31

    通往数据科学家的崎岖道路

    如果你曾经查看过数据科学家的岗位要求,你就知道它的职责范围有多广。有的数据科学家致力于自然语言处理、计算机视觉、深度学习,有的则从事A/B测试、产品分析。确定哪些工作适合自己,哪些不适
    的头像 发表于 07-26 09:17 2341次阅读

    哪些才是对数据科学家最迫切的技能呢?

    AngelList提供的是列出数据科学家岗位的公司数而不是岗位数。我把AngelList从所有分析里面排除掉了,因为其搜索算法似乎按照OR型的逻辑搜索进行,没有办法改成AND。如果你寻找的是“数据
    的头像 发表于 11-19 18:14 2851次阅读

    为什么说数学知识是数据科学家的先决条件?

    一位优秀的数据科学家或工程师必须具备丰富的数据库知识和工程实践知识。包括处理和记录错误、监控系统,构建人为错误容错渠道,了解扩展项目所需的条
    的头像 发表于 01-29 09:19 3163次阅读

    什么是数据科学家?需要认证吗?

    得以清晰化。”Fleming指出,IBM目前雇佣了大约1.5万名被定义为数据科学家的技术人员,预计数据科学家人数的增长速度超过其雇员总数的增长速度。
    的头像 发表于 02-14 09:41 6238次阅读

    数据科学家与机器学习工程师怎么区分

    十年来,我们一直在谈论数据科学数据科学家。虽然在怎么才叫“数据科学家”的问题上始终存在着争议,
    的头像 发表于 05-18 11:24 2987次阅读

    数据科学家数据工程师的区别

    数据科学家和数据工程师的主要区别,可以用ETL和DAD的区别来解释。
    的头像 发表于 07-10 17:06 2417次阅读

    企业如何解决数据科学家短缺详细方法什么

     随着企业以数据为中心的文化,以做出决策和规划,数据科学家对全球企业的重要性日益增加。但是企业无法足够快地聘请数据科学家,因为合格候选人仍然
    的头像 发表于 04-18 10:31 3255次阅读

    采访资深数据科学家:成为数据科学家应具有的品质

    作为一门逐渐成熟的新兴领域,与数据科学相关的很多领域开始变得备受青睐,比如数据工程,数据分析以及机器学习和深度学习。数据
    的头像 发表于 06-30 11:28 2059次阅读

    什么是数据科学家的最佳编程语言?

    每个数据科学学习者都最常问的问题:“ 什么是数据科学家的最佳编程语言?”。
    的头像 发表于 07-05 11:32 2285次阅读

    数据科学家和数据工程师能合二为一吗?

    虽然数据科学家和数据工程师的角色似乎截然不同,但数据科学家和数据工程师有许多共同的特点和共技能。这些重叠的技能包括处理和操作大数据集、应用
    的头像 发表于 07-25 10:17 2366次阅读

    中国联通AI科学家廉士国入选全球前2%顶尖科学家榜单

    前2%顶尖科学家榜单是Elsevier和斯坦福大学John P.A. Ioannidis教授团队合作的具有全球影响力的项目成果,为全球学术界提供了一个面向科学家长期科研表现的衡量指标,旨在更客观、更真实地反映科学家全球影响力。榜
    的头像 发表于 11-07 16:18 2330次阅读