참고 :
vs code에 docstring 틀 작성해주는 extension :
이름: autoDocstring - Python Docstring Generator
VS Marketplace 링크: https://marketplace.visualstudio.com/items?itemName=njpwerner.autodocstring
Trouble shotting : parmap을 클래스 내부에서 사용하려니까 function인 make_false_set을 사용하는데, 전역변수가 아닌 로컬변수로 되어 있어서 에러가 떴었음. 일단 간단하게 외부로 빼줬는데, 좀 더 고급진 코드를 짤 순 없을까?
https://dojang.io/mod/page/view.php?id=2366
https://stackoverflow.com/questions/52265120/python-multiprocessing-pool-attributeerror
from array import array
import parmap
import multiprocessing
import itertools
import numpy as np
from tqdm import tqdm
import time
from numpy import random
import pandas as pd
def make_false_set(a, b):
ar = np.empty((0, 3))
for allele, peptide in tqdm(itertools.product(*[a, b])):
time.sleep(1)
ar = np.append(ar, np.array([[allele, peptide, allele+'_'+peptide]]), axis=0)
return ar
class MakeFalseSet():
"""
Artificial False data를 만들기 위해, [allele x peptide seq]를 만들어주는 클래스입니다.
Args :
_random_seed : random.choice(size=_random_seed)
_size (int): random하게 뽑아 줄 peptide sequence의 개수
_allele_list : 사용할 allele list들 입니다.
_length : 9mer or 10mer
_save_path : 저장할 경로
Functions :
extract_random_peptide_seq_list : 랜덤추출한 peptide sequence list를 리턴합니다.
make_false_set_df : 최종 완성본인 데이터프레임의 형태로 리턴합니다.
save_false_set_df() : 데이터프레임을 저장합니다.
"""
def __init__(self, _random_seed, _size, _allele_list, _length, _save_path):
"""
Args:
_random_seed (int): random seed 번호
_size (int): random하게 뽑아 줄 peptide sequence의 개수
_allele_list (list, arraylike): 사용할 allele들의 list
_length (str(int)): n-mer
_save_path (str): 저장할 경로
"""
self.random_seed = _random_seed
self.size = _size
self.allele_list = _allele_list
self.length = _length
self.random_peptide_seq_list = []
self.af_arr = np.empty((0, 3))
self.AF_df = pd.DataFrame()
self.save_path = _save_path
def extract_random_peptide_seq_list(self, _peptide_seq_list):
"""_summary_ : 랜덤추출한 peptide sequence list를 리턴합니다.
Args:
_peptide_seq_list (list): Artificial False peptide sequence의 모든 list를 넣어주세요
Returns:
random_peptide_seq_list (list): size에 맞춰서 랜덤 추출된 peptide sequence list
"""
random.seed(self.random_seed)
peptide_seq_list = _peptide_seq_list
self.random_peptide_seq_list = random.choice(peptide_seq_list, size=self.size)
# random_pepseq_10mer = random.choice(pepseq_10mer, size=self._size)
return self.random_peptide_seq_list
# def make_false_set(self):
# """_summary_
# Returns:
# _type_: _description_
# """
# for allele, peptide in tqdm(itertools.product(*[self.allele_list, self.random_peptide_seq_list])):
# time.sleep(1)
# self.af_arr = np.append(self.af_arr, np.array([[allele, peptide, allele+'_'+peptide]]), axis=0)
# # df = pd.DataFrame(af_arr, columns=['allele', 'Peptide_seq', 'HLA_pep_seq'])
# return self.af_arr
def make_false_set_df(self):
"""_summary_
Returns:
dataframe: _description_
"""
global make_false_set
input = self.allele_list
_num_cores = multiprocessing.cpu_count()
split_input = np.array_split(np.array(input), _num_cores)
split_input = [x.tolist() for x in split_input]
AF_list = parmap.map(make_false_set, split_input, self.random_peptide_seq_list, pm_pbar=True, pm_processes=_num_cores)
# af_df = np.reshape(af_arr, (176, 3))
# red = pd.DataFrame(re)
AF_ndarray = np.empty((0, 3))
for _idx, _array in enumerate(AF_list):
AF_ndarray = np.append(AF_ndarray, _array, axis=0)
self.AF_df = pd.DataFrame(AF_ndarray, columns = ['allele', 'Peptide_seq', 'HLA_pep_seq'])
self.AF_df['answer'] = 0
self.AF_df['length'] = self.length
return self.AF_df
def save_false_set_df(self):
self.AF_df.to_pickle(self.save_path)