pandas库+3个小技巧=内存占用小、读取时间少?
点击上方关注,All in AI中国
Pandas已经成为最受欢迎的数据科学库之一。它易于使用,文档非常棒,而且功能强大。
然而,无论使用哪一个库,大型的数据集总是会带来额外的挑战,这些是需要谨慎处理的。
你一开始遇到硬件障碍,是因为您没有足够的内存来保存所有数据。尤其是遇到企业公司存储的数据集最多可达到100GB或甚至1000的GB的情况。
即使你确实是购买了足够内存来存储所有数据的计算机,将其读入内存中的速度也会非常慢。
但是Pandas库将再次帮助我们。本文将讨论三种技巧,你可以使用它们来减少大数据集的内存占用和读取时间。我已经尝试将这些技术用于超过100GB大小的数据集,并将它们压缩到只有64 GB甚至32GB RAM的机器上。
下面让我们来看看吧!
整理你的数据
CSV格式是一种非常方便的数据存储方式,易于编写且人们可读。 另外,有一个很好的pandas函数read_csv()用于加载存储为CSV的数据。但是当你的CSV太大以至于内存不足时会发生什么?有一个非常简单的Pandas技巧来处理它! 我们并不是尝试去一次性处理我们的数据,而是将它们分成几个部分。 通常,这些部分称为块。块只是我们数据集的一部分。 我们可以根据需要去制作成大块或小块,这取决于我们有多少内存。
这个过程是这样进行的:
- 先读入一大块
- 并处理块
- 保存块的结果
- 重复步骤1到3,直到得到所有块结果
- 组合块的结果
我们可以使用名为chunksize的read_csv()函数的方便变量来执行上述所有步骤。chunksize表示一次读取多少CSV行。这当然取决于您有多少内存以及每一行有多大。
如果我们认为我们的数据像高斯分布一样很容易处理,那么我们就可以一对一的,对每个块执行我们想要的处理和可视化,因此不会损失太多的准确性。
如果我们的分布有点像泊松分布那样复杂,那么最好在处理之前过滤每个块并将所有小块放在一起。大多数情况下,您最终会删除许多不相关的列或删除缺少值的行。我们可以对每个块都这样做,使它们更小,然后将它们放在一起,并对最终的数据文件执行数据分析。
以下的代码执行了这些步骤。
删除数据
有时候,我们会先知道我们想要分析数据集中的哪些列。事实上,通常情况下,有几个或多个列是我们不关心的。
在读取数据之前直接跳过列可以节省大量内存。pandas允许我们,而且指定我们想要读取的列:
丢弃包含没有用的信息的列,将是节省内存的方法之一。
我们可以做的另一件事是过滤掉任何缺失或NA值的行。这是用dropna()函数最简单的:
有一些非常有用的变量,我们可以传递给dropna():
方法:
这将允许你指定"any"(如果其中任何列是NA,则删除一行)或"all"(仅当所有列都是NA时,才删除一行)
thresh:设置一个阈值,表示要删除一行需要多少个NA值
subset:选择将考虑用于检查NA值的列子集
你可以使用这些参数,尤其是thresh和subset来真正具体了解哪些行将被删除。
Pandas在读取时没有像列一样的方法来做这个,但我们可以像上面那样在每个块上做到这一。
为每一列设置特定的数据类型
对于许多初学数据科学家来说,为每列设置特定数据类型数据类型,并没有在过多考虑范围之内。 但是一旦开始处理非常大的数据集时,处理数据类型就变得至关重要。
通常的做法是读取dataframe,然后根据需要转换列的数据类型。但是对于一个大的数据集,我们真的必须注意内存空间。CSV中可能有一些列,比如浮点数,它们将占用比它们需要的更多的空间。例如,如果我们下载了一个用于预测股票价格的数据集,我们的价格可能被保存为32位浮点数!
但我们真的需要32个浮点数(float)吗?大多数情况下,股票是以小数点后两位指定的价格买进的。即使我们想要非常精确,浮点数16也足够了。
因此,我们不是使用列的原始数据类型读入数据集,而是指定我们希望pandas在我们的列中使用读取的数据类型。 这样,我们永远不会消耗比实际需要更多的内存。
使用read_csv()函数中的dtype参数很容易做到这一点。我们可以指定一个字典,其中每个键是数据集中的一列,每个值是我们希望使用该键的数据类型。
举个pandas的例子:
我们的教程到此结束!希望这三个技巧能帮你节省很多时间和内存!
编译出品