Python:未堆叠的数据帧太大,导致 int32 溢出



我有一个很大的数据集,当我尝试运行此代码时,我收到内存错误。

user_by_movie = user_items.groupby(['user_id', 'movie_id'])['rating'].max().unstack()

这是错误:

ValueError: Unstacked DataFrame is too big, causing int32 overflow

我已经在另一台机器上运行了它,它工作正常! 如何修复此错误?

根据谷歌的说法,您可以将熊猫版本降级到 0.21,这在数据透视表和数据太大的情况下没有问题。

正如@Ehsan指出的,我们可以分块地旋转表。

假设您有一个包含 3,355,205 行的数据帧!
让我们构建大小为 5000 的块:

chunk_size = 5000
chunks = [x for x in range(0, df.shape[0], chunk_size)]
for i in range(0, len(chunks) - 1):
print(chunks[i], chunks[i + 1] - 1)
0 4999
5000 9999
10000 14999
15000 19999
20000 24999
25000 29999
30000 34999
35000 39999
40000 44999
45000 49999
50000 54999
55000 59999
60000 64999
65000 69999
70000 74999
75000 79999
..continue..

您现在要做的就是在pd.concat()内进行列表理解:

df_new = pd.concat([df.iloc[ chunks[i]:chunks[i + 1] - 1 ].pivot(index='user_id', columns='item', values='views') for i in range(0, len(chunks) - 1)])

当你必须为某些推荐系统制作稀疏矩阵时,这个答案很好.
在此之后,你可以做:

from scipy import sparse
spr = sparse.coo_matrix(df_new.to_numpy())

事实证明,这不是熊猫 0.21 的问题。我正在使用Jupyter笔记本,其余代码需要最新版本的pandas。所以我这样做了:

!pip install pandas==0.21
import pandas as pd
user_by_movie = user_items.groupby(['user_id', 'movie_id'])['rating'].max().unstack()
!pip install pandas

此代码适用于 Jupyter 笔记本。首先,它将熊猫降级到 0.21 并运行代码。在拥有所需的数据集后,它会将熊猫更新到最新版本。在此处查看 GitHub 上提出的问题。 这篇文章也有助于增加Jupyter笔记本的内存。

一些建议是降级到熊猫==0.21,这不是一个真正可行的解决方案!

我遇到了同样的问题,需要紧急修复意外的int32溢出。我们的推荐模型之一在生产环境中运行,在某些时候,用户群数量增加到超过 700 万条记录,涉及大约 21k 个项目。

因此,为了解决这个问题,我@igorkf提到的对数据集进行了分块,使用 unstack 创建数据透视表并逐渐附加它。

import pandas as pd 
from tqdm import tqdm
chunk_size = 50000
chunks = [x for x in range(0, df.shape[0], chunk_size)]
for i in range(0, len(chunks) - 1):
print(chunks[i], chunks[i + 1] - 1)
0 49999
50000 99999
100000 149999
150000 199999
200000 249990
.........................

pivot_df = pd.DataFrame()
for i in tqdm(range(0, len(chunks) - 1)):
chunk_df = df.iloc[ chunks[i]:chunks[i + 1] - 1]
interactions = (chunk_df.groupby([user_col, item_col])[rating_col]
.sum()
.unstack()
.reset_index()
.fillna(0)
.set_index(user_col)
)
print (interactions.shape)
pivot_df = pivot_df.append(interactions, sort=False) 

然后我必须制作一个稀疏矩阵作为 lightFM 推荐模型的输入(运行矩阵分解算法(。您可以将其用于需要解绑的任何用例。使用以下代码,转换为稀疏矩阵-

from scipy import sparse
import numpy as np
sparse_matrix = sparse.csr_matrix(df_new.to_numpy())

注意:Pandas具有pivot_table功能,如果您的数据很小,该功能可用于解绑。就我而言,pivot_table真的很慢。

查看 Dask。它允许您扩展pandas,NumPy和Scikit-learn等工具。它是操作大型数据集的有用工具,即使这些数据集不适合内存。

此问题已在更高版本的 pandas (1.4.X( #45084 中修复。 升级你的熊猫版本,你应该通过。

最新更新