百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

代码排名前1%的数据科学家揭露我们容易犯的十大编码错误!

toyiye 2024-06-21 12:20 10 浏览 0 评论

点击上方关注,All in AI中国

数据科学家是“比任何软件工程师都更擅长统计数据的人,而且比任何统计学家都更擅长软件工程”。许多数据科学家都有统计学背景,但在软件工程方面经验很少。我是一名高级数据科学家,在Stackoverflow上python代码排名前1%,我经常与许多(初级)数据科学家合作。这是我们经常看到的10个常见错误列表。

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

数据科学需要代码和数据。因此,为了让其他人能够重现您的结果,他们需要能够访问数据。这似乎是一个很自然而然的事情,但是很多人忘记用代码共享他们的数据。

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

解决方案:使用d6tpipe与您的代码共享数据文件或上传到S3 / web / google驱动器等或保存到数据库,以便收件人可以检索文件(但不要将它们添加到git,参见下面的内容)。

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

与错误1类似,如果您对其他人无权访问的路径进行硬编码,则他们无法运行您的代码并且必须查看许多地方以手动更改路径。 Booo!

import pandas as pd
df = pd.read_csv('/path/i-dont/have/data.csv') # fails
do_stuff(df)
# or 
import os
os.chdir('c:\\Users\\yourname\\desktop\\python') # fails

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

3.将数据与代码混合

由于数据科学代码需要数据,为什么不将它转储到同一目录中?当你在做的时候,需要保存图像、报告和其他垃圾,太多混杂在一起的麻烦事儿了!

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

解决方案:将目录组织成如数据、报告、代码等类别。请参阅Cookiecutter Data Science或d6tflow项目模板(请参阅#5),并使用#1中提到的工具来存储和共享数据。

4.Git使用源代码提交数据

大多数人现在控制他们的代码版本(如果你不这样做,那就是另一个错误了!!请参阅git)。在尝试共享数据时,可能很容易将数据文件添加到版本控制中。这对于非常小的文件是可以的,但是git没有针对数据进行优化,尤其是大文件。

git add data.csv

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

5.编写函数而不是DAG

上面关于数据的讨论已经很多了,让我们谈谈实际的代码吧!由于您在学习编码时首先学到的第一件事就是函数,因此数据科学代码主要由一系列线性运行的函数组成的。这会导致一些问题,请参阅为什么您的机器学习代码可能不好的4个原因。

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或风流。

6.写循环

与函数一样,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为您认为可能需要循环的大多数事物提供了矢量化函数。

7.不要写单元测试

随着数据、参数或用户输入的变化,您的代码可能会中断,有时您不会注意到。这可能导致输出错误,如果有人根据您的输出做出决定,那么糟糕的数据将导致错误的决策!

解决方案:使用assert语句检查数据质量。 pandas有相等的测试,d6tstack有数据摄取检查,d6tjoin有数据连接检查。代码示例数据检查:

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?

8.不要记录代码

有时候你会着急做一些分析,把事情都挤在一起做,然后直接将结果交给了你的老板。一个星期后,当他们问你“你能改变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

解决方案:即使在您提供分析之后,也要花费额外的时间来记录您的所作所为。你会感谢自己,其他人也会感谢你这样做的!这样的你看起来更像专业人士!

9.将数据保存为csv或pickle

让我们接着回到数据,毕竟是数据科学。就像函数和for循环一样,CSV和pickle文件是常用的,但它们实际上并不是很好。 CSV不包含架构,因此每个人都必须再次解析数字和日期。 Pickles解决了这个问题但只能在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,这样就不必处理它。

10.使用jupyter笔记本

让我们以一个有争议的结论来结束:jupyter笔记本和CSV一样普遍。很多人都使用它们,这并不能使他们变得更好。 Jupyter笔记本促进了上面提到的许多不良软件工程习惯,特别是:

  1. 您很想将所有文件转储到一个目录中
  2. 您编写的代码运行自上而下,而不是DAG
  3. 您没有模块化您的代码
  4. 很难调试
  5. 代码和输出混合在一个文件中
  6. 他们没有很好的版本控制

它很容易上手,但规模很小。

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

Bio:作者Norman Niemer是一位大型资产管理公司的首席数据科学家,负责提供数据驱动的投资洞察力。他拥有哥伦比亚大学的金融工程硕士学位和伦敦卡斯商学院的银行和金融学士学位。

编译出品

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码