클래스로 모듈화, 독스트링 작성

DanA·2022년 8월 24일
0

참고 :

  • 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)
profile
단아와라라

0개의 댓글