繁体   English   中英

从 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  |

我尝试了一个遍历原始 DF 的 for 循环,但它立即崩溃。

理想情况下,我会按 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 也计算零。 而是按 sum 聚合,然后转换为 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

把它变成一个出现表,并用 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM