独家 | Python处理海量数据集的三种方法

独家 | Python处理海量数据集的三种方法_第1张图片

作者:Georgia Deaconu
翻译:陈超
校对:欧阳锦


本文约1200字,建议阅读5分钟
本文介绍了Python处理数据集的方法。

作为一名数据科学家,我发现自己处理“大数据”的情况越来越多。我叫做大数据的是那些虽然不是很大,但是却足够让我的电脑处理到崩溃并且拖慢其他程序。

独家 | Python处理海量数据集的三种方法_第2张图片

图片来自 Mika Baumeister UNsplash

这个问题并不新鲜,且对于所有问题而言,从来没有一劳永逸的万能公式。最好的方法依赖于你的数据以及你应用的目的。然而,最流行的解决方法通常在以下描述的分类之中。

1. 通过优化数据类型来减少内存使用

当使用Pandas从文件里加载数据的时候,如果不提前设定,通常会自动推断数据类型。

多数情况下这没什么问题,但是推断的数据类型并不一定是最优的。甚至,如果数值型列数据包括了缺失值,推断数据类型就会自动填充为浮点型。

在我处理大部分表征年、月或日的整型数据的时候,我最近通常会使用这种方法进行分析:

b245de1034482eeb1dedc9401b4acac3.png

使用Pandas加载文件并明确数据类型(图片来自作者)

对于特定的案例,明确数据类型会让使用内存大大减少。请注意上述例子中用到的pandas类型pandas.Int16Dtype来使包含缺失值的列数据强制转换成整型数据。当在处理大型数据集时,需要你拥有对拟处理数据集的一些先验知识,因而会通过在内部使用pandas.NA而非numpy.nan来实现缺失值的最优数据类型。在纯粹探索未知数据集的时候该方法可能并不适用。

2. 将数据分块

当数据太大以至于与内存不相符,你可以使用Pandas的chunksize选项来将数据集分块,而非处理一大整块数据。使用该选项创造迭代器对象用于浏览不同块,并像加载整个数据集时进行过滤或分析。

以下是使用该选项浏览Yelp reviews 数据集的例子,提取每个块里评论日期的最小值和最大值,然后重建评论的完整时间跨度:

reader = pd.read_json(reviews_path, lines=True, orient = "records", chunksize = 100000)    
 # go through the chunks and extract min/max date    
 date_limits = []  
for chunk in reader:   
 date_limits.append(max(chunk.date))        
 date_limits.append(min(chunk.date))   
  print("Reviews span from {} to {}". format(min(date_limits).strftime('%d-%m-%Y'),   
  max(date_limits).strftime('%d-%m-%Y')))

分块可用于最初的探索性分析到模型训练,仅需极少的额外启动即可实现。

3. 利用惰性计算

惰性计算指的是仅仅在真正需要执行的时候才计算的表达式。惰性计算是一个重要的概念(尤其在功能编程当中使用),如果你想阅读更多关于它在python中的不同用法,你可以从这里开始

(https://towardsdatascience.com/what-is-

lazy-evaluation-in-python-9efb1d3bfed0)。

惰性计算是像Spark或者Dask这样的分配计算框架建立的基础。虽然他们设计用于聚类,你仍然可利用它们在你的个人电脑上处理大型数据集。

与Pandas主要的差异是它们不会直接在内存加载数据。相反,在读取命令的时候会扫描数据,推断数据类型并将其分成独立的部分(到目前为止没有新建)。仅仅在需要时独立为这些部分创建计算图形(因此叫做惰性)。

在之前的文章(https://towardsdatascience.com/a-pyspark-example-for-dealing-with-larger-than-memory-datasets-70dbc82b0e98)里,我提供了一个Pyspark的例子,对一个大于内存的数据集做探索性分析。Dask也很流行,并且例子也不难找(你可以查看两者比较https://docs.dask.org/en/latest/spark.html)。Dask语法仿照Pandas的语法,所以看起来很相似,然而Dask仅限于Python使用,但Spark可以在Java或Scala中使用。

其他库例如Vaex或Modin也提供了相似的功能,但是我本人还没有尝试过。

原文标题:

3 ways to deal with large datasets in Python

原文链接:

https://towardsdatascience.com/5-ways-to-deal-with-large-datasets-in-python-9a80786c4182

编辑:于腾凯

校对:林亦霖

译者简介

独家 | Python处理海量数据集的三种方法_第3张图片

陈超,北京大学应用心理硕士在读。本科曾混迹于计算机专业,后又在心理学的道路上不懈求索。越来越发现数据分析和编程已然成为了两门必修的生存技能,因此在日常生活中尽一切努力更好地去接触和了解相关知识,但前路漫漫,我仍在路上。

翻译组招募信息

工作内容:需要一颗细致的心,将选取好的外文文章翻译成流畅的中文。如果你是数据科学/统计学/计算机类的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友欢迎加入翻译小组。

你能得到:定期的翻译培训提高志愿者的翻译水平,提高对于数据科学前沿的认知,海外的朋友可以和国内技术应用发展保持联系,THU数据派产学研的背景为志愿者带来好的发展机遇。

其他福利:来自于名企的数据科学工作者,北大清华以及海外等名校学生他们都将成为你在翻译小组的伙伴。

点击文末“阅读原文”加入数据派团队~

转载须知

如需转载,请在开篇显著位置注明作者和出处(转自:数据派ID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。

发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。

独家 | Python处理海量数据集的三种方法_第4张图片

点击“阅读原文”拥抱组织

你可能感兴趣的:(python,数据分析,大数据,java,人工智能)