[Python.TimeSeries] Date와 DateTime 심화 - Resample, Groupby

2021. 2. 23. 05:00Python과 머신러닝/TimeSeries & DateTime

0. 이전 포스트

 

1. BikeDemand Data 받아오기

In [1]:import pandas as pd 
       import os
In [2]:df = pd.read_csv('bike_demand_train.csv', parse_dates=['datetime']) 
       df
Out[2]:

Out[2]

  • www.kaggle.com/c/bike-sharing-demand/data?select=train.csv에서 데이터를 다운받아서 csv를 읽어오면 다음과 같이 데이터가 열린다.
  • parse_dates=['datetime'] : 'datetime' Series는 날짜/시간 데이터이니 csv를 읽어올 때 애초에 DateTime 형태로 읽어오라는 의미의 명령어이다.

 

2. DataFrame의 index 변형하기

In [3]:df.set_index('datetime', inplace=True) 
       df

Out[3]

  • DateTime을 Index로 설정한다.
  • 이제 데이터 입력이 완료되었으니 본격적인 데이터 분석을 시작해보자.

 

3. Groupby를 사용해서 월별 자전거 사용량 분석하기

In [5]:df['month']=df.index.month 
       df['year']=df.index.year 
       df

Out[5]:

Out[5]

  • df.index.month : dataframe의 index에서 month 값을 추출해온다.
    • df.index를 datetime으로 지정했으니, 이제 index에서 month를 추출하면 기존의 datetime 정보에서 month 정보만 뽑아오는 것과 동일하다.
  • 이렇게 month/year series를 추가하면 우측에 month/year를 확인할 수 있다.
  • 이후 Groupby를 통해 월별 count의 sum을 구하면 다음과 같이 결과가 나온다.
In [6]:df.groupby(['year', 'month'])['count'].sum()
Out[6]:year month 
       2011 1   23552
            2   32844
            3   38735 
            4   50517
            5   79713
            6   89776
            7   92848
            8   83296
            9   79104
            10  79522
            11  70889
            12  61183
       2012 1   56332
            2   66269
            3   94766
            4   116885
            5   120434
            6   130957
            7   121769
            8   130220
            9   133425
            10  127912
            11  105551
            12  98977
       Name: count, dtype: int64

In [7]:df.groupby(['year', 'month'])['count'].sum().reset_index()
Out[7]:

Out[7]

 

 

 

 

 

 

 

 

 

 

 

4. Resample을 사용해서 월별 자전거 사용량 분석하기

In [8]:df['count'].resample('M').sum()
Out[8]:datetime 
       2011-01-31 23552 
       2011-02-28 32844 
       2011-03-31 38735
       2011-04-30 50517 
       2011-05-31 79713
       2011-06-30 89776 
       2011-07-31 92848 
       2011-08-31 83296 
       2011-09-30 79104 
       2011-10-31 79522 
       2011-11-30 70889
       2011-12-31 61183
       2012-01-31 56332
       2012-02-29 66269
       2012-03-31 94766 
       2012-04-30 116885
       2012-05-31 120434
       2012-06-30 130957
       2012-07-31 121769 
       2012-08-31 130220
       2012-09-30 133425 
       2012-10-31 127912 
       2012-11-30 105551 
       2012-12-31 98977 
       Freq: M, Name: count, dtype: int64
  • GroupBy를 하려면 Data 전처리가 필요했지만, resample은 한 줄의 코드로 동일한 결과를 추출할 수 있다.
  • df['count'].resample('M').sum() : df['count']의 값을 가지고 월별 합계를 구하라
In [9]:df['count'].resample('Q').sum() 
       df['count'].resample('M').sum()
       df['count'].resample('W').sum()
       df['count'].resample('D').sum()

 

5. Resample 한 결과 Filtering 하기

In [10]:time = pd.date_range('1/1/2000', periods=5, freq='T')
        time
Out[10]:DatetimeIndex(['2000-01-01 00:00:00', 
                       '2000-01-01 00:01:00', 
                       '2000-01-01 00:02:00',
                       '2000-01-01 00:03:00', 
                       '2000-01-01 00:04:00'],
                       dtype='datetime64[ns]', freq='T')

In [11]:period = pd.date_range(start='2011-01-01', end='2011-05-31', freq='M') 
        period
Out[11]:DatetimeIndex(['2011-01-31', 
                       '2011-02-28',
                       '2011-03-31',
                       '2011-04-30', 
                       '2011-05-31'], 
                       dtype='datetime64[ns]', freq='M')
  • Filtering은 엑셀의 필터와 동일하게 '원하는 값만 뽑아서 보는 기능'이다.
  • 그러기 위해서는 원하는 값의 기준을 정해야 하는데, datetime 관련 filter이다 보니 pd.date_range를 사용해서 원하는 날짜/시간을 지정할 수 있다.
  • time = pd.date_range('1/1/2000', periods=5, freq='T')
    • 2000/1/1부터 1시간 단위로 5개의 시간을 만들어서 time이란 변수에 넣기
  • period = pd.date_range(start='2011-01-01', end='2011-05-31', freq='M') 
    • 2011/1/1부터 월 단위로 2011-05-31까지 만들어서 period이란 변수에 넣기
  • 이렇게 2011-01부터 2011-05월까지 5개의 데이터만 보고 싶다면, period를 가지고 filtering 해서 볼 수 있다.
In [12]:df['count'].resample('M').sum()[period]
Out[12]:2011-01-31 23552 
        2011-02-28 32844
        2011-03-31 38735 
        2011-04-30 50517
        2011-05-31 79713 
        Freq: M, Name: count, dtype: int64

 

6. 요일별 자전거 사용량 분석

In [13]:df['day of week']=df.index.dayofweek 
        df
Out[13]:

Out[13]

In [14]:df.groupby('day of week')['count'].mean().plot()
Out[14]:

Out[14]

  • 이와 같이 요일별로 자전거 사용 횟수를 그래프로 표현할 수 있다.
  • 목금토에 자전거를 가장 많이 빌리고, 일요일에는 현저히 적은 것을 볼 수 있다.

 

7. 관련 포스트

 

반응형