如何利用有限的计算资源来处理大型数据集
可直接在橱窗里购买,或者到文末领取优惠后购买:
处理大型数据集很有挑战性。如果你没有必要的资源,处理起来就更具挑战性。我们大多数人无法使用分布式集群、GPU 机架或超过 8GB 的 RAM。这并不意味着我们不能处理一些大数据。我们只需要一次解决一个问题。也就是说,一次迭代整个数据集并处理子集。
数据集
我们将向你展示如何使用大型(随机生成的)交易数据集来实现这一点。该数据集包含 75,000 名客户的超过 2.6 亿笔交易。交易时间从 2010 年到 2020 年。每笔交易都分为 12 种支出类型之一(例如杂货)。你可以在图 1 中看到更多详细信息,还可以在GitHub1上找到本教程的代码。
我们将了解如何使用批处理来创建此数据的不同聚合。具体来说,我们将计算:
- 交易总数
- 每年总支出
- 2020 年平均每月娱乐支出
最后,我们将讨论加快创建这些聚合过程的方法。
批量处理
我们将使用一些标准的 Python 包。我们有 NumPy 和 Pandas 用于数据处理,还有 matplotlib 用于一些简单的可视化。请确保你已安装这些包。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
首先,让我们尝试使用 Pandas 加载整个数据集。过了一会儿,我们得到了图 2 中的错误消息。由于只有 8GB 的 RAM,因此无法将整个数据集加载到内存中。
df = pd.read_csv(dp + 'transactions.csv')
为了解决这个问题,我们可以加载数据集的子集。为此,我们可以使用read_csv
函数中的skiprows
和 nrows
参数。下面我们分别将参数的值设置为 1000 和 2000。这意味着我们将跳过 CSV 的前 1000 行并加载接下来的 2000 行。我们还需要将列名作为参数传递(第 7 行)。这是因为我们跳过了 CSV 中的第一行名称。
names = ['CUST_ID', 'START_DATE', 'END_DATE', 'TRANS_ID', 'DATE', 'YEAR', 'MONTH', 'DAY', 'EXP_TYPE', 'AMOUNT']
# Load rows 1001 to 3000
df = pd.read_csv(dp + 'transactions.csv',
skiprows=1000,
nrows=2000,
names=names)
我们可以使用这些参数来迭代我们的数据集。为此,我们创建了下面的get_rows
函数。这可以使用它来返回我们数据集的子集。每个子集将包含由 step
参数确定的行数。count
参数会有所不同,以在每个步骤返回不同的子集。为了了解如何使用此功能,我们将计算数据集中的交易总数。
def get_rows(steps,count,names,path=dp+'transactions.csv'):
"""
Returns a subset of rows from a CSV. The fist [steps]*[count]
rows are skipped and the next [steps] rows are returned.
params
------------