AI 헬스케어 3기 데이터 분석 코스 Python (7)

람다함수 (Lambda Functions)

람다함수는 간단한 함수를 한 줄로 정의할 수 있는 익명 함수입니다.


의료 데이터 처리에서 환자 목록 정렬, 조건부 필터링, 데이터 변환 등에 매우 유용합니다.


왜 람다함수가 필요할까?

간단한 작업을 위해 함수를 계속 만들기 번거로움

데이터 정렬/필터링에서의 편리함


#a,b라는 파라미터를 가져와서 이 두개를 더한 값을 return하는 함수

def add(a, b): 

    return a + b


add(10, 20)


람다함수 사용법

람다함수는 lambda 키워드를 사용해 간단하게 함수를 정의하며 return 키워드 없이 표현식의 결과를 자동으로 리턴합니다.


기본 문법


# 기본 형태

lambda 파라미터: 리턴할 표현식


# 예시

lambda x: x * 2



# 일반 함수

def calculate_bmi(weight, height):

    return weight / (height ** 2)


# 람다함수로 변환

calculate_bmi_lamda = lambda weight, height: weight / (height ** 2)


# 사용법은 동일

patient_bmi = calculate_bmi_lamda(70, 1.75)

print(f"환자 BMI: {patient_bmi:.1f}")



표현식이란?

표현식(Expression)은 값을 계산해서 결과를 만들어내는 코드입니다.


# 이것들이 모두 "표현식"입니다

x + 5           # 계산 표현식

"hello"         # 문자열 표현식

x > 10          # 비교 표현식

a if b else c   # 조건 표현식


# 상황 연산자

#value1 if 조건식 else value2


age = 10

# 나이에 따라서 미성년자 or 성인 판별

adult = "성인" if age >= 18 else "미성년자" #"미성년자" or "성인"

print(adult) # 미성년자


#if age >= 18:

#  adult = "성인" 

#else:

#  adult = "미성년자"


 람다함수의 활용


1. 조건문에 활용


# 혈압 분류 함수


classify_bp = lambda systolic: "고혈압" if systolic >= 140 else "고혈압전단계" if  systolic >= 120 else "정상"


def classify_bp(systolic):

   if systolic >= 140:

     return "고혈압"

   elif systolic >= 120:

     return "고혈압전단계"

    else:

      return "정상"

# 환자 혈압 분류

patients_bp = [120, 135, 145, 110, 155]

for bp in patients_bp:

    print(f"혈압 {bp}: {classify_bp(bp)}")


2. 데이터 정렬에 활용

sorted() 함수의 key 매개변수에는 어떤 기준으로 정렬할지를 알려주는 함수를 넣어줍니다.

# 환자 정보 리스트

patients = [

    {"name": "김환자", "age": 65, "systolic": 140, "temperature": 36.8},

    {"name": "이환자", "age": 45, "systolic": 120, "temperature": 37.2},

    {"name": "박환자", "age": 55, "systolic": 155, "temperature": 36.5},

    {"name": "최환자", "age": 70, "systolic": 135, "temperature": 38.1}

]


# 혈압 기준으로 정렬 (람다함수 사용)

patients_sorted_by_systolic = sorted(patients, key=lambda patient: patient["systolic"])

#                                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

#                                               각 환자에서 혈압값을 뽑아서 정렬 기준으로 사용

print("=== 혈압 기준 정렬 ===")

for patient in patients_sorted_by_systolic:

    print(f"{patient['name']}: {patient['systolic']}mmHg")


# 나이 기준으로 정렬 (내림차순)

patients_sorted_by_age = sorted(patients, key=lambda patient: patient["age"], reverse=True)


print("=== 나이 기준 정렬 (내림차순) ===")

for patient in patients_sorted_by_age:

    print(f"{patient['name']}: {patient['age']}세")


일반 함수 vs 람다함수


# 환자 정보 리스트

patients = [

    {"name": "김환자", "age": 65, "systolic": 140, "temperature": 36.8},

    {"name": "이환자", "age": 45, "systolic": 120, "temperature": 37.2},

    {"name": "박환자", "age": 55, "systolic": 155, "temperature": 36.5},

    {"name": "최환자", "age": 70, "systolic": 135, "temperature": 38.1}

]


# 1. 일반 함수 방식

def get_patient_risk_level(patient):

    if patient["systolic"] >= 160:

        return "고위험"

    elif patient["systolic"] >= 140:

        return "중위험"

    else:

        return "저위험"


risk_levels = [get_patient_risk_level(p) for p in patients]



# 2. 람다함수 방식 (간단한 경우에만)

get_risk = lambda p: "고위험" if p["systolic"] >= 160 else "중위험" if p["systolic"] >= 140 else "저위험"

risk_levels = [get_risk(p) for p in patients]


환자 체온 분류

환자의 체온을 받아서 발열 여부를 판단하는 함수를 두 가지 방식으로 작성하세요.


# 여기에 코드를 작성하세요


# 방법 1: 일반 함수 방식

def check_fever(temperature):

  if temperature >= 37.5:

      return "발열"

  else: 

      return "정상"


return "발열" if fever >= 37.5 else "정상"


# 방법 2: 람다함수 방식

check_fever_lambda = almbda if temperature : "발열" if temperature >= 37.5 else "정상"


람다함수 사용 시 주의사항

언제 사용하면 좋을까?

✅ 간단한 계산이나 변환

✅ 일회성 정렬/필터링

✅ map, filter, sorted 함수와 함께

✅ 즉석 데이터 처리

언제 사용하지 말아야 할까?

❌ 복잡한 로직 (3줄 이상)

❌ 반복적으로 사용되는 함수

❌ 디버깅이 중요한 핵심 로직

❌ 다른 사람이 이해하기 어려운 복잡한 조건

람다함수는 의료 데이터 처리에서 빠르고 간편한 도구입니다.

적절히 사용하면 코드가 훨씬 간결하고 효율적이 되지만, 너무 복잡하게 만들면 오히려 가독성을 해칠 수 있으니 상황에 맞게 사용하세요.


# 점심 메뉴 추천하는 프로그램

import random


lunch_menu = ["된장찌개", "김치볶음밥", "비빔면", "제육볶음", "돈까스"]

dinner_menu = ["삼겹살", "피자", "파스타", "곱창", "치킨"]


# 1. 사용자에게 입력값 받아오기


meal = input("점심/저녁 중에 선택하세요")

meal 


# 2. 방아온 입력값을 기준으로 해당 메뉴리스트에서 랜덤으로 값 뽑아오기


get_menu = lambda meal: random.sample(lunch_menu,1)[0]if meal == "점심" else random.sample(dinner_menu,1)[0]

print(get_menu(meal))


데이터 처리

keyboard_arrow_down

 JSON 데이터 처리

JSON (JavaScript Object Notation)은 딕셔너리와 리스트 같은 파이썬 데이터를 텍스트 파일로 저장하거나 웹에서 주고받을 때 사용하는 표준 데이터 형식입니다.

의료진이 EMR 시스템, 의료 API, 연구 데이터를 다룰 때 자주 접하게 되는 형식입니다.



JSON이란?

JSON은 문자열 형식으로, 의료 데이터를 구조화해서 저장하고 전송할 때 널리 사용됩니다.


Python ↔ JSON 변환


json.dumps() - Python → JSON 문자열


import json # JSON 데이터 처리를 위한 파이썬 내장 모듈


# 환자 정보를 딕셔너리로 저장

patient_info = {

    "patient_id": "P001",

    "name": "박환자",

    "age": 45,

    "department": "내과",

    "diagnosis": ["고혈압", "당뇨병"],

    "medications": ["혈압약", "당뇨약"],

    "is_emergency": False,

    "blood_sugar": 120.5

}


# JSON 문자열로 변환

json_string = json.dumps(

    patient_info,           # JSON으로 변환할 파이썬 객체

    ensure_ascii=False,     # 한글 등 비ASCII 문자를 유니코드 그대로 출력

    indent=2                # JSON을 2칸 들여쓰기로 예쁘게 포맷팅

)


print(json_string)

print(f"데이터 타입: {type(json_string)}")


import json


json_string = json.dumps(patient_info, ensure_ascii=False, indent=2)


json_string



# 혈압 분류 판정

systolic = device_data['vital_signs']['systolic_bp']

if systolic >= 140:

    bp_category = "고혈압"

elif systolic >= 120:

    bp_category = "고혈압 전단계"

else:

    bp_category = "정상"


print(f"혈압 분류: {bp_category}")


type(medical_device_data)

data =json.loads(medical_device_data)

type(data)


# 딕셔너리에서 데이터를 뽑아오는 1번째 방법

data["vital_signs"]["heart_rate"]


# 딕셔너리에서 데이터를 뽑아오는 2번째 방법

data.get("vital_signs").get("heart_rate")


 CSV 파일 처리

CSV (Comma-Separated Values)는 엑셀처럼 표 형태의 데이터를 쉼표로 구분하여 저장하는 간단한 텍스트 파일 형식입니다. 

의료진이 환자 데이터 분석, 연구 결과 정리, 보고서 작성 시 가장 많이 사용하는 형식입니다.


tReader와 DictWriter

딕셔너리 형태로 데이터를 다루면 열 이름으로 직접 접근할 수 있어 더 편리합니다.


댓글

이 블로그의 인기 게시물

베이스 캠프에서 (1)

베이스 캠프에서 (2)

Database 분석 (4)