从 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
我有大约 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