从 Python 中的稀疏 SKU 数据创建邻接矩阵

Creating adjacency matrix from sparse SKU data in Python

我有大约 6000 个 SKU 和 250,000 个 obs 的电子商务数据。下面的简单版本,但更加稀疏。每行只有一个 SKU,因为每行都是一笔交易。

我有什么:

|Index| ID  | SKU1| SKU2 | SKU3| 
|:----|:----|:----|:-----|:----|
| 1   | 55  |  1  |  0   |  0  |
| 2   | 55  |  0  |  1   |  0  |
| 3   | 55  |  0  |  0   |  1  |
| 4   | 66  |  0  |  1   |  0  |
| 5   | 66  |  1  |  0   |  0  |
| 6   | 77  |  0  |  1   |  0  |

我想创建一个加权无向邻接矩阵,以便我可以对市场篮子进行一些图形分析。它看起来像下面这样,其中 SKU2 和 SKU1 在篮子 55 和 66 中一起购买,因此总重量为 2。

我想要的:

|Index| SKU1| SKU2| SKU3 | SKU4| 
|:----|:----|:----|:-----|:----|
| SKU1|  0  |  2  |  1   |  0  |
| SKU2|  2  |  0  |  0   |  0  |
| SKU3|  1  |  0  |  0   |  0  |
| SKU4|  0  |  0  |  0   |  0  |

我试过for循环遍历原始DF但是它立即崩溃了。

理想情况下,我会按 ID 列折叠第一个数据框,但不进行聚合,因为相同项目和相同 ID 没有重复交易。但是,当我尝试使用 df.groupby(['ID']).count() 折叠时,我得到以下信息。当我删除 .count() 时,没有输出。我确定还有另一种方法可以做到这一点,但似乎无法在文档中找到它。

我试过的:df.groupby(['ID']).count()

| ID  | SKU1| SKU2 | SKU3| 
|:----|:----|:---- |:----|
| 55  |  3  |  3   |  3  |
| 66  |  2  |  2   |  2  |
| 77  |  1  |  1   |  1  |

有谁知道如何生成稀疏矩阵而不立即使我的计算机崩溃?

Count 也计算零。改为按总和聚合,然后转换为 0 和 1。

agg = df.groupby('ID').agg('sum')
agg = (agg > 0).astype(int)

    SKU1    SKU2    SKU3
ID          
55  1       1       1
66  1       1       0
77  0       1       0

把它变成一个事件 table 并且不管什么原因用 0 填充对角线。

occurrence = np.dot(agg.T, agg)
np.fill_diagonal(occurrence, 0)

将其转回数据框

pd.DataFrame(occurrence, columns=df.columns[1:], index=df.columns[1:])

        SKU1    SKU2    SKU3
SKU1    0       2       1
SKU2    2       0       1
SKU3    1       1       0