날짜 인덱스와 변화량
주요 개념
- 날짜 인덱스 설정과 정렬
- 날짜·기간별 데이터 조회
diff,pct_change: 변화량과 변화 비율
실습 프롬프트
🤖 AI 프롬프트
GOOG.xlsx의 날짜를 기준으로 특정 연도와 기간의 주가를 조회해줘.
직전 거래일 대비 주가의 변화량과 변화율을 구하고, 그래프로 비교해줘.
알파벳 주가 데이터
GOOG.xlsx: 알파벳 주가 데이터Date: 날짜,Price: 주가
df = pd.read_excel('GOOG.xlsx')
df.head()
실행 결과
Date Price Open High Low Vol. Change %
0 2014-03-28 558.46 559.66 564.88 557.14 41.12K 0.0027
1 2014-03-31 555.45 565.34 565.45 555.41 10.80K -0.0054
2 2014-04-01 565.61 557.18 566.89 557.18 7.95K 0.0183
3 2014-04-02 565.45 598.35 603.17 560.65 147.10K -0.0003
4 2014-04-03 568.18 568.29 585.67 562.59 5.10M 0.0048
pd.to_datetime(): 날짜 컬럼을 날짜·시간 자료형으로 변환- 이 실습 파일의
Date는 읽을 때 이미 날짜 자료형이며, 변환 후에도 같은 날짜를 유지
- 이 실습 파일의
df.Date = pd.to_datetime(df.Date)
Date컬럼을 인덱스(행 이름)로 변환inplace=True: 원본 데이터프레임에 반영
df.set_index('Date', inplace=True)
날짜 순서 정렬
- 인덱스를 시간순으로 정렬
df.sort_index(inplace=True)
날짜로 인덱싱
- 2014년 3월 31일 데이터
df.loc['2014-03-31']
실행 결과
Price 555.45
Open 565.34
High 565.45
Low 555.41
Vol. 10.80K
Change % -0.0054
Name: 2014-03-31 00:00:00, dtype: object
- 일정 기간 데이터: 시작일과 종료일을 모두 포함
df.loc['2014-03-31':'2014-04-02']
실행 결과
Price Open High Low Vol. Change %
Date
2014-03-31 555.45 565.34 565.45 555.41 10.80K -0.0054
2014-04-01 565.61 557.18 566.89 557.18 7.95K 0.0183
2014-04-02 565.45 598.35 603.17 560.65 147.10K -0.0003
- 특정 월의 데이터
df.loc['2014-05'] # 2014년 5월
실행 결과
Price Open High Low Vol. Change %
Date
2014-05-01 529.90 525.67 531.47 522.45 1.91M 0.0089
2014-05-02 526.48 532.30 532.54 524.17 1.69M -0.0065
2014-05-05 526.36 523.38 527.45 519.89 1.02M -0.0002
2014-05-06 513.73 523.79 525.37 513.65 1.69M -0.0240
2014-05-07 508.56 514.38 515.27 501.92 3.22M -0.0101
2014-05-08 509.60 507.07 515.81 505.06 2.02M 0.0020
2014-05-09 517.31 509.35 518.48 502.82 2.44M 0.0151
2014-05-12 528.47 522.08 528.74 517.59 1.91M 0.0216
2014-05-13 531.63 529.44 534.60 528.06 1.65M 0.0060
2014-05-14 525.21 531.54 531.54 523.85 1.20M -0.0121
2014-05-15 518.56 524.26 524.43 516.00 1.71M -0.0127
2014-05-16 519.20 519.96 520.37 514.03 1.49M 0.0012
2014-05-19 527.41 518.28 528.33 516.17 1.28M 0.0158
2014-05-20 528.32 528.29 534.76 524.86 1.79M 0.0017
2014-05-21 537.46 531.44 537.71 530.45 1.20M 0.0173
2014-05-22 543.57 539.65 546.10 539.30 1.62M 0.0114
2014-05-23 551.19 545.76 552.12 542.21 1.93M 0.0140
2014-05-27 564.40 554.48 564.45 552.83 2.11M 0.0240
2014-05-28 560.14 563.02 566.29 559.46 1.65M -0.0075
2014-05-29 558.55 561.81 562.46 557.18 1.35M -0.0028
2014-05-30 558.36 559.26 559.81 554.39 1.77M -0.0003
- 특정 연도의 데이터
df.loc['2016'] # 2016년
실행 결과
Price Open High Low Vol. Change %
Date
2016-01-04 741.84 743.00 744.06 731.26 3.27M -0.0225
2016-01-05 742.58 746.45 752.00 738.64 1.95M 0.0010
2016-01-06 743.62 730.00 747.18 728.92 1.95M 0.0014
2016-01-07 726.39 730.31 738.50 719.06 2.96M -0.0232
2016-01-08 714.47 731.45 733.23 713.00 2.45M -0.0164
... ... ... ... ... ... ...
2016-12-23 789.91 790.90 792.74 787.28 623.94K -0.0017
2016-12-27 791.55 790.68 797.86 787.66 789.32K 0.0021
2016-12-28 785.05 793.70 794.23 783.20 1.15M -0.0082
2016-12-29 782.79 783.33 785.93 778.92 744.27K -0.0029
2016-12-30 771.82 782.75 782.78 770.41 1.77M -0.0140
[253 rows x 6 columns]
주가 시각화
- 주가 시각화
df.Price.plot()
실행 결과
<Axes: xlabel='Date'>
<Figure size 640x480 with 1 Axes>

변화량 구하기
이전 관측값과의 차이
diff(): 현재 값에서 이전 관측값을 뺀 차이- 거래가 없는 날짜를 건너뛰므로 이전 관측일은 직전 거래일
df.Price.diff()
실행 결과
Date
2014-03-28 NaN
2014-03-31 -3.01
2014-04-01 10.16
2014-04-02 -0.16
2014-04-03 2.73
...
2021-12-27 18.43
2021-12-28 -32.32
2021-12-29 1.13
2021-12-30 -10.04
2021-12-31 -26.46
Name: Price, Length: 1957, dtype: float64
- 첫 관측값의 변화량은 비교할 이전 값이 없어
NaN - 시각화하려면 끝에
.plot()추가
df.Price.diff().plot()
실행 결과
<Axes: xlabel='Date'>
<Figure size 640x480 with 1 Axes>

이전 관측값과의 차이의 비율
pct_change(): 이전 관측값 대비 변화량의 비율- 반환값은 비율이며 백분율로 표현하려면 100을 곱함
fill_method=None: 결측값을 다른 값으로 채우지 않고 계산
df.Price.pct_change(fill_method=None)
실행 결과
Date
2014-03-28 NaN
2014-03-31 -0.005390
2014-04-01 0.018291
2014-04-02 -0.000283
2014-04-03 0.004828
...
2021-12-27 0.006263
2021-12-28 -0.010914
2021-12-29 0.000386
2021-12-30 -0.003427
2021-12-31 -0.009061
Name: Price, Length: 1957, dtype: float64
df.Price.pct_change(fill_method=None).plot()
실행 결과
<Axes: xlabel='Date'>
<Figure size 640x480 with 1 Axes>

퀴즈
df.set_index('Date', inplace=True)의 역할은 무엇인가요?
퀴즈를 풀려면 대화형 기능을 불러와야 합니다.