Поскольку я не смог следовать вашему коду без воспроизводимого примера, мне пришлось создать его на основе документации 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)
.