gpt4 book ai didi

python - 如何解决稀疏矩阵的缓慢 groupby 问题?

转载 作者:行者123 更新时间:2023-12-02 07:14:00 27 4
gpt4 key购买 nike

我有一个大矩阵(约 2 亿行),描述每天发生的操作列表(有约 10000 个可能的操作)。我的最终目标是创建一个共现矩阵,显示哪些操作在同一天内发生。

这是一个示例数据集:

data = {'date':   ['01', '01', '01', '02','02','03'],
'action': [100, 101, 989855552, 100, 989855552, 777]}
df = pd.DataFrame(data, columns = ['date','action'])

我尝试使用 pd.get_dummies 创建一个稀疏矩阵,但是解开该矩阵并对其使用 groupby 非常慢,只需要 6 分钟即可处理 5000 行。

# Create a sparse matrix of dummies
dum = pd.get_dummies(df['action'], sparse = True)
df = df.drop(['action'], axis = 1)
df = pd.concat([df, dum], axis = 1)

# Use groupby to get a single row for each date, showing whether each action occurred.
# The groupby command here is the bottleneck.
cols = list(df.columns)
del cols[0]
df = df.groupby('date')[cols].max()

# Create a co-occurrence matrix by using dot-product of sparse matrices
cooc = df.T.dot(df)

我也尝试过:

  1. 以非稀疏格式获取虚拟对象;
  2. 使用groupby进行聚合;
  3. 在矩阵乘法之前进入稀疏格式。

但是我在步骤 1 中失败了,因为没有足够的 RAM 来创建如此大的矩阵。

非常感谢您的帮助。

最佳答案

我仅使用基于 this post 的稀疏矩阵得出了一个答案。该代码速度很快,1000 万行大约需要 10 秒(我之前的代码需要 6 分钟处理 5000 行,并且不可扩展)。

时间和内存的节省来自于使用稀疏矩阵,直到最后一步,在导出之前需要解开(已经很小的)共现矩阵。

## Get unique values for date and action
date_c = CategoricalDtype(sorted(df.date.unique()), ordered=True)
action_c = CategoricalDtype(sorted(df.action.unique()), ordered=True)

## Add an auxiliary variable
df['count'] = 1

## Define a sparse matrix
row = df.date.astype(date_c).cat.codes
col = df.action.astype(action_c).cat.codes
sparse_matrix = csr_matrix((df['count'], (row, col)),
shape=(date_c.categories.size, action_c.categories.size))

## Compute dot product with sparse matrix
cooc_sparse = sparse_matrix.T.dot(sparse_matrix)

## Unravel co-occurrence matrix into dense shape
cooc = pd.DataFrame(cooc_sparse.todense(),
index = action_c.categories, columns = action_c.categories)

关于python - 如何解决稀疏矩阵的缓慢 groupby 问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59856694/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com