[Python.TimeSeries] Date와 DateTime 심화 - Resample, Groupby
2021. 2. 23. 05:00ㆍPython과 머신러닝/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]:
- 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
- DateTime을 Index로 설정한다.
- 이제 데이터 입력이 완료되었으니 본격적인 데이터 분석을 시작해보자.
3. Groupby를 사용해서 월별 자전거 사용량 분석하기
In [5]:df['month']=df.index.month
df['year']=df.index.year
df
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]:
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]:
In [14]:df.groupby('day of week')['count'].mean().plot()
Out[14]:
- 이와 같이 요일별로 자전거 사용 횟수를 그래프로 표현할 수 있다.
- 목금토에 자전거를 가장 많이 빌리고, 일요일에는 현저히 적은 것을 볼 수 있다.
7. 관련 포스트
'Python과 머신러닝 > TimeSeries & DateTime' 카테고리의 다른 글
[Python.TimeSeries] Date와 DateTime 심화 - Rolling and Shift (0) | 2021.02.24 |
---|---|
[Python.TimeSeries] Date와 DateTime (0) | 2021.02.22 |