[머신러닝을 위한 파이썬] Case Study - Air Passengers

2024. 12. 26. 03:46MOOC

 pandas 를 사용하여 csv 형태의 time series 데이터를 처리하는 방법에 대해 직접 코드를 실행하며 
설명하는 Case Study 를 진행

1. AirPassengers 예시 (시계열 데이터)

1.1 데이터 불러오기 및 확인

"import pandas as pd
df_time_series = pd.read_csv('./data/AirPassengers.csv')
df_time_series.head()
"

CSV 파일을 불러오고, head()를 통해 상단 몇 줄을 확인


1.2 새로운 열 추가: step

"df_time_series['step'] = range(len(df_time_series))
df_time_series.head()
"

range(len(df_time_series))로 0부터 시작하는 정수 시퀀스를 생성하여 step 열로 추가함


1.3 누적 계산(cumsum, cummax, cummin)

"df_time_series['cum_sum'] = df_time_series['#Passengers'].cumsum()
df_time_series['cum_max'] = df_time_series['#Passengers'].cummax()
df_time_series['cum_min'] = df_time_series['#Passengers'].cummin()
df_time_series.head()
"

누적합과 누적 최대/최소값을 계산하여 해당 열을 추가


1.4 연도, 월 분리

"import numpy as np

temp_date = df_time_series['Month'].map(lambda x: x.split('-'))
temp_date = np.array(temp_date.values.tolist())
df_time_series['year'] = temp_date[:, 0]
df_time_series['month'] = temp_date[:, 1]
df_time_series.head()
"

Month 열의 문자열을 split('-')하여 year와 month 열을 새로 생성


1.5 변화량(diff)과 퍼센트 변화율(pct_change)

"df_time_series['diff'] = df_time_series['#Passengers'].diff().fillna(0)
df_time_series['pct'] = df_time_series['#Passengers'].pct_change().map(lambda x: '%.2f' % (x * 100))
df_time_series.head()
"

 

  • diff(): 현재 행 값과 이전 행 값의 차이를 계산
  • pct_change(): 퍼센트 변화율을 계산한 뒤 포맷팅하여 문자열 형태로 저장

2. 특허 데이터 예시 (sea_managing_raw.csv)

2.1 데이터 불러오기

"import pandas as pd

patent = pd.read_csv('./data/sea_managing_raw.csv', encoding='cp949')
patent.head()
"

CSV 파일(sea_managing_raw.csv)을 CP949 인코딩으로 불러오고, 상단 행을 확인


2.2 필요한 열만 선택

"df_patent = patent[['출원번호', 'Original US Class All[US]']]
df_patent.head()
"

특허 데이터에서 출원번호와 Original US Class All[US] 열만 추출


2.3 출원번호와 클래스 연결 (edge_list 생성)

"edge_list = []
for data in zip(df_patent['출원번호'].tolist(), df_patent['Original US Class All[US]'].map(lambda x: x.split('|')).tolist()):
for value in data[1]:
edge_list.append([data[0], value.strip()])

df_edge_list = pd.DataFrame(edge_list)
df_edge_list['rating'] = 1
"

 

  • zip()을 사용해 (출원번호, 클래스 문자열 리스트)를 묶어 순회
  • '|‘로 구분된 클래스를 개별로 분리해 edge_list에 추가
  • 최종적으로 edge_list를 DataFrame으로 만들고, rating=1을 부여

2.4 특허번호 vs. 클래스의 관계 행렬 생성

"df_edge_matrix = df_edge_list.groupby([0, 1])['rating'].sum().unstack().fillna(0)
df_edge_matrix.head()
"

 

  • groupby([0, 1])['rating'].sum()으로 (출원번호, 클래스)의 조합마다 합계를 구함
  • unstack()을 통해 행(출원번호), 열(클래스) 형태의 관계 행렬로 변환 후 fillna(0) 처리