내일배움캠프_데이터분석_2기/TIL

[TIL] camp_day57_240705

단ee 2024. 7. 6. 01:00

12주차 마지막 날. 프로젝트 기간이 약 1/3 지났고, 프로젝트 기획서 작성을 완료했다.

학습 내용


  1. pandas DataFrame의 행 반복 처리하기

    • 데이터 탐색 중, 특정 지표값 계산에 데이터프레임의 각 행마다 특정 컬럼의 값에 따라 조건부로 수식을 적용해야 일이 생겼다.
    • 투숙 완료한 고객으로 인해 발생한 실제 매출 또는 취소된 예약이지만 환불 불가하여 매출로 집계된 경우에만 매출로 계산하고, 그 외에는 0으로 출력하여 실제 발생된 매출을 새로운 컬럼으로 만들어야 했다. 요약한 조건절은 아래와 같다.
        1. 예약 상태가 '체크 아웃' 일 경우:
            '평균 객실 단가' * '숙박일수'
        2. 취소 여부가 '취소' & 보증금이 '환불 불가' 일 경우:
            '평균 객실 단가' * '숙박일수'
        3. 그 외:
            0
    • 코드 작성이 어려워서 튜터님께 도움을 요청했고, 각 컬럼을 list로 변환한 뒤 for문으로 결과를 출력하는 방법과 함께 iterrows라는 메서드를 알려주셨다. 이 메서드를 공부하면서 처음 작성한 코드와 결과를 비교해보았다.
    1. .iterrows() 메서드 : pandas doc

      • pandas의 데이터 프레임에 대해, 행을 (인덱스, 시리즈) 쌍으로 반복하는 메서드이다
      • index와 data가 필요하고, 각 행에 대해 series로 반환하기 때문에 행 간 데이터 타입은 유지되지 않는다.
      • 만약 행 간 데이터 타입을 유지하고 싶다면 .itertuples()를 사용해야 하고, 이쪽이 더 빠르다고 한다.
      • cf. (컬럼, 시리즈) 쌍을 반복하는 메서드는 .items()
    2. 각 컬럼을 list로 변환한 뒤 for문으로 결과를 출력

       Python
       # 실제 매출 sales 계산하기 위하여, 반복문으로 처리
       # for 반복문에서 사용할 데이터프레임의 각 컬럼을 리스트로 변환
       rs = list(booking['reservation_status'])
       cancel = list(booking['is_canceled'])
       dp = list(booking['deposit_type'])
       adr = list(booking['adr'])
       days = list(booking['staying_nights'])
      
       # 결과를 출력할 빈 리스트 생성
       result = []
      
       # for 반복문
       # 특정 조건을 만족할 경우에만 adr * days 로 매출액을 계산함
       # 조건 외에는 0 출력
       for i in range(0, len(rs)):
           if rs[i] == 'Check-Out':
               sales = adr[i] * days[i]
           elif (cancel[i] == 1) & (dp[i] == 'Non Refund'):
               sales = adr[i] * days[i]
           else:
               sales = 0
           result.append(sales)
      
       print(result)
    3. iterrows 메서드 사용하여 결과를 출력

       Python
       # Iterating using iterrows() : 튜터님이 알려주신 메서드를 방법!
      
       # 결과를 출력할 빈 리스트 생성
       empty_list = []
      
       # for 반복문
       # 특정 조건을 만족할 경우에만 adr * days 로 매출액을 계산함
       # 조건 외에는 0 출력
       for index, row in booking.iterrows():
           if row['reservation_status'] == 'Check-Out':
             a = row['adr'] * row['staying_nights']
           elif (row['is_canceled'] == 1) & (row['deposit_type'] == 'Non Refund'):
             a = row['adr'] * row['staying_nights']
           else:
             a = 0
           empty_list.append(a)
      
       print(empty_list)
    4. 2번과 3번 결과 비교

       Python
       # 두 함수의 결과 비교
       # 소요 시간 : 0.1s vs 3.9s(iterrows가 더 느리다)
      
       s1 = pd.Series(result)
       s2 = pd.Series(empty_list)
       compare = pd.concat([s1, s2], axis= 1, ignore_index=False)
      
       column_names = ['list_forloop','method_iterrows']
       compare.columns = column_names
      
       compare['Sub'] = compare[column_names[0]] - compare[column_names[1]]
      
       compare.describe()

고찰 & 기타


  • SQL로 하면 더 쉬운 쿼리로 원하는 결과를 출력할 수 있을 텐데 하고 여러 번 SQL 염불을 외게 되는 하루였다....
  • 그래도 나중에 한 번 더 복습해서 잘 활용만 한다면 파이썬으로 데이터 분석을 할 때 활용하기 좋은 메서드와 기능이다.
  • pandas 공식 문서를 틈틈이 읽는 습관을 길러야겠다.

'내일배움캠프_데이터분석_2기 > TIL' 카테고리의 다른 글

[TIL] camp_day62_240712  (0) 2024.07.15
[TIL] camp_day61_240711  (0) 2024.07.12
[TIL] camp_day56_240704  (0) 2024.07.05
[TIL] camp_day54_240703  (0) 2024.07.05
[TIL] camp_day52_240701  (0) 2024.07.01