Лучший способ создать таблицу ребер из матрицы данных с помощью Python - PullRequest
0 голосов
/ 29 января 2019

Я хочу создать граф генов из таблицы данных.Моя таблица T имеет 2 столбца, столбец «ID» и столбец «Genes» со списками в нем.Списки содержат гены (Strings).

Я хочу, чтобы мои гены были узлами (один узел для каждого гена), и ребра должны соединяться с двумя генами, которые имеют один и тот же идентификатор.Я много пробовал, но мне нужно самое быстрое решение, потому что таблица содержит от 700 тысяч до 2,7 миллионов строк.

Как мне поступить?Например, как я могу найти все появления определенного гена в моей таблице?

Я уже достиг генерации nd.array всех упомянутых генов.Затем я дважды попытался перебрать этот список с помощью nd.nditer, чтобы получить все попарные комбинации, а затем перебрать все строки, чтобы проверить, есть ли оба гена в одном из списков.Пример ниже.

Затем я попытался сначала преобразовать таблицу, найдя все идентификаторы для определенного гена, а затем перейти оттуда.Эта идея - второй цикл for.

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

for gene1 in nd.nditer(mentionendGenes):
    for gene2 in nd.nditer(mentionendGenes):
        for row in range(0,len(T['ID'])):
            if (gene1 in T['Genes'].values[row]) and (gene2 in T['Genes'].values[row])
                G.add_edge(gene1,gene2)


for gene in np.nditer(mentionendGenes):
    for listofgenes in np.nditer(T['Genes'].values, flags = ['refs_ok']):
        if gene in listofgenes:
            doStuff()

1 Ответ

0 голосов
/ 30 января 2019

Частичный ответ:

Ваш первый подход, вероятно, можно упростить (и ускорить), просто позвонив

import itertools
for row in range(0,len(T['ID'])): 
    G.add_edges_from(itertools.combinations(T['Genes'].values[row], 2))

Вы можете обнаружить, что это можно еще немного улучшить, получив всекрая по всем рядам в первую очередь.Для правильного тестирования нам понадобится тестовый набор приличного размера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...