데이터 분석에서 흔히 시계열 데이터라는 말을 들을 수 있다.

    시계열 데이터란 어떤 데이터를 의미할까?

    행과 행 사이에 시간의 순서가 있고, 행과 행 사이 시간간격이 동일한 데이터를 "시계열 데이터"라 한다.

     

    데이터 처리

    시계열 데이터 처리를 연습해보자.

     

    환경 준비

    import pandas as pd
    import numpy as np

    판다스와 넘파이를 불러와준다.

     

    sales = pd.read_csv("https://raw.githubusercontent.com/DA4BAM/dataset/master/ts_sales_simple.csv")
    products = pd.read_csv("https://raw.githubusercontent.com/DA4BAM/dataset/master/ts_product_master.csv")

     

    실습에서 사용할 데이터프레임을 불러와준다.

     

    sales.info()	/ sales.head()

    info / head 결과

     

    products.info()	/ products.head()

    info / head 결과

     

     

    실습 1

    Product_ID가 15인 것만 뽑아보자. 그러면 뭘 사용해야할까? -> loc

    products.loc[products[Product_ID] == 20]

    결과

    집계(groupby)도 한번 해볼까? Store_ID가 1인 것들 중에서, Product_ID 별로 Qty의 합을 알고싶어!

    sales.loc[sales['Store_ID']==1].groupby('Product_ID', as_index = False)['Qty'].sum()

    결과. as_index = True인 경우에는 왼쪽 인덱스가 안생김

     

    이번엔 병합해서 다뤄보자.

    df = pd.merge(sales, products)
    
    df['매출'] = df['Qty'] * df['Price']	# '매출' 이라는 열 생성 및 채우기

     

    df를 Date, Category별로 집계하고, 매출의 합을 구해보자.

    data1 = df.groupby(['Date', 'Category'], as_index = False)['매출'].sum()

    pivot을 사용해서 구조를 변형시켜보자.

    newdata = data1.pivot('Date', 'Category', '매출').reset_index()	# Date: 인덱스, Category: 열, '매출': rkqt
    newdata.head()

     

     

     

    실습 2

     

    날짜 요소를 추출하는 실습을 해보자. newdata에는 Date가 2013-01-01의 형식으로 표기되어 있다.

    newdata['Date'] = pd.to_datetime(newdata['Date'])
    newdata.info()

    datetime64로 Dtype이 바뀌었다

    pd.to_datetime(date, format = '%d-%m-%Y')	# format으로 날짜 데이터 형식을 알려주는 것

    연, 월, 일, 요일, 요일 이름을 추출해보자

    date = newdata['Date']
    
    # 연
    date.dt.year
    # 월
    date.dt.month
    # 일
    date.dt.day
    # 요일
    date.dt.weekday
    # 요일 이름
    date.dt.day_name()

     

     

     

    실습 3 - shift

     

    시계열 데이터는 시간이 흐름에 따라 정보가 바뀌는데, 이에 따라 정보를 이동시킬 필요가 있을 때가 있다.

    시계열 데이터에서 시간의 흐름 전후로 정보를 이동시킬 때 shift를 사용한다.
    temp = data.loc[:, ['Date', 'Amt']]
    
    temp.head()

     

     

    # 전날 매출액 열을 추가
    temp['yesterday'] = temp['Amt'].shift()	# shift default: 1
    
    # 다음날
    temp['tomorrow'] = temp['Amt'].shift(-1)
    
    temp.head()

     

     

    실습 4 - rolling

     

    시간의 흐름에 따라 이동하면서 일정 기간 동안의 평균을 구하기 -> rolling + 집계함수

    # 4일 이동평균 매출액을 구해보자
    
    temp['Amt_7_1'] = temp['Amt'].rolling(4).mean()	# 4일의 평균을 내는 거니까 ~3일까지는 평균값을 낼 수 없으므로, NaN이 뜰거다.
    
    temp['Amt_7_2'] = temp['Amt'].rolling(4, min_periods = 1).mean()
    
    temp.head()

     

    min_periods = n 은 최소 기간을 n으로, 데이터가 n개라도 있으면 ~ 을 의미

     

    실습 5 - diff

     

    특정 시점 데이터와 이전시점 데이터와의 차이를 .diff()를 통해 구할 수 있다.

     df.diff(periods=1, axis=0)

    periods는 비교 기간(간격), axis = 0은 index, axis=1은 columns 의미

    temp['diff1'] = temp['Amt'].diff()
    temp['diff2'] = temp['Amt'].diff(2)
    
    temp.head()

     

     diff(2)의 경우 2칸씩 건너뛰어서 (1-3, 2-4) 차이를 보기 때문에 0, 1 인덱스가 NaN이 나오게 된다.

     

     
     

     

    Posted by 저본