ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [NumPy] np.all, np.any 실전 사용예시
    AI, DataScience 2023. 6. 26. 13:01
    728x90

    각종 질환의 가족별 가족력을 구하는 코드를 만들어 보자.

     

    기존 데이터셋은

    병 있는 가족 1 아버지
    병 있는 가족 2 누나
    병 있는 가족 3 동생
    병 있는 가족 4 없음

    이런 식으로 되어 있었는데, 

     

    가족력 없음 False
    병 있는 부모 True
    병 있는 형제자매 True
    병 있는 기타 가족 False

    이런 식으로 바꾸는 코드를 만들어보자

     

    내가 기존에 짠 코드이다.

    # 세상에 내 코드는 구데기였어
    # 가족력 가공
    # N: 가족력 없음, P: parent 부모, S: sibling 형제자매, O: other 기타
    
    disease_dict = { # 각 질환별 가족력 있는 가족의 최대 인원
        'HT': 4,
        'DM': 4,
        'CVA': 3,
        'OS': 2,
        'CVB': 2,
        'CD': 2,
        'PV': 2,
        'LP': 2,
        'GT': 2,
        'CH': 1
    }
    
    for disease, num_family in disease_dict.items(): # 질환마다 가족 수가 달라 다르게 만듦..?
        if num_family == 1:
            dataset['AS1_FM'+disease+'REL_N'] = np.where((dataset['AS1_FM'+disease+'REL1A'] == 99999), 1, 0)
            for i in range(num_family):
                for f in ['P', 'S', 'O']:
                    dataset['AS1_FM'+disease+'REL_'+f] = np.where(dataset['AS1_FM'+disease+'REL1A'] == i, 1, 0)
        elif num_family == 2:
            dataset['AS1_FM'+disease+'REL_N'] = np.where((dataset['AS1_FM'+disease+'REL1A'] == 99999) &
                                                         (dataset['AS1_FM'+disease+'REL2A'] == 99999), 1, 0)
            for i in range(num_family):
                for f in ['P', 'S', 'O']:
                    dataset['AS1_FM'+disease+'REL_'+f] = np.where((dataset['AS1_FM'+disease+'REL1A'] == i) |
                                                                  dataset['AS1_FM'+disease+'REL2A'] == i, 1, 0)
        elif num_family == 3:
            dataset['AS1_FM'+disease+'REL_N'] = np.where((dataset['AS1_FM'+disease+'REL1A'] == 99999) &
                                                         (dataset['AS1_FM'+disease+'REL2A'] == 99999) &
                                                         (dataset['AS1_FM'+disease+'REL3A'] == 99999), 1, 0)
            for i in range(num_family):
                for f in ['P', 'S', 'O']:
                    dataset['AS1_FM'+disease+'REL_'+f] = np.where((dataset['AS1_FM'+disease+'REL1A'] == i) |
                                                                  (dataset['AS1_FM'+disease+'REL2A'] == i) |
                                                                  (dataset['AS1_FM'+disease+'REL3A'] == i), 1, 0)
        elif num_family == 4:
            dataset['AS1_FM'+disease+'REL_N'] = np.where((dataset['AS1_FM'+disease+'REL1A'] == 99999) &
                                                         (dataset['AS1_FM'+disease+'REL2A'] == 99999) &
                                                         (dataset['AS1_FM'+disease+'REL3A'] == 99999) &
                                                         (dataset['AS1_FM'+disease+'REL4A'] == 99999), 1, 0)
            for i in range(num_family):
                for f in ['P', 'S', 'O']:
                    dataset['AS1_FM'+disease+'REL_'+f] = np.where((dataset['AS1_FM'+disease+'REL1A'] == i) |
                                                                  (dataset['AS1_FM'+disease+'REL2A'] == i) |
                                                                  (dataset['AS1_FM'+disease+'REL3A'] == i) |
                                                                  (dataset['AS1_FM'+disease+'REL4A'] == i), 1, 0)

    분명 반복문을 써서 코드를 단순화하려고 했지만... 반복되는 구문이 많아 가독성이 떨어진다. 어떻게 하면 좋을까?

     

    이 문제는

    • List Comprehesion
    • np.all
    • np.any

    를 잘 활용하면 간단하게 만들 수 있다.

     

    # 와 ChatGPT가 아니었다면 np.all과 np.any를 몰랐을거야!
    # 가족력 가공
    # N: 가족력 없음, P: parent 부모, S: sibling 형제자매, O: other 기타
    
    disease_dict = {
        'HT': 4,
        'DM': 4,
        'CVA': 3,
        'OS': 2,
        'CVB': 2,
        'CD': 2,
        'PV': 2,
        'LP': 2,
        'GT': 2,
        'CH': 1
    }
    
    for disease, num_family in disease_dict.items():
        dataset[f'AS1_FM{disease}REL_N'] = np.all(dataset[[f'AS1_FM{disease}REL{i}A' for i in range(1, num_family+1)]] == 99999, axis=1).astype(int)
        for f in ['P', 'S', 'O']:
            dataset[f'AS1_FM{disease}REL_{f}'] = np.any(dataset[[f'AS1_FM{disease}REL{i}A' for i in range(1, num_family+1)]] == np.arange(num_family)[:, None], axis=0).astype(int)

     

     

     

     

     

    728x90

    댓글

안녕하세요? 반가워요. 광고 눌러주세요?