Создание совмещенной тепловой карты для словаря списков - PullRequest
0 голосов
/ 04 апреля 2019

У меня проблемы с выяснением, какие пакеты / логический поток для этой проблемы работают лучше всего.

У меня словарь примерно такой (список значений сокращен для удобства чтения):

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 в тепловую карту.

1 Ответ

1 голос
/ 04 апреля 2019

Один из способов - сначала вычислить перекрытия на основе словаря d, а затем создать требуемый DataFrame с помощью pivot:

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)

Выход:

picture

...