본문 바로가기
Language/파이썬

파이썬 '판다스 데이터 분석' - 시계열 데이터

by javapp 자바앱 2021. 7. 31.
728x90

 

 

판다스는 주식, 환율 등 금융 데이터를 다루기 위해 개발되었기에

시계열 데이터를 다루는 여러 가지 유용한 기능을 제공한다.

 

데이터는 주가 샘플 데이터를 사용하였다.

stock-data.csv
0.00MB

 

import pandas as pd

df = pd.read_csv('data/stock-data.csv')
df.head()
	Date	Close	Start	High	Low	Volume
0	2018-07-02	10100	10850	10900	10000	137977
1	2018-06-29	10700	10550	10900	9990	170253
2	2018-06-28	10400	10900	10950	10150	155769
3	2018-06-27	10900	10800	11050	10500	133548
4	2018-06-26	10800	10900	11000	10700	63039

 

df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 20 entries, 0 to 19
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   Date    20 non-null     object
 1   Close   20 non-null     int64 
 2   Start   20 non-null     int64 
 3   High    20 non-null     int64 
 4   Low     20 non-null     int64 
 5   Volume  20 non-null     int64 
dtypes: int64(5), object(1)
memory usage: 1.1+ KB

Timestamp 변환

문자열(object) 데이터를 datetime64 자료형으로 변환한다.

df['new_date'] = pd.to_datetime(df['Date'])
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 20 entries, 0 to 19
Data columns (total 7 columns):
 #   Column    Non-Null Count  Dtype         
---  ------    --------------  -----         
 0   Date      20 non-null     object        
 1   Close     20 non-null     int64         
 2   Start     20 non-null     int64         
 3   High      20 non-null     int64         
 4   Low       20 non-null     int64         
 5   Volume    20 non-null     int64         
 6   new_date  20 non-null     datetime64[ns]
dtypes: datetime64[ns](1), int64(5), object(1)
memory usage: 1.2+ KB

 

new_date 칼럼 하나의 원소는 타임스탬프 타입이다.

type(df['new_date'][0])
<결과>
pandas._libs.tslibs.timestamps.Timestamp

 

 

연월로 표현

df['연월'] = df['new_date'].dt.strftime('%Y%m')
df.head()
	Date		Close	Start	High	Low	Volume	new_date	연월
0	2018-07-02	10100	10850	10900	10000	137977	2018-07-02	201807
1	2018-06-29	10700	10550	10900	9990	170253	2018-06-29	201806
2	2018-06-28	10400	10900	10950	10150	155769	2018-06-28	201806
3	2018-06-27	10900	10800	11050	10500	133548	2018-06-27	201806
4	2018-06-26	10800	10900	11000	10700	63039	2018-06-26	201806

 

그룹화

df.groupby(by='연월').mean()
	Close		Start		High	Low		Volume
연월					
201806	11744.736842	11802.631579	12073.684211	11446.842105	159068.736842
201807	10100.000000	10850.000000	10900.000000	10000.000000	137977.000000

 

 

날짜 데이터 분리
dt 속성을 이용하여 new_date 열의 연 월 일 정보를 년, 월, 일 컬럼으로 구분

df['Year'] = df['new_date'].dt.year
df['Month'] = df['new_date'].dt.month
df['Day'] = df['new_date'].dt.day
print(df.head())
   Close  Start    new_date      연월  Year  Month  Day
0  10100  10850   2018-07-02  201807  2018      7    2
1  10700  10550   2018-06-29  201806  2018      6   29
2  10400  10900   2018-06-28  201806  2018      6   28
3  10900  10800   2018-06-27  201806  2018      6   27
4  10800  10900   2018-06-26  201806  2018      6   26

 

타임스탬프를 Period로 변환하여 연 월 일 표기 변경하기

# to_period 메소드를 적용하여 년도, 연-월 변경
df['Date_yr'] = df['new_date'].dt.to_period(freq='A')
df['Date_m'] = df['new_date'].dt.to_period(freq='M')
print(df.head())
  Date_yr   Date_m  
0    2018  2018-07  
1    2018  2018-06  
2    2018  2018-06  
3    2018  2018-06  
4    2018  2018-06

인덱스 지정

Timestamp로 구성된 열을 행으로 지정하면 DatetimeIndex로 변환

Period로 구성된 열을 행으로 인덱스 지정하면 PeriodIndex로 변환

 

DatetimeIndex(['2018-07-02', '2018-06-29', '2018-06-28', '2018-06-27',
               '2018-06-26', '2018-06-25', '2018-06-22', '2018-06-21',
               '2018-06-20', '2018-06-19', '2018-06-18', '2018-06-15',
               '2018-06-14', '2018-06-12', '2018-06-11', '2018-06-08',
               '2018-06-07', '2018-06-05', '2018-06-04', '2018-06-01'],
              dtype='datetime64[ns]', name='new_date', freq=None)
PeriodIndex(['2018-07', '2018-06', '2018-06', '2018-06', '2018-06', '2018-06',
             '2018-06', '2018-06', '2018-06', '2018-06', '2018-06', '2018-06',
             '2018-06', '2018-06', '2018-06', '2018-06', '2018-06', '2018-06',
             '2018-06', '2018-06'],
            dtype='period[M]', name='Date_m', freq='M')

날짜 인덱스

날짜 인덱스 장점은 슬라이싱 추출, 선택적으로 인덱싱 가능

 

해당 연도에 해당하는 모든 행을 선택할 수 있다.

df['2018'].head()
			
new_date   	Date		Close	Start	High	Low	Volume
2018-07-02	2018-07-02	10100	10850	10900	10000	137977
2018-06-29	2018-06-29	10700	10550	10900	9990	170253
2018-06-28	2018-06-28	10400	10900	10950	10150	155769
2018-06-27	2018-06-27	10900	10800	11050	10500	133548
2018-06-26	2018-06-26	10800	10900	11000	10700	63039

 

df.loc['2018-07']
			Date	Close	Start	High	Low	Volume
new_date						
2018-07-02	2018-07-02	10100	10850	10900	10000	137977

 

df.loc['2018-07', 'Start':'Low']
		Start	High	Low
new_date			
2018-07-02	10850	10900	10000

 

df.loc['2018-07', ['Start','Low']]
		Start	Low
new_date		
2018-07-02	10850	10000

 

df['2018-06-25':'2018-06-20']
		Date		Close	Start	High	Low	Volume
new_date						
2018-06-25	2018-06-25	11150	11400	11450	11000	55519
2018-06-22	2018-06-22	11300	11250	11450	10750	134805
2018-06-21	2018-06-21	11200	11350	11750	11200	133002
2018-06-20	2018-06-20	11550	11200	11600	10900	308596

 


 

기준일을 생성하고 날짜 사이의 시간 간격을 계산할 수 있다.

today = pd.to_datetime('2018-12-25')
df['d-day'] = today - df.index
df.set_index('d-day',inplace=True)
df_180 = df['180 days':'189 days']
print(df_180)
                Date  Close  Start   High    Low  Volume
d-day                                                   
180 days  2018-06-28  10400  10900  10950  10150  155769
181 days  2018-06-27  10900  10800  11050  10500  133548
182 days  2018-06-26  10800  10900  11000  10700   63039
183 days  2018-06-25  11150  11400  11450  11000   55519
186 days  2018-06-22  11300  11250  11450  10750  134805
187 days  2018-06-21  11200  11350  11750  11200  133002
188 days  2018-06-20  11550  11200  11600  10900  308596
189 days  2018-06-19  11300  11850  11950  11300  180656

댓글