시계열 데이터 가시화 (4) 2개 y축 그래프로 코인 가격 비교
시계열 데이터 분석을 위해서는 시계열 데이터가 어떻게 변화하고 있는지를 한눈에 파악할 수 있어야 합니다. 이때 가장 좋은 방법이 그래프입니다. 이번 포스팅에서는 실감나는 시계열 데이터를 이용하여 그래프를 작성해보겠습니다. csv 파일을 읽어오고, 날짜를 datetime 타입으로 바꾼 후 2개 y축(세로축)을 갖는 그래프를 만드는 방법을 확인해 보시기 바랍니다.
글의 순서
matplotlib를 이용한 시계열 데이터 가시화 : 그래프 그리기 3단계
matplotlib의 figure와 axes 개념
시계열 데이터를 csv 파일로 읽어오기
2개 y축을 이용한 시계열 데이터 그래프 그리기
matplotlib를 이용한 시계열 데이터 가시화 : 그래프 그리기 3단계
지난 포스팅 시계열 데이터 가시화 (1) 파이썬 그래프 그리기 3단계에서 시계열 데이터를 그래프로 만드는 방법을 알아봤습니다. 간단히 요약해보면 다음과 같습니다. 이 3단계를 적용하면 시계열 데이터가 어떤 형태인지 정도만 확인할 수 있습니다. 그래프의 가독성을 높이기 위해서는 축 서식과 격자 등 추가 설정이 필요합니다.
(1) pyplot 모듈 불러오기
from matplotlib import pyplot
또는 import matplotlib.pyplot
또는 import matplotlib.pyplot as plt
마지막 방법이 실제 많은 파이썬 프로그래머가 사용하는 방법입니다. as구문을 써서 간단하게 plt라는 별명을 주면 파이썬 코드의 가독성이 높아지기 때문입니다.
(2) plot 함수 사용하기
plt.plot(x인자, y인자)
x인자와 y인자로는 보통 리스트라는 데이터 구조를 사용합니다.
(3) show 함수 사용해서 그래프 보여주기
plt.show()
matplotlib 라이브러리의 pyplot 모듈 안에 있는 show 함수로 그래프를 보여줍니다.
matplotlib의 figure와 axes 개념
시계열 데이터 가시화 (2) 보고서용 파이썬 그래프 만들기라는 포스팅에서 pyplot 모듈에 있는 figure 함수를 통해 그래프 크기를 조절할 수 있었습니다. 그런데 엄밀히 말하면 그래프가 아니라 그래프가 그려지는 틀, 만약 그래프를 종이에 그린다면 종이 크기를 조절하는 것이었습니다. 만약 종이 안에 그래프를 여러 개 그려야 한다면, 어떻게 해야 할까요? 이 부분에서 axes라는 개념이해가 필요합니다.
matplotlob에는 figure와 axes라는 개념이 있습니다. 우리가 A4지라는 종이에 그래프를 그린다고 했을 때, A4지가 나타내는 것이 figure입니다. 그 안에 그린 그래프는 axes가 됩니다. figure라는 종이 안에 그래프를 1개만 그릴 경우는 axes라는 개념을 몰라도 되겠지만, 그래프를 여러 개 그릴 경우에는 각 그래프의 위치와 모양을 정해주기 위해 세세한 세팅을 해줘야 합니다. 가장 빠른 방법은 역시나 직접 해보는 것입니다. 실감나는 코인 가격을 이용하여 차근차근 진행해 보겠습니다.
시계열 데이터를 csv 파일로 읽어오기
지난 포스팅 시계열 데이터 가시화 (3) 파이썬 날짜변환, pandas를 이용한 그래프 그리기에서 비트코인과 이더리움 가격을 업비트 API를 이용하여 가져왔었습니다.
실감나는 시계열 데이터로 그래프 그리는 연습을 하되, 업비트 API부터 시작하면, 코드가 길어지고, 실습하는 코드마다 내용이 중복됩니다. 그렇기 때문에, 코인가격을 데이터파일(csv 파일)로 저장한 후, 불러와서 그래프를 작성해보겠습니다. 시계열 데이터의 핵심은 시간입니다. 그런데 csv 파일로 저장한 후 읽어오게 되면 날짜나 시간 데이터가 datetime 타입(type)이 아니라 object type입니다.
시계열 데이터 분석 : pandas CSV 파일 저장, 읽기에서 알아봤던 것처럼 그래프를 그릴 때 날짜로 인식하게 하기 위해 이것을 datetime 타입으로 바꾸는 부분도 유심히 봐주시기 바랍니다.
2개 y축을 이용한 시계열 데이터 그래프 그리기
이제부터는 본격적으로 그래프를 그리는 일만 남았습니다. 비트코인과 이더리움은 개당 코인 가격이 10배 이상 차이가 납니다. 그렇기 때문에 두 코인 가격을 하나의 그래프에 담으면 비트코인에 비해 가격의 변화범위가 작은 이더리움 가격 변화를 알아채기가 어렵습니다. 이때 필요한 것이 y축(세로축)을 2개로 만드는 것입니다.
‘2개 y축 시계열 데이터 그래프’ 코드는 코인 가격이라는 시계열 데이터를 2개 y축 그래프로 만들어 주는 코드입니다. 코드를 실행하면 썸네일의 그래프가 만들어지며(BTC_ETH_price.png 파일 생성), 콘솔에는 날짜 데이터 타입의 변화 과정을 보여줍니다.
코드의 27번 줄 부터 그래프를 그리는데 필요한 설정들을 보여줍니다. 그래프를 figure라는 틀 안에 여러 개 그릴 것을 감안하여 subplots() 라는 함수를 사용하였습니다. subplots라는 함수에 넘겨주고 있는 인자는 nrows, ncols와 틀의 크기입니다. figure라는 틀 안에 그래프를 총 2줄, 1열로 총 2개 그린다고 가정하면 nrows=2, ncols=1이 됩니다. 이 코드에서는 그래프를 1개 그릴 것이므로 각 인자에 1을 넘겨주었습니다. ax1이 그래프를 의미합니다. 2개 y축을 구분하기 위하여 ax1, ax2를 썼고, ax2의 x축은 ax1을 공유하므로, twinx() 라는 함수를 이용하였습니다.
subplots라는 함수를 사용할 경우의 축 이름 설정 방법, 시간을 나타내는 x축 범위 설정방법, x축 날짜 데이터의 눈금 설정방법, 격자와 범례 설정 방법 등은 사용빈도가 높습니다. 특히 날짜 데이터의 눈금 간격을 설정하는 방법은 그래프를 그릴 때 유용하게 활용되길 바랍니다. 그림에서는 1일 단위로 부격자가 그려져서 너무 촘촘해 보이지만, 그래프 그리기를 연습하는 차원으로 이해해 주시면 되겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mdates from datetime import datetime #1) csv 파일 읽어오기 df = pd.read_csv('22_01_BTC_ETH.csv', sep=',') #2) pandas를 이용한 전처리 결과 확인 print("-- csv 파일로 만든 pandas.DataFrame 확인 --") print(df.tail(5)) #3) Dates의 type 확인 print("\n","-- Dates type --") print(df['Dates'].tail(3)) #4) Dates의 type 변환 : object --> datetime df['Dates'] = pd.to_datetime(df['Dates']) print("\n","-- Dates type --") print(df['Dates'].tail(3)) #5) 시계열 데이터 그래프(y축 2개) : BTC, ETH #5-1) 그래프를 담는 틀(figure)과 그래프(axes) fig, ax1 = plt.subplots(nrows=1, ncols=1, figsize=(8,6)) ax1.plot(df['Dates'], df['BTC'], color='b', label='BTC', alpha=0.8) ax2 = ax1.twinx() ax2.plot(df['Dates'], df['ETH'], color='g', label='ETH', alpha=1.0) #5-2) 각 세로축의 이름 ax1.set_ylabel('BTC (KRW)') ax2.set_ylabel('ETH (KRW)') #5-3) 가로 축의 범위 설정 : 날짜 데이터 ax1.set_xlim(datetime(2022,1,1), datetime(2022,6,30)) #5-4) 날짜 데이터 눈금 간격 date_format = mdates.DateFormatter('%Y-%m-%d') ax1.xaxis.set_major_formatter(date_format) ax1.xaxis.set_major_locator(mdates.MonthLocator(interval=1)) ax1.xaxis.set_minor_locator(mdates.DayLocator(interval=1)) #5-5) 격자 ax1.tick_params(axis='x', rotation=30) ax1.grid(axis='x', which='major', color='gray', alpha=1.0) ax1.grid(axis='x', which='minor', color='gray', alpha=0.3) #5-6) 범례위치(legend) ax1.legend(loc='lower left') ax2.legend(loc='upper right') plt.savefig('BTC_ETH_price.png') plt.show() |
1 2 3 4 5 6 7 8 9 10 11 |
-- Dates type -- 181 2022-07-01 182 2022-07-02 183 2022-07-03 Name: Dates, dtype: object -- Dates type -- 181 2022-07-01 182 2022-07-02 183 2022-07-03 Name: Dates, dtype: datetime64[ns] |
마치며 …
시계열 데이터 분석을 위해서는 시계열 데이터가 어떻게 변화하고 있는지를 한눈에 파악할 수 있어야 합니다. 이때 가장 좋은 방법이 그래프입니다. 이번 포스팅에서는 실감나는 시계열 데이터인 코인 가격을 이용하여 그래프를 작성해보았습니다.
csv 파일을 읽어오고, 날짜를 datetime 타입으로 바꾼 후 2개 y축(세로축)을 갖는 그래프를 만드는 이 포스팅에서의 방법이 유용하게 활용될 수 있기를 바래봅니다.
함께 참고하면 더 좋은 글 :
1. 파이썬 프로그래밍 시작하기 (1) 온라인 프로그래밍 환경 replit
2. 시계열-데이터-가시화-날짜변환-pandas/
3. 시계열 데이터 분석 : pandas CSV 파일 저장, 읽기
4. 업비트 API로 이해해보는 REST API
5. 업비트 REST API를 이용한 비트코인 가격 추출 파이썬 프로그래밍
6. 시계열 데이터 가시화 (2) 보고서용 파이썬 그래프 만들기
7. 파이썬 데이터 분석! 데이터 분석을 위한 코딩언어 파이썬
참고자료
[1]June(2020),The Many Ways To Call Axes In Matplotlib, A beginner’s notes on learning matplotlib
[2] [네이버 지식백과] CSV 형식 [comma separated value format] (컴퓨터인터넷IT용어대사전, 2011. 1. 20., 전산용어사전편찬위원회)