У меня проблемы с выяснением, какие пакеты / логический поток для этой проблемы работают лучше всего.
У меня словарь примерно такой (список значений сокращен для удобства чтения):
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.
}
Между двумя перечисленными мною терминами одновременно встречаются три значения (30938516,30928978 и 30922102).
Словарь содержит около 1800 ключей, каждый со списком значений, которые являются соответствующими идентификаторами, и некоторые из этих списков могут иметь длину 100 000 значений.
Я хочу иметь возможность визуализировать в тепловой карте степень сходства между каждым термином в словаре на основе совместного использования идентификаторов в списке значений. Как и в случае, оси x и y тепловой карты были бы помечены одними и теми же терминами в последовательном порядке, и каждая ячейка тепловой карты будет показывать перекрытие идентификаторов между одним термином и другим термином путем подсчета количества одновременно встречающихся значений (в этом случае совместное вхождение между term_1 и term_2 будет равно 3). Это будет повторяться для всех 1800 терминов, что приведет к тепловой карте 1800x1800.
Что касается значений в виде строк, я попытался преобразовать словарь в два кадра данных: один, где термины являются заголовками столбцов, а значения перечислены по столбцам, а другой, где термины являются заголовками строк, а значения перечислены по строке.
Сначала я преобразовал словарь в фрейм данных
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 так, чтобы каждая сетка содержала целочисленное значение того, сколько сопутствующих идентификаторов было в каждой ячейке между каждым термином. Затем я бы преобразовал эту сетку целых чисел 1800x1800 в тепловую карту.