AI, DataScience

[NumPy] np.all, np.any 실전 사용예시

이무기뱀술 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