Я выполняю поиск значения, прочитанного из файла в большом фрейме данных, используя np.where, и это занимает 98% времени.Выполнение кода занимает около 19 часов.
Таким образом, этот код просматривает фрейм данных, содержащий 2 столбца из примерно полумиллиона записей, причем первый столбец содержит числовые значения, а 2-й столбец содержит текст.Теперь рабочий процесс заключается в том, что я читаю другой файл построчно, а затем ищу 'alleleID' в кадре данных и извлекаю некоторые данные из кадра данных, как только он совпадает.Я делаю это, используя код np.where.
res = np.where(df['alleleID'] == alist[0])
Эта строка занимает около 98% в line_profiler.Итак, как мне улучшить это?
После исследования я попробовал df.loc после индексации, но проблема, которую я обнаружил, заключается в том, что каждый раз, когда я ищу один аллель ID, прочитанный из файла, который находится в переменной (alist [0]) и я не могу передать эту переменную для поиска, используя
res = df.loc(alist[0])
, поскольку df.loc всегда ожидает значение, а не переменную.
Буду признателен за любую помощь для повышения производительностиэтой программы.Спасибо.Полный код ниже:
with open('C:/Data/DATA/ClinVar/temp.dat', 'r') as varFile:
count = 0
dat1 = []
dat2 = []
dat3 = []
dat4 = []
dat5 = []
dat6 = []
dat7 = []
dat8 = []
dat9 = []
dat10 = []
dat11 = []
dat12 = []
dat13 = []
dat14 = []
dat15 = []
dat16 = []
dat17 = []
dat18 = []
dat19 = []
dat20 = []
dat21 = []
dat22 = []
dat23 = []
dat24 = []
dat25 = []
dat26 = []
dat27 = []
dat28 = []
dat29 = []
dat30 = []
dat31 = []
dat32 = []
dat33 = []
dat34 = []
dat35 = []
dat36 = []
dat37 = []
dat38 = []
dat39 = []
dat40 = []
for line in varFile:
alist = line.split('\t')
count += 1
print(alist[0], "-", count)
if(alist[1] == 'single nucleotide variant'):
hgvs = '-'
aaChange = ''
otherID = '-'
otherID1 = '-'
uniProt = ''
uniProt_var = ''
omim_list = ''
if alist[2] and not alist[2].isspace():
hgvs = alist[2].split(' ')
i = 0
for i in range(0,len(hgvs)):
if(hgvs[i][0] == "("):
aaChange = hgvs[i]
else:
hgvs = '-'
otherID = alist[28].split(',')
j = 0
omim = ''
uniprot = ''
hgmd = ''
hbvar_list = ''
uni_list = ''
hgmd_list = ''
flag1 = 0
flag2 = 0
flag3 = 0
flag4 = 0
flag5 = 0
indices1 = [i for i, elem in enumerate(otherID) if 'OMIM' in elem]
for b in range(0, len(indices1)):
omim = otherID[indices1[b]].split(':')
flag2 += 1
if(flag2 == 2):
omim_list = omim_list+','+omim[1]
#print("OMIM_list",omim_list)
else:
omim_list = omim[1]
indices2 = [i for i, elem in enumerate(otherID) if 'HGMD' in elem]
for b in range(0, len(indices2)):
hgmd = otherID[indices2[b]].split(':')
flag3 += 1
if(flag3 == 2):
hgmd_list = hgmd_list+','+hgmd[1]
else:
hgmd_list = hgmd[1]
indices3 = [i for i, elem in enumerate(otherID) if 'HBVAR' in elem]
for b in range(0, len(indices3)):
hbvar = otherID[indices3[b]].split(':')
flag4 += 1
if(flag4 == 2):
hbvar_list = hbvar_list+','+hbvar[1]
else:
hbvar_list = hbvar[1]
indices4 = [i for i, elem in enumerate(otherID) if 'UniProtKB' in elem]
for b in range(0, len(indices4)):
otherID1 = otherID[indices4[b]].split(':')
flag5 += 1
if(flag5 == 2):
uni_list = uni_list+','+otherID1[1]
else:
uni_list = otherID1[1]
AF_ESP = ''
AF_EXAC = ''
AF_TGP = ''
res = np.where(df['alleleID'] == alist[0])
if res[0].size != 0:
res1 = df['info'][res[0][0]].split(';')
indices5 = [i for i, elem in enumerate(res1) if 'AF_ESP' in elem]
for b in range(0, len(indices5)):
res2 = res1[indices5[b]].split('=')
AF_ESP = res2[1]
indices6 = [i for i, elem in enumerate(res1) if 'AF_EXAC' in elem]
for b in range(0, len(indices6)):
res2 = res1[indices6[b]].split('=')
AF_EXAC = res2[1]
indices7 = [i for i, elem in enumerate(res1) if 'AF_TGP' in elem]
for b in range(0, len(indices7)):
res2 = res1[indices7[b]].split('=')
AF_TGP = res2[1]
alist[30] = alist[30].rstrip('\n')
dat1.append(alist[0])
dat2.append(alist[1])
dat3.append(alist[2])
dat4.append(hgvs[0])
dat5.append(aaChange)
dat6.append(omim_list)
dat7.append(uni_list)
dat8.append(hgmd_list)
dat9.append(hbvar_list)
dat10.append(alist[3])
dat11.append(alist[4])
dat12.append(alist[5])
dat13.append(alist[6])
dat14.append(alist[7])
dat15.append(alist[8])
dat16.append(alist[9])
dat17.append(alist[10])
dat18.append(alist[11])
dat19.append(alist[12])
dat20.append(alist[13])
dat21.append(alist[14])
dat22.append(alist[15])
dat23.append(alist[16])
dat24.append(alist[17])
dat25.append(alist[18])
dat26.append(alist[19])
dat27.append(alist[20])
dat28.append(alist[21])
dat29.append(alist[22])
dat30.append(alist[23])
dat31.append(alist[24])
dat32.append(alist[25])
dat33.append(alist[26])
dat34.append(alist[27])
dat35.append(alist[28])
dat36.append(alist[29])
dat37.append(alist[30])
dat38.append(AF_ESP)
dat39.append(AF_EXAC)
dat40.append(AF_TGP)
# Creating DF from lists
df1 = []
df1 = pd.DataFrame(list(zip(dat1,dat2,dat3,dat4,dat5,dat6,dat7,dat8,dat9,dat10,dat11,dat12,dat13,dat14,dat15,dat16,dat17,dat18,dat19,dat20,dat21,dat22,dat23,dat24,dat25,dat26,dat27,dat28,dat29,dat30,dat31,dat32,dat33,dat34,dat35,dat36,dat37,dat38,dat39,dat40)), columns = ['alleleID','Type','Name','HGVSName','ProteinChange','OMIM','UniProt','HGMD','HBVAR','GeneID','GeneSymbol','HGNC_ID','ClinicalSignificance','ClinSigSimple','LastEvaluated',"RS# (dbSNP)",'nsv/esv (dbVar)','RCVaccession','PhenotypeIDS','PhenotypeList','Origin','OriginSimple','Assembly','ChromosomeAccession','Chromosome','Start','Stop','ReferenceAllele','AlternateAllele','Cytogenetic','ReviewStatus','NumberSubmitters','Guidelines','TestedInGTR','OtherIDs','SubmitterCategories','VariationID','AF_ESP','AF_EXAC','AF_TGP'])