-
Chapter 12-2 사례별 시계열 데이터 계산하기_1Do it! 판다스 입문 2022. 6. 26. 18:17
에볼라 최초 발병일 계산하기
1. ebola 데이터프레임의 마지막 행과 열을 5개씩만 살펴보겠습니다. ebola 데이터프레임은 데이터가 시간 역순으로 정렬되어 있습니다. 즉, 시간 순으로 데이터를 살펴보려면 데이터프레임의 마지막부터 살펴봐야 합니다.
print(ebola.iloc[-5:, :5])
Date Day Cases_Guinea Cases_Liberia Cases_SierraLeone
117 3/27/2014 5 103.0 8.0 6.0
118 3/26/2014 4 86.0 NaN NaN
119 3/25/2014 3 86.0 NaN NaN
120 3/24/2014 2 86.0 NaN NaN
121 3/22/2014 0 49.0 NaN NaN2. 121행에서 볼 수 있듯이 에볼라가 발생하기 시작한 날은 2014년 03월 22일입니다. 다음은 min 메서드를 사용하여 에볼라의 최초 발병일을 찾은 것입니다.
print(ebola['date_dt'].min( ))
print(type(ebola['date_dt'].min( )))
2014-03-22 00:00:00
<class 'pandas._libs.tslibs.timestamps.Timestamp'>3. 에볼라의 최초 발병일을 알아냈으니 Date 열에서 에볼라의 최초 발병일을 빼면 에볼라의 진행 정도를 알 수 있습니다.
ebola['outbreak_d'] = ebola['date_dt'] - ebola['date_dt'].min( )
print(ebola[['Date', 'Day', 'outbreak_d']].head( ))
Date Day outbreak_D
0 1/5/2015 289 289 days
1 1/4/2015 288 288 days
2 1/3/2015 287 287 days
3 1/2/2015 286 286 days
4 12/31/2014 284 284 days파산한 은행의 개수 계산하기
이번에는 파산한 은행 데이터를 불러와 분기별로 파산한 은행이 얼마나 되는지 계산해 보겠습니다. 그리고 이번에는 그래프로도 시각화해 보겠습니다.
1. 다음은 파산한 은행 데이터 집합을 불러온 것입니다. banks 데이터프레임의 앞부분을 살펴보면 Closing Date, Updated Date 열의 데이터 자료형이 시계열 데이터라는 것을 알 수 있습니다.
banks = pd.read_csv('../data/banklist.csv')
print(banks.head( ))
Bank Name City ST CERT \
0 Washington Federal Bank for Savings Chicago IL 30570
1 The Farmers and Merchants State Bank of Argonia Argonia KS 17719
2 Fayette County Bank Saint Elmo IL 1802
3 Guaranty Bank, (d/b/a BestBank in Georgia & Mi. . . Milwaukee WI 30003
4 First NBC Bank New Orleans LA 58302
Acquiring Institution Closing Date Updated Date
0 Royal Savings Bank 15-Dec-17 20-Dec-17
1 Conway Bank 13-Oct-17 20-Oct-17
2 United Fidelity Bank fsb 26-May-17 26-Jul-17
3 First-Citizens Bank & Trust Company 5-May-17 26-Jul-17
4 Whitney Bank 28-Apr-17 5-Dec-172. Closing Date, Updated Date 열의 데이터 자료형은 문자열입니다. 다음은 read_csv 메서드의 parse_dates 속성을 이용하여 문자열로 저장된 두 열을 datetime 오브젝트로 변환하여 불러온 것입니다.
banks_no_dates = pd.read_csv('../data/banklist.csv')
print(banks_no_dates.info( ))
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 555 entries, 0 to 554
Data columns (total 7 columns):
Bank Name 555 non-null object
...
Closing Date 555 non-null object
Updated Date 555 non-null object
dtypes: int64(1), object(6)
memory usage: 30.4+ KB
None
banks = pd.read_csv('../data/banklist.csv', parse_dates=[5, 6])
print(banks.info( ))
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 555 entries, 0 to 554
Data columns (total 7 columns):
Bank Name 555 non-null object
...
Closing Date 555 non-null datetime64[ns]
Updated Date 555 non-null datetime64[ns]
dtypes: datetime64[ns](2), int64(1), object(4)
memory usage: 30.4+ KB
None3. dt 접근자와 quarter 속성을 이용하면 은행이 파산한 분기를 알 수 있습니다. 다음은 dt 접근자와 year, quarter 속성을 이용하여 은행이 파산한 연도, 분기를 새로운 열로 추가한 것입니다.
banks['closing_quarter'], banks['closing_year'] = (banks['Closing Date'].dt.quarter, banks['Closing Date'].dt.year)
print(banks.head( ))
Bank Name City ST CERT \
0 Washington Federal Bank for Savings Chicago IL 30570
1 The Farmers and Merchants State Bank of Argonia Argonia KS 17719
2 Fayette County Bank Saint Elmo IL 1802
3 Guaranty Bank, (d/b/a BestBank in Georgia & Mi. . . Milwaukee WI 30003
4 First NBC Bank New Orleans LA 58302
Acquiring Institution Closing Date Updated Date
0 Royal Savings Bank 2017-12-15 2017-12-20
1 Conway Bank 2017-10-13 2017-10-20
2 United Fidelity Bank fsb 2017-05-26 2017-07-26
3 First-Citizens Bank & Trust Company 2017-05-05 2017-07-26
4 Whitney Bank 2017-04-28 2017-12-05
closing_quarter closing_year
0 4 2017
1 4 2017
2 2 2017
3 2 2017
4 2 20174. 이제 연도별로 파산한 은행이 얼마나 되는지 알아볼까요? groupby 메서드를 사용하면 연도별로 파산한 은행의 개수를 구할 수 있습니다.
closing_year = banks.groupby(['closing_year']).size( )
print(closing_year)
closing_year
2000 2
2001 4
2002 11
2003 3
...
2014 18
2015 8
2016 5
2017 8
dtype: int645. 각 연도별, 분기별로 파산한 은행의 개수도 알아보겠습니다. 다음은 banks 데이터프레임을 연도별로 그룹화한 다음 다시 분기별로 그룹화하여 출력한 것입니다.
closing_year_q = banks.groupby(['closing_year', 'closing_quarter']).size( )
print(closing_year_q)
closing_year closing_quarter
2000 4 2
2001 1 1
2 1
3 2
2002 1 6
2 2
3 1
4 2
2003 1 1
2 1
4 1
...
2017 1 3
2 3
4 2
dtype: int646. 다음은 과정 5에서 얻은 값으로 그래프를 그린 것입니다.
import matplotlib.pyplot as plt
fig, ax = plt.subplots( )
ax = closing_year.plot( )
plt.show( )
fig, ax = plt.subplots( )
ax = closing_year_q.plot( )
plt.show( )
테슬라 주식 데이터로 시간 계산하기
이번에는 pandas-datareader 라이브러리를 이용하여 주식 데이터를 불러오겠습니다. 이 라이브러리는 지금까지 설치한 적이 없는 라이브러리입니다. 다음을 아나콘다 프롬프트에 입력하여 pandas-datareader 라이브러리를 설치하세요.
pip install pandas-datareader 1. 다음은 get_data_quanal 메서드에 TSLA라는 문자열을 전달하여 테슬라의 주식 데이터를 내려받은 다음 to_csv 메서드를 사용하여 data 폴더 안에 'tesla_stock_quandl.csv'라는 이름으로 저장한 것입니다.
pd.core.common.is_list_like = pd.api.types.is_list_like
import pandas_datareader as pdr
# tesla에는 데이터프레임이 저장됩니다.
tesla = pdr.get_data_quandl('TSLA', api_key = '받은 key')
(https://www/quandl.com에 가입하여 접속 api_key를 생성하여 받은 key에 입력하세요.)
# tesla에 저장된 데이터프레임을 파일로 저장합니다.
tesla.to_csv('../data/tesla_stock_quandl.csv')2. tesla 데이터프레임의 Date 열은 문자열로 저장되어 있습니다. 즉, datetime 오브젝트로 자료형을 변환해야 시간 계산을 할 수 있습니다.
print(tesla.head( ))
Open High Low Close Volume ExDividend \
Date
2018-03-27 304.00 304.27 277.18 279.18 13696168.0 0.0
2018-03-26 307.34 307.59 291.36 304.18 8324639.0 0.0
2018-03-23 311.25 311.61 300.45 301.54 6600538.0 0.0
2018-03-22 313.89 318.82 308.18 309.10 4914307.0 0.0
2018-03-21 310.25 322.44 310.19 316.53 5927881.0 0.0
SplitRatio AdjOpen AdjHigh AdjLow AdjClose AdjVolume
Date
2018-03-27 1.0 304.00 304.27 277.18 279.18 13696168.0
2018-03-26 1.0 307.34 307.59 291.36 304.18 8324639.0
2018-03-23 1.0 311.25 311.61 300.45 301.54 6600538.0
2018-03-22 1.0 313.89 318.82 308.18 309.10 4914307.0
2018-03-21 1.0 310.25 322.44 310.19 316.53 5927881.03. Date 열을 Datetime 형으로 변환하려면 read_csv 메서드로 데이터 집합(tesla_stock_quandl.csv)을 불러올 때 parse_dates 인자에 Date 열을 전달하면 됩니다.
tesla = pd.read_csv('../data/tesla_stock_quandl.csv', parse_dates=[0])
print(tesla.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1949 entries, 0 to 1948
Data columns (total 13 columns):
Date 1949 non-null datetime64[ns]
...
AdjVolume 1949 non-null float64
dtypes: datetime64[ns](1), float64(12)
memory usage: 198.0 KB
None4. Date 열의 자료형인 datetime 오브젝트로 변환되었습니다. 이제 dt 접근자를 사용할 수 있습니다. 다음은 불린 추출로 2010년 6월이ㅡ 데이터만 추출한 것입니다.
print(tesla.loc[(tesla.Date.dt.year == 2010) & (tesla.Date.dt.month == 6)])
Date Open High Low Close Volume ExDividend \
1947 2010-06-30 25.79 30.4192 23.30 23.83 17187100.0 0.0
1948 2010-06-29 19.00 25.0000 17.54 23.89 18766300.0 0.0
SplitRatio AdjOpen AdjHigh AdjLow AdjClose AdjVolume
1947 1.0 25.79 30.4192 23.30 23.83 17187100.0
1948 1.0 19.00 25.0000 17.54 23.89 18766300.0datetime 오브젝트와 인덱스 - DatetimeIndex
지금까지의 실습은 대부분 데이터프레임의 행 번호를 인덱스로 사용했지만 datetime 오브젝트를 데이터프레임의 인덱스로 설정하면 원하는 시간의 데이터를 바로 추출할 수 있어 편리합니다. 이번에는 datetime 오브젝트를 인덱스로 지정하는 방법에 대해 알아보겠습니다.
datetime 오브젝트를 인덱스로 설정해 데이터 추출하기
1. 계속해서 테슬라 주식 데이터를 사용하여 실습을 진행하겠습니다. 다음은 Date 열을 tesla 데이터프레임의 인덱스로 지정한 것입니다.
tesla.index = tesla['Date']
print(tesla.index)
DatetimeIndex(['2018-03-27', '2018-03-26', '2018-03-23', '2018-03-22',
'2018-03-21', '2018-03-20', '2018-03-19', '2018-03-16',
'2018-03-15', '2018-03-14',
...
'2010-07-13', '2010-07-12', '2010-07-09', '2010-07-08',
'2010-07-07', '2010-07-06', '2010-07-02', '2010-07-01',
'2010-06-30', '2010-06-29'],
dtype='datetime64[ns]', name='Date', length=1949, freq=None)2. datetime 오브젝트를 인덱스로 지정하면 다음과 같은 방법으로 원하는 시간의 데이터를 바로 추출할 수 있습니다. 다음은 2015년의 데이터를 추출한 것입니다.
print(tesla['2015'].iloc[:5, :5])
Date Open High Low Close
Date
2015-12-31 2015-12-31 238.51 243.450 238.3700 240.01
2015-12-30 2015-12-30 236.60 243.634 235.6707 238.09
2015-12-29 2015-12-29 230.06 237.720 229.5470 237.19
2015-12-28 2015-12-28 231.49 231.980 225.5400 228.95
2015-12-24 2015-12-24 230.56 231.880 228.2800 230.573. 다음은 2010년 6월의 데이터를 추출한 것입니다.
print(tesla['2010-06'].iloc[:, :5])
Date Open High Low Close
Date
2010-06-30 2010-06-30 25.79 30.4192 23.30 23.83
2010-06-29 2010-06-29 19.00 25.0000 17.54 23.89시간 간격과 인덱스 - TimedeltaIndex
예를 들어 주식 데이터에서 최초 5일간 수집된 데이터만 살펴보고 싶다면 어떻게 해야 할까요? 이런 경우에는 시간 간격을 인덱스로 지정하여 데이터를 추출하면 됩니다. 이번에는 datetime 오브젝트를 인덱스로 지정하는 것이 아니라 시간 간격을 인덱스로 지정하여 진행하겠습니다.
시간 간격을 인덱스로 지정해 데이터 추출하기
1. Date 열에서 Date 열의 최솟값(2010-06-29)을 빼면 데이터를 수집한 이후에 시간이 얼마나 흘렀는지 알 수 있습니다. 다음은 Date 열에서 Date 열의 최솟값을 뺀 다음 ref_date 열로 추가한 것입니다.
tesla['ref_date'] = tesla['Date'] - tesla['Date'].min()
print(tesla.head())
Date Open High Low Close Volume ExDividend \
ref_date
2828 days 2018-03-27 304.00 304.27 277.18 279.18 13696168.0 0.0
2827 days 2018-03-26 307.34 307.59 291.36 304.18 8324639.0 0.0
2824 days 2018-03-23 311.25 311.61 300.45 301.54 6600538.0 0.0
2823 days 2018-03-22 313.89 318.82 308.18 309.10 4914307.0 0.0
2822 days 2018-03-21 310.25 322.44 310.19 316.53 5927881.0 0.0
...2. 다음과 같이 ref_date 열을 인덱스로 지정했습니다. 이제 시간 간격(ref_date)을 이용하여 데이터를 추출할 수 있습니다.
tesla.index = tesla['ref_date']
print(tesla.iloc[:5, :5])
Date Open High Low Close
ref_date
2828 days 2018-03-27 304.00 304.27 277.18 279.18
2827 days 2018-03-26 307.34 307.59 291.36 304.18
2824 days 2018-03-23 311.25 311.61 300.45 301.54
2823 days 2018-03-22 313.89 318.82 308.18 309.10
2822 days 2018-03-21 310.25 322.44 310.19 316.533. 다음은 데이터를 수집한 이후 최초 5일의 데이터를 추출한 것입니다.
print(tesla['5 days':].iloc[:5, :5])
Date Open High Low Close
ref_date
3 days 2010-07-02 23.00 23.1000 18.71 19.20
2 days 2010-07-01 25.00 25.9200 20.27 21.96
1 days 2010-06-30 25.79 30.4192 23.30 23.83
0 days 2010-06-29 19.00 25.0000 17.54 23.89출처 : "판다스 입문"
'Do it! 판다스 입문' 카테고리의 다른 글
[Pandas] DataFrame 다루기 메모 (0) 2022.11.02 Chapter 12-2 사례별 시계열 데이터 계산하기_2 (0) 2022.06.26 Chapter 12-1 datetime 오브젝트 (0) 2022.06.26 Chapter 11-3~11-4 데이터 필터링, 그룹 오브젝트 (0) 2022.06.25 Chapter 11-1~11-2 데이터 집계, 데이터 변환 (0) 2022.06.25