为列表字典创建 co-occurence 热图

Creating a co-occurence heatmap for a dictionary of lists

我无法弄清楚解决这个问题的 packages/logical 流程最有效。

我有一个这样的字典(为了便于阅读,值列表已经缩短):

dict = {'term_1': ['30939593',
  '30938516',
  '30930058',
  '30928978',
  '30927713',
  '30927284',
  '30925500',
  '30923740',
  '30922102',
   ...],
'term_2': ['30931235',
  '30938516',
  '30928978',
  '30922102',
  '30858642',
  '30828702',
  '30815562',
  '30805732',
  '30766735',
  '30746412',
  '30740089',
   ...],
   etc. 
}

在我列出的两个术语之间,有三个值 co-occur(30938516、30928978 和 30922102)。

字典包含大约 1800 个键,每个键都有对应 ID 的值列表,其中一些列表可能有 100,000 个值。

我希望能够在热图中根据值列表中 ID 的 co-occurrence 可视化字典中每个术语之间的相似度。如,热图的 x 轴和 y 轴将按顺序用相同的术语标记,并且热图的每个单元格将通过 co-occurring 的计数显示一个术语和另一个术语之间的 ID 重叠有值(在这种情况下,term_1 和 term_2 之间的 co-occurrence 将为 3)。这将对所有 1800 个术语重复,从而产生 1800x1800 的热图。


将值作为字符串,我尝试将字典转换为两个数据框:一个是术语 headers 列,值按列列出,另一个是术语行 headers,值按行列出。

首先,我将字典转换为数据框

df = pd.DataFrame.from_dict(dict, orient = 'index')
df = df[df.columns[0:]].apply(
    lambda x: ','.join(x.dropna().astype(str).astype(str)),
    axis = 1
)

但是,这只会将字典转换为长度为 1800 的单列。我还需要找到一种方法来扩展数据框,以便每列重复 1800 次。

一旦我有了这个 1800 x 1800 的列,我就会转置它。

df_transposed = df.T

如果我们要将我们正在比较的数据帧的每组单元格视为两个列表,我们可以像这样处理每个比较

l1 = ['30939593',
  '30938516',
  '30930058',
  '30928978',
  '30927713',
  '30927284',
  '30925500',
  '30923740',
  '30922102']
l2 = ['30931235',
  '30938516',
  '30928978',
  '30922102',
  '30858642',
  '30828702',
  '30815562',
  '30805732',
  '30766735',
  '30746412',
  '30740089']
from collections import Counter
c = len(list((Counter(l1) & Counter(l2)).elements()))

c = 3

但是,我不确定如何在数据帧的范围内循环遍历它

我想比较 1800x1800 网格的每个单元格,以便每个网格包含一个整数值,表示每个单元格中每个术语之间有多少 co-occuring ID。然后我会将这个 1800x1800 的整数网格转换为热图。

一种方法是先根据字典d计算重叠,然后用pivot:

制作所需的DataFrame
x = [(k1, k2, len(set(d1) & set(d2))) for k1,d1 in d.items() for k2,d2 in d.items()]
df = pd.DataFrame(x).pivot(index=0, columns=1, values=2)

print(df)

输出:

1       term_1  term_2
0                     
term_1       9       3
term_2       3      11

当然,对于热图:

sns.heatmap(df)

输出: