logo

날짜 인덱스와 변화량

주요 개념

  • 날짜 인덱스 설정과 정렬
  • 날짜·기간별 데이터 조회
  • diff, pct_change: 변화량과 변화 비율

실습 준비

import pandas as pd

실습 프롬프트

🤖 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>

2014년부터 2021년까지의 알파벳 주가

변화량 구하기

이전 관측값과의 차이

  • 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>

이전 거래일 대비 알파벳 주가의 변화 비율

퀴즈

문제 1 / 3맞음: 0힌트: 0틀림: 0채점중: 0남음: 3

df.set_index('Date', inplace=True)의 역할은 무엇인가요?

  • ○Date 컬럼의 문자열을 날짜·시간 자료형으로 바꾼다.
  • ○Date 컬럼을 기준으로 모든 행을 시간순으로 정렬한다.
  • ○Date 컬럼을 원본 데이터프레임의 행 인덱스로 설정한다.
  • ○Date 컬럼의 누락된 날짜에 해당하는 행을 추가한다.

퀴즈를 풀려면 대화형 기능을 불러와야 합니다.

Previous
날짜와 시간 다루기