os.popen read()报编码错误_数据科学家易犯的十大编码错误,你中招了吗?

选自 Medium

作者:Norm Niemer

机器之心编译

参与:李诗萌、王淑婷

数据科学家比软件工程师擅长统计,又比统计学家擅长软件工程。听起来牛逼轰轰,事实却是,许多数据科学家有统计学背景,却没有什么软件工程方面的经验,因此在编码时容易犯一些简单的错误。作为一名高级数据科学家,本文作者总结了他在工作中常见数据科学家犯的十大错误。

0925a394cf72423c0ea3fdc837455387.png

我是一名高级数据科学家,在 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 中,这一点后面的内容会讲到)。

硬编码其他人无法访问的路径

和错误 1 类似,如果硬编码其他人无法访问的路径,他们就没法运行你的代码,而且在很多地方都必须要手动修改路径。Booo!

import pandas as pd
df = pd.read_csv('/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
├── output.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 File 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-code-is-probably-bad-c291752e4953

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

解决方案:与其用线性链接函数,不如写一组有依赖关系的任务。可以用 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/d6tstack

  • 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_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

解决方案:即便你已经完成了分析,也要花时间注释一下你做过什么。你会感谢自己的,当然其他人会更加感谢你!这样你看起来会更专业!

把数据存成 csv 或 pickle

说回数据,毕竟我们讨论的是数据科学。就像函数和 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 助长了上面提到的许多不好的软件工程习惯,特别是:

  1. 你会把所有文件存在一个目录中;

  2. 你写的代码是自上而下运行的,而不是 DAG;

  3. 你不会模块化你的代码;

  4. 代码难以调试;

  5. 代码和输出会混合在一个文件中;

  6. 不能很好地进行版本控制。

Jupyter notebook 很容易上手,但规模太小。

解决方案:用 pycharm 和/或 spyder。af0f17335a7ad6f507127563add8a231.png

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

本文为机器之心编译,转载请联系本公众号获得授权

✄------------------------------------------------

加入机器之心(全职记者 / 实习生):hr@jiqizhixin.com

投稿或寻求报道:content@jiqizhixin.com

广告 & 商务合作:bd@jiqizhixin.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/538252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux怎么添加工作组,linux 用户与工作组

在linux 里面&#xff0c;用户的编号UID &#xff0c;也就是用户的ID号。工作组的编号为GID 也就是工作组的ID 号 。1、用户的分类超级用户&#xff1a;root用户&#xff0c;系统安装过程中自动创建&#xff0c;UID 为0。普通用户&#xff1a;操作权限受到限制的用户id在 500-6…

MySQL5.7.12新密码登录方式及密码策略

原文链接&#xff1a;http://www.cnblogs.com/jonsea/p/5510219.html --------------------------------------------------------------------------- 松门一枝花补充 最简单的方法&#xff1a; 1、配置文件中把密码策略关了。本文中间部分有介绍。 2、重启服务 3、用my…

聚类分析在用户行为中的实例_聚类分析案例之市场细分

聚类是将数据分类到不同的类或者簇这样的一个过程&#xff0c;所以同一个簇中的对象有很大的相似性&#xff0c;而不同簇间的对象有很大的相异性。从统计学的观点看&#xff0c;聚类分析是通过数据建模简化数据的一种方法。传统的统计聚类分析方法包括系统聚类法、分解法、加入…

linux 编译system.img,android生成sysytem.img的命令过程

Fromhttp://xianghuaclm.blog.163.com/blog/static/6668783201110221486240/使用#file system.img输出&#xff1a;system.img: Linux rev 0.0 ext2 filesystem data,UUID4eb0489c-647d-49d8-9111-94657b5fd342, volume name"system"。然而本人使用命令#mkyaffs2imag…

Hive的hiveserver2后台开启和关闭

前提&#xff1a;hive/bin配置了环境变量。如果没有配置&#xff0c;cd到 hive目录下的bin里&#xff0c;再执行。 开启命令&#xff1a; nohup hive --service hiveserver2 & 产生的日志&#xff1a; 默认在&#xff1a; 用户文件夹里 [rootmaster ~]# ll total 80 …

记一次,jvm 内存溢出

1、什么是内存泄漏内存泄漏是指&#xff0c;有未被释放的java对象&#xff0c;一直停留在内存中。GCRoot 无法追踪到此对象&#xff0c;导致此对象无法被回收。 2、什么是内存溢出内存溢出是指&#xff0c;java程序创建对象需要内存&#xff0c;但是却没有内存可用了&#xff0…

ebnf范式_使用Scala基于词法单元的解析器定制EBNF范式文法解析

前言近期在做Oracle迁移到Spark平台的项目上遇到了一些平台公式翻译为SparkSQL(on Hive)的需求&#xff0c;而Spark采用亲妈语言Scala进行开发。下面是个意外&#xff0c;被论文查重了,移步至我的Leanote博客查看点我&#xff0c;先乱码一段时间[分后&#xff0c;拟使中的EB式&…

钻石指标和完美的计算

钻石的高度计算公式为&#xff1a;钻石的高度直径的三次方&#xff08;单位毫米&#xff09;0.00366(允许有0.03克拉的误差)例如&#xff0c;0.5克拉的钻石直径是5.01毫米&#xff0c;则它的高为&#xff1a;5.01*5.01*5.01*0.003660.46说明0.5克拉的钻石直径只有0.46克拉钻石的…

linux开机自动ZFS,linux – 为什么重新启动导致我的ZFS镜像的一面成为UNAVAIL?

我最近刚刚将批量数据存储池(ZFS OnLinux 0.6.2,Debian Wheezy)从单设备vdev配置迁移到双向镜像vdev配置.之前的池配置是&#xff1a;NAME STATE READ WRITE CKSUMakita ONLINE 0 0 0ST4000NM0033-Z1Z1A0LQ ONLINE 0 0 0在重新启动完成后一切都很好(我在重新启动完成后启动了一…

华为交换机默认vlan都是通的吗_【思唯网络学院】华为交换机常用的三种vlan划分方法...

端口类型在学习划分vlan前&#xff0c;必须要了解华为交换机的端口类型&#xff0c;以及他们的使用方法&#xff0c;因为端口的类型在实际配置中是必须会用到的&#xff0c;因为下面的vlan划分会用到。1、Access类型端口执行命令port default vlan vlan-id&#xff0c;将端口加…

Spark应用日志级别设置

Spark-core包设置默认的日志级别为info&#xff0c;所以我们才看到一大堆日志信息。 开发的时候&#xff0c;把print的日志掩盖了。 方法一&#xff1a; 代码中设置日志级别 JavaSparkContext contextnew JavaSparkContext(conf); context.setLogLevel("warn"); 方…

linux 恢复操作系统,如何恢复Linux操作系统的GRUB引导程?

先使用一张修复盘进入grub&#xff0c;或者利用其他linux恢复盘等等进入linux系统&#xff0c;然后进入grub控制台。总之就是想尽办法进入一个控制台就是了。然后准备引导进入硬盘上的Linux系统。如下&#xff1a;  grub> root (hd0,10)  grub> kernel /boot/vmlinuz…

Centos 7初始化脚本

今天跟大家分享一个我自己写的Linux初始化脚本&#xff0c;自认为写的不是很好。希望看到这篇文章的你&#xff0c;能暂时停留下你的脚步&#xff0c;给些修改意见&#xff0c;或者有什么需要补充的地方都可以提出来&#xff0c;大家共同进步&#xff0c;谢谢&#xff01;此脚本…

Hive-sql与SQL的区别

总体一致&#xff1a; Hive-sql与SQL基本上一样&#xff0c;因为当初的设计目的&#xff0c;就是让会SQL不会编程MapReduce的也能使用Hadoop进行处理数据。 因此&#xff0c;大胆使用SQL的&#xff0c;如果遇到不对的&#xff0c;再查。 区别&#xff1a; Hive没有delete和u…

python闰年多一天_记一个 python datetime 闰年问题

python中datetime是比较常用的&#xff0c;平时用起来也没什么问题&#xff0c;但是今天2020年2月29日服务器却开始报错了&#xff0c;这里有个平时难以注意的坑服务器上跑的是新浪网的爬虫&#xff0c;抓取的页面信息中带有日期 XX月XX日&#xff0c;需要strfptime转化一下&am…

linux find 按类型查找,Linux find查找find命令详解

玩蛇网推荐图文教程&#xff1a;python 列表Linux命令有很多&#xff0c;今天要介绍的是常用的基础命令中的find命令。find是Linux系统管理员所喜爱用的必备工具命令之一&#xff0c;它的作用是可以很轻松地找到你想要的文件&#xff0c;一个命令就可以在众多文件中找到你的目标…

window安装gcc编译器

在使用 GraphLab Create 时&#xff0c;导入包失败&#xff0c;提示libs没有的导入&#xff0c;而这些libs的编译是需要gcc。 1、访问&#xff1a;http://www.mingw.org/ 下载。 2、双击安装 3、安装好后会弹出下面的组件安装界面 3、找到mingw32-gcc-g&#xff08;注意cl…

视频AI,助力体育赛事转播走进智能时代

摘要&#xff1a;2018俄罗斯世界杯经过近20天的激战&#xff0c;已经进入到最关键的阶段。本次赛事除了精彩纷呈的比赛之外&#xff0c;还加入很多高科技的元素&#xff0c;例如门线、VAR技术等等。让本届世界杯成为科技含量最高的一届世界杯。2018俄罗斯世界杯经过近20天的激战…

python求同构数_用c语言求1到1000的同构数_后端开发

python与平台有关吗_后端开发Python与平台无关&#xff0c;因为Python是跨平台的语言&#xff0c;Python作为脚本语言&#xff0c;是解释执行的&#xff0c;所以能跨平台&#xff0c;前提是必须要有一个对应的解释器。具体请看实例&#xff1a;python中count函数的用法详解_后端…

element表格实现树形全选_很实用!word中全选的快捷键介绍及使用方法

全选快捷键可以提高我们在操作word时工作效率&#xff0c;在操作Word2003中怎么对文档中的文字进行全选呢?下面为大家提供几种全选的方法&#xff0c;绝对好用。Word怎样全选?方法一、使用Word全选快捷键“CtrlA”进行全选(也适用于电子表格);方法二、展开菜单栏中的“编辑”…