前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >独家 | Python处理海量数据集的三种方法

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

作者头像
数据派THU
发布2022-03-04 11:05:38
7450
发布2022-03-04 11:05:38
举报
文章被收录于专栏:数据派THU数据派THU
代码语言:javascript
复制
作者:Georgia Deaconu
翻译:陈超校对:欧阳锦
本文约1200字,建议阅读5分钟本文介绍了Python处理数据集的方法。

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

图片来自 Mika Baumeister UNsplash

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

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

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

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

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

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

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

2. 将数据分块

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

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

代码语言:javascript
复制
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

编辑:于腾凯校对:林亦霖

译者简介

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

翻译组招募信息

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

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

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

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

转载须知

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

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-01-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据派THU 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档