IndexError при назначении переменных для Neo4jRestClient - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь получить доступ к данным генома в SciKit Allele , инструменте, используемом для данных генома, на основе Numpy.

Я плохо разбираюсь в python, но пытаюсь перебрать каждый вариант и извлечь соответствующий столбец в массиве, чтобы затем создать узлы в базе данных Neo4j с помощью Neo4j Rest Client.

Приведенный ниже код генерирует массив всех вариантов и всех типов данных:

variants = allel.VariantChunkedTable(callset[chrom]['variants'], names=['AC','AF_AFR', 'AF_AMR', 'AF_ASN', 'AF_EUR', 'AF_MAX', 'CGT', 'CLR', 'CSQ', 'DP', 'DP4', 'ESP_MAF', 'FILTER_LowQual', 'FILTER_MinHWE', 'FILTER_MinVQSLOD', 'FILTER_PASS', 'HWE', 'ICF', 'ID', 'IS', 'PC2', 'PCHI2', 'POS', 'PR', 'QCHI2', 'QUAL', 'REF', 'ALT', 'INDEL', 'SHAPEIT', 'SNP_ID', 'TYPE', 'UGT', 'VQSLOD', 'dbSNPmismatch', 'is_snp', 'numalt', 'svlen'], index='POS')

Я (кажется, я) объявил переменные в виде массива следующим образом:

pos = variants['POS'][:]
alt = variants['ALT'][:]
dp = variants['DP'][:]
ac = variants['AC'][:]
type = variants['TYPE'][:]
svlen = variants['svlen'][:]
qual = variants['QUAL'][:]
vq = variants['VQSLOD'][:]

Эти переменные создают массивы, такие как:

In: pos
Out: array([    28590,     50481,     52152, ..., 249225077, 249229702,
       249231222], dtype=int32)

Сейчас я пытаюсь получить доступ к переменным для каждой строки, но не могу понять, как это сделать. Моя текущая попытка выглядит так (для первых 10 строк):

for variant in variants[0:10]:
    a1 = db.nodes.create(pos=pos[variant], bp=alt[variant][0], DP=dp[variant], AC=ac[variant][0], type=type[variant][0], svlen=svlen[variant][0], qual=qual[variant], vqslod=vq[variant])
    a1.relationships.create("belongs_to", c1)

К сожалению, возникает следующая ошибка:

IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

Может кто-нибудь помочь мне понять, как получить конкретную переменную для каждого атрибута?

1 Ответ

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

Поскольку я не смог следовать вашему коду без воспроизводимого примера, мне пришлось создать его на основе документации scikit-allel:

https://scikit -allel.readthedocs.io / ен / стабильный / модель / chunked.html # variantchunkedtable

import h5py
import allel
import os

#cleanup
h5_file = 'callset.h5'
os.remove(h5_file) if os.path.exists(h5_file) else None

chrom = [b'chr1', b'chr1', b'chr2', b'chr2', b'chr3', b'chr3']
pos = [2, 7, 3, 9, 6, 11]
dp = [35, 12, 78, 22, 99, 96]
qd = [4.5, 6.7, 1.2, 4.4, 2.8, 3.2]
ac = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10), (11, 12)]

with h5py.File(h5_file, mode='w') as h5f:
    h5g = h5f.create_group('/3L/variants')
    h5g.create_dataset('CHROM', data=chrom, chunks=True)
    h5g.create_dataset('POS', data=pos, chunks=True)
    h5g.create_dataset('DP', data=dp, chunks=True)
    h5g.create_dataset('QD', data=qd, chunks=True)
    h5g.create_dataset('AC', data=ac, chunks=True)


callset = h5py.File(h5_file, mode='r')
variants = allel.VariantChunkedTable(callset['/3L/variants'],
                                names=['CHROM', 'POS', 'AC', 'QD', 'DP'])

Итак, переменная variants (в этом примере всего 6 строк) выглядит так:

>>> variants
<VariantChunkedTable shape=(6,) dtype=[('CHROM', 'S4'), ('POS', '<i8'), ('AC', '<i8', (2,)), ('QD', '<f8'), ('DP', '<i8')] 
nbytes=264 cbytes=264 cratio=1.0 values=h5py._hl.group.Group>
    CHROM   POS AC      QD  DP
0   b'chr1' 2   [1 2]   4.5 35
1   b'chr1' 7   [3 4]   6.7 12
2   b'chr2' 3   [5 6]   1.2 78
3   b'chr2' 9   [7 8]   4.4 22
4   b'chr3' 6   [ 9 10] 2.8 99
5   b'chr3' 11  [11 12] 3.2 96

Вы правильно определили массивы pos, alt, dp и т. Д. (Т. Е. pos = variants['POS'][:] и т. Д.)

Затем в вашем цикле я предполагаю, что ваша цель состоит в том, чтобы перебрать первые 10 строк переменной variants, получить некоторые значения из каждой строки, например, pos[variant], ac[variant][0], dp[variant] и создайте новый узел в базе данных GraphDatabase с этими атрибутами.

То, как вы сейчас пишете цикл, вы получаете полную строку из variants на каждой итерации и пытаетесь использовать ее в качестве индекса для доступа к элементам из pos, alt, ... массивы, которые выдают ошибку.

Правильный способ сделать это - перебирать числовые индексы; в моем примере, чтобы перебрать все 6 строк переменной variants, вы должны выполнить:

for i in range(len(variants)):
    print(f"> Row {i}")
    print(pos[i])
    print(dp[i])
    print(ac[i][0])

Значения pos [i], dp [i] и т. Д. Затем можно вводить в db.nodes.create в парах name=value. Конечно, для первых 10 строк вам просто нужно использовать for i in range(10).

...