[2week] 데이터 처리(1)

atdawn·2024년 9월 9일
0

AIVLE

목록 보기
4/25

데이터 전처리에는 두 단계가 있음
1. 데이터 구조 만들기
2. 모델링을 위한 전처리


1. 데이터 프레임 변경

열 이름 변경

  • columns 속성 변경 : 모든 열 이름 변경

tip.columns = ['total_bill', 'tip', 'sex', 'smoker', 'day', 'time', 'size']
  • .rename() : 지정한 열 이름 변경

    • inplace = True : 진짜 변경
    • inplace =False : 조회
tip.rename(columns={'total_bill_amount': 'total_bill',
 'male_female': 'sex',
 'smoke_yes_no': 'smoker',
 'week_name': 'day',
 'dinner_lunch': 'time'}, inplace=True)

열 추가

  • 없는 열을 변경하면 그 열이 추가 됨 (맨 뒤)

# final_amt 열 추가
tip['final_amt'] = tip['total_bill'] + tip['tip']

열 삭제

  • .copy() : 데이터 복사 (삭제할때 권장)

  • .drop() : 열 삭제

    • axis=0 : 행 삭제 (기본 값)
    • axis=1 : 열 삭제
    • inplace = False : 삭제한 것처럼 조회 , True : 실제 삭제
 # 열 하나 삭제
tip.drop('final_amt', axis=1, inplace=True)

# 열 두 개 삭제
tip.drop(['div_tb', 'day'], axis=1, inplace=True)

값 변경1

  • 열 전체 값 변경

# tip[‘tip’] 의 모든 값을 0으로 바꾸기
tip[‘tip’] = 0
  • 조건에 의한 값 변경 1

 # tip[‘tip’] 의 값이 10보다 작을 경우, 0으로 바꾸기
tip.loc[tip[‘tip’] < 10, ‘tip’] = 0
  • 조건에 의한 값 변경 2

 # tip[‘tip’] 의 값이 10보다 작을 경우 0, 아니면 1로 바꾸기
tip[‘tip’] = np.where(tip[‘tip’] < 10, 0, 1)

값 변경 2

  • .map({'원래값' : '변경값',...})

 # Male -> 1, Female -> 0
 tip['sex'] = tip['sex'].map({'Male': 1, 'Female': 0})
  • pd.cut(숫자형변수,분할방식,범주값) : 숫자형 -> 범주형 변수로 변환

    • ex) 나이 -> 나이대,고객 구매액 -> 고객 등급
    • 내가 원하는 구간으로 자르기 : bins = [ ]
    • 분할된 범주에 이름 붙이기 : labels = [ ]

#  3 등분으로 분할후 a,b,c로 이름 붙이기기
age_group = pd.cut(data2['Age'], 3, labels = ['a','b','c'])
age_group.value_counts()
    
#  3 등분으로 분할
age_group = pd.cut(data2['Age'], 3)
age_group.value_counts()


# 나이를 다음 구간으로 분할합니다.
# 'young'  : =< 40 
# 'junior' : 40 <   =< 50
# 'senior' : 50 < 

age_group = pd.cut(data2['Age'], bins =[0, 40, 50, 100] , labels = ['young','junior','senior'])

+) 참고

  • 범주 이름 X

    소괄호 : = 포함 X
    대괄호 : 포함 O
    즉, 32<Age<=46

  • 무한대 표현

    • np.inf
    • -np.inf

2. 데이터 프레임 결합

pd.concat() : 붙여라 ~!

pd.concat(objs , axis , join)

매핑기준: 인덱스(행), 칼럼이름(열)

  • 방향 axis = 0

    • 세로(행) 로 합치기 ( 위 아래로 붙여라 )
    • 칼럼 이름 기준
  • 방법 join

    • outer : 모든 행과 열 합치기 (기본 값)

    • inner : 같은 행과 열만 합치기


  • 방향 axis = 1

    • 가로(열)로 합치기 (옆으로 붙여라)
    • 행 인덱스 기준
  • 방법 join

    • outer : 모든 행과 열 합치기 (기본 값)
    • inner : 같은 행과 열만 합치기

pd.merge() : join

pd.merge( leftDf , rightDf , how , on )

매핑기준 : 특정 칼럼(key)의 값 기준으로 결합

  • 데이터 베이스 테이블 조인과 같음
  • 옆으로만 병합
  • 어떤 칼럼 기준 ? on : 생략 시 자동으로 key를 잡아줌
  • 방법 how
    • 🌟 inner : 같은 값만 (기본 값)
    • outer : 모두
    • 🌟 left : 왼쪽 df는 모두 , 오른쪽 df는 같은 값만
    • right : 오른쪽 df는 모두 , 왼쪽 df는 같은 값만

# 특정 컬럼 지정 , inner 조인
pd.merge(df1, df2, how = 'inner', on = 'A')

# 컬럼 기준 자동, left 조인 
pd.merge(df1, df2, how = 'left')

pd.pivot() : 집계된(group by) 데이터를 재구성

dataframe.pivot( index= , columns= , values= )

  • 행과 열의 값을 교차
  • group by 필수
# 1) 매장1의 일별 카테고리별 판매량을 집계

temp = pd.merge(sales1, products)
temp2 = temp.groupby(['Date', 'Category'], as_index = False)['Qty'].sum()

# 2) pivot
temp3 = temp2.pivot(index='Category',columns= 'Date' ,values='Qty')
temp3

+) 참고 sns.heatmap() : 시각화

# sns.heatmap으로 시각화 할 수도 있습니다!

plt.figure(figsize = (20, 6))
sns.heatmap(temp3)
plt.show()


3. 시계열 데이터 처리

  • 행과 행에 시간의 순서(흐름)가 있고
  • 행과 행의 시간 간격이 동일한 데이터 (등간격)
  • Time Series Data ⊂ Sequential Data
  • 시간순으로 정렬이 되어있음.

Data 모델링 분석 : Data의 반복되는 패턴을 찾는 것.

날짜 요소 뽑기

  • 날짜 타입의 변수로부터 날짜의 요소를 뽑아낼 수 있다.

날짜 타입으로 변환

  • pd.to_datetime(날짜데이터, format = '입력되는 날짜 형식') : str 타입의 데이터 날짜 타입으로 변환

data['Date'] = pd.to_datetime(data['Date'])

  • .dt.날짜요소

  • 요일 weekday 0~6 : 월~일

날짜 타입 명시

  • pd.to_datetime(date, format = '%d/%m/%Y') # format = '%d/%m/%Y' 입력되는 날짜가 이런 형태야~~ 라고 알려주는 옵션


시간에 따른 흐름 추출하기 : Time Lag

.shift() : 이전 값 옆에 붙이기

  • 시간에 따른 흐름 추출하기 : Time Lag
# 전날 매출액 열을 추가합시다.
temp['Amt_lag'] = temp['Amt'].shift() #default = 1

# 전전날 매출액 열을 추가.
temp['Amt_lag2'] = temp['Amt'].shift(2) # 2행 shift

# 다음날 매출액 열을 추가합시다.
temp['Amt_lag_1'] = temp['Amt'].shift(-1)

시간에 따른 흐름 추출하기 : Moving Average

.rolling().mean() : 이동 편균 구하기

  • 시간의 흐름에 따라 일정 기간 동안 평균을 이동하면서 구하기 (앞의 row)
  • rolling(n)
    • n 기본 값 : 1
    • min_periods : 최소 데이터수
# 7일 이동평균 매출액을 구해 봅시다.
temp['Amt_MA7_1'] = temp['Amt'].rolling(7).mean()
temp['Amt_MA7_2'] = temp['Amt'].rolling(7, min_periods = 1).mean()
temp.head(10)

시간에 따른 흐름 추출하기 : 차분

.diff() : 이전 값과 차이 구하기

  • 특정 시점 데이터, 이전 시점 데이터와의 차이 구하기
# 7일 이동평균 매출액을 구해 봅시다.
temp['Amt_D1'] = temp['Amt'].diff()
temp['Amt_D2'] = temp['Amt'].diff(2)  #2칸 전 뺴기
temp.head(10)

profile
복습 복습 복습

0개의 댓글