[英]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.