728x90
판다스는 주식, 환율 등 금융 데이터를 다루기 위해 개발되었기에
시계열 데이터를 다루는 여러 가지 유용한 기능을 제공한다.
데이터는 주가 샘플 데이터를 사용하였다.
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
'Language > 파이썬' 카테고리의 다른 글
2021 파이썬 AI 온라인 실무 기본 및 응용 교육과정을 무료로 수강 ! | 엘리스 코딩 (0) | 2021.09.19 |
---|---|
파이썬 판다스 - 크롤링으로 얻은 csv 파일들을 concat으로 모두 합치기 (2) | 2021.09.10 |
파이썬 판다스 - agg(func, axis, *args, **kwargs) (0) | 2021.07.29 |
파이썬 판다스 sidetable : df.stb.freq(..) - Create Simple Summary Tables in Pandas, 합계와 빈도수 (0) | 2021.07.27 |
파이썬 '판다스 데이터 분석' - 데이터프레임에 함수 적용 .apply() (0) | 2021.07.25 |
댓글