시계열 데이터 분석 : pandas CSV 파일 저장, 읽기
시계열 데이터 분석은 세상의 흐름을 파악하는데 꼭 필요한 기술입니다. 특히 경제 흐름을 파악하고, 주식, 부동산 등 투자하는데 유용한 기술인데요. 이번 포스팅에서는 많은 종류의 데이터를 비교하고 분석하기 위한 기술에 대해 배워보겠습니다. 파이썬의 pandas 라이브러리를 이용하여 csv 파일로 저장한 후 필요할 때 읽어 와서 쓰는 방법과 시계열 데이터에서 핵심적인 부분인 날짜 변환에 주목해 주시기 바랍니다.
글의 순서
csv 파일 : 시계열 데이터 분석에 유용한 데이터 파일 형식
API로 가져온 데이터를 csv 파일로 저장하는 이유
업비트 API로 받아온 비트코인, 이더리움 가격을 csv 파일로 저장하는 방법
저장해놓은 시계열 데이터 csv 파일 읽어오기
csv 파일 날짜 데이터 타입 변환
csv 파일 : 시계열 데이터 분석에 유용한 데이터 파일 형식
csv 파일은 comma separated value format의 줄임말로, 콤마(,)로 분리된 데이터 형식입니다. pandas.DataFrame으로 저장된 데이터에서 공백 대신 콤마(,)가 있다는 것입니다. 우리 눈에는 아래의 ‘pandas를 이용한 전처리 결과’처럼 공백으로 분리된 데이터가 더 보기 좋지만, 컴퓨터 관점에서는 csv 파일 형태에서처럼 콤마(,)로 분리된 데이터가 훨씬 처리하기 쉽다고 보시면 되겠습니다.
1 2 3 4 5 6 7 |
-- pandas를 이용한 전처리 결과 확인 -- Dates BTC ETH 0 2022-06-01 37880000.0 2312000.0 1 2022-06-02 38392000.0 2313000.0 2 2022-06-03 37851000.0 2262000.0 3 2022-06-04 37916000.0 2291000.0 4 2022-06-05 37972000.0 2296000.0 |
1 2 3 4 5 6 |
Dates,BTC,ETH 2022-06-01,37880000.0,2312000.0 2022-06-02,38392000.0,2313000.0 2022-06-03,37851000.0,2262000.0 2022-06-04,37916000.0,2291000.0 2022-06-05,37972000.0,2296000.0 |
REST API로 가져온 데이터를 csv 파일로 저장하는 이유
지난 포스팅시계열 데이터 가시화 (3) 파이썬 날짜변환, pandas를 이용한 그래프 그리기에서 비트코인과 이더리움 가격을 업비트 API를 이용하여 가져왔었습니다.
실감나는 시계열 데이터를 가져오는 것은 좋지만, 업비트 API부터 시작하면, 코드가 길어지고, 실습하는 코드마다 데이터를 가져오고 전처리하는 과정이 중복됩니다. 또한 여러 가지 코인의 많은 데이터를 비교, 분석하려면 데이터파일(csv 파일)로 저장해놓고, 필요할 때마다 불러 쓰는 것이 효율적이기도 합니다.
업비트 API로 받아온 비트코인, 이더리움 가격을 csv 파일로 저장하는 방법
파이썬의 pandas 라이브러리, 그 중에서도 2차원 배열 형태의 데이터를 담당하는 DataFrame은 csv 파일과 잘 대응됩니다. 그래서 csv 파일로 저장하는 것도 아래처럼 간단합니다.
df.to_csv(’22_01_BTC_ETH.csv’, sep=’,’, na_rep=’NaN’, index=False)
df는 pandas.DataFrame을 저장하고 있는 변수입니다. 이 변수 뒤에 점을 찍고 to_csv라는 함수를 쓰면 csv 파일을 만들어줍니다. 데이터를 저장하는 csv 파일 이름과 사용빈도가 높은 선택사항 들을 알아보겠습니다. 위에서 사용한 to_csv() 함수에는 csv 파일 이름과, sep, na_rep, index라는 인자를 사용하였습니다.
위에서 pandas의 to_csv() 함수로 만드는 파일의 이름은 22_01_BTC_ETH.csv입니다. replit을 이용할 경우에는 파일 이름만 써도 되지만, 개인 PC에서 사용할 때는 경로까지 함께 표기해줘야 합니다.
sep은 콤마(,)나 tab 같은 구분자, na_rep는 빠진 데이터를 무엇으로 채울지를, index는 index를 파일에 포함시킬지를 설정하는 것입니다. na_rep=’NaN’에서 NaN은 ‘Not a Number’를 의미하는데, 판다스 데이터프레임 안에 데이터가 없을 경우 NaN을 채우라는 의미입니다. 또 다른 많은 옵션들은 참고자료 3을 참고하시기 바랍니다.
‘csv파일저장’ 코드는 업비트 API로 2022년 전반기의 코인 가격을 가져와서 csv 파일로 저장하는 코드입니다.
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 requests import json import matplotlib.pyplot as plt import pandas as pd from datetime import datetime, timedelta #1) UPbit API 분석하기 #2) UPbit API를 포함하는 파이썬 함수 만들기 def get_coin_price(ticker,n_candle): url = ("https://api.upbit.com/v1/candles/days?market=%s&count=%d" %(ticker, n_candle)) raw_resp = requests.get(url) response = raw_resp.json() return response def str2date(candle_date): date_splt = candle_date.split('T') yyyy_mm_dd = date_splt[0] date_time = datetime.strptime(yyyy_mm_dd, '%Y-%m-%d') date = date_time.date() return date def date_gen(stt, end): dates = [(stt + timedelta(days=i)) for i in range((end-stt).days+1)] return dates #3) UPbit API로 데이터 가져오기 nday = 184 btc_price_raw = get_coin_price("KRW-BTC",nday) eth_price_raw = get_coin_price("KRW-ETH",nday) #4) UPbit API로 가져온 데이터 전처리 candle_date = [] btc_price = [] eth_price = [] for i in range(0,nday): candle_date.append(btc_price_raw[nday-1-i]["candle_date_time_kst"]) btc_price.append(btc_price_raw[nday-1-i]["trade_price"]) eth_price.append(eth_price_raw[nday-1-i]["trade_price"]) #4-1) 날짜리스트 : 문자열 데이터에서 날짜 데이터로 변환 후 day_stt = str2date(candle_date[0]) day_end = str2date(candle_date[nday-1]) dates = date_gen(day_stt, day_end) #5) pandas를 이용한 전처리 결과 확인 coin_price = zip(dates, btc_price, eth_price) df = pd.DataFrame(coin_price, columns=['Dates','BTC','ETH']) print("-- pandas를 이용한 전처리 결과 확인 --") print(df.head(5)) #6) csv 파일로 저장 df.to_csv('22_01_BTC_ETH.csv', sep=',', na_rep='NaN', index=False) |
저장해놓은 시계열 데이터 csv 파일 읽어오기
이번 포스팅에서 지금 이 부분은 API로 데이터를 받아온 후, 전처리하는 과정이 csv 파일을 읽는 것으로 대체된 것입니다. csv 파일을 읽어오는 데는 pandas의 read_csv 함수를 이용합니다. 파이썬 프로그래밍 환경이 replit일 경우에는 파일이름만 써도 되지만, 나머지 환경에서는 파일 경로까지 함께 나타내 줘야 합니다. 예를 들어 d:/python_study/22_01_BTC_ETH.csv처럼 말입니다. 여기서 주의할 사항은 d:/에서와 같이 윈도우 운영체제에서의 ‘\’가 아니라 ‘/’를 써야 한다는 것입니다. 중요한 점이라 한번 더 강조했습니다.
pandas.read_csv 함수로 csv 파일을 읽어오면 바로 DataFrame 형태가 됩니다. csv파일읽기 코드를 실행시키면, csv 파일이 판다스 데이터프레임 형태로 저장되어있다는 것을 확인할 수 있습니다. print문에서 head(5)은 데이터 시작부분부터 5번째 줄까지를 출력하라는 의미입니다. 반면 tail(3)는 데이터 맨 마지막 3줄을 출력하라는 것을 나타냅니다.
계열 데이터에서 정작 중요한 것은 바로 날짜, 시간 데이터입니다. 그런데 이것이 datetime 타입(type)이 아니라 object type이라는 것을 기억해야 합니다. 그래프를 그릴 때 날짜로 인식하게 하려면, 이것을 datetime 타입으로 바꿔줘야 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import matplotlib.pyplot as plt import pandas as pd #1) csv 파일 읽어오기 df = pd.read_csv('22_01_BTC_ETH.csv', sep=',') #2) pandas를 이용한 전처리 결과 확인 print("-- csv 파일로 만든 pandas.DataFrame 확인 --") print(df.head(5)) #3) Dates의 type 확인 print("\n","-- Dates type --") print(df['Dates'].tail(3)) |
1 2 3 4 5 6 7 8 9 10 11 12 |
Dates BTC ETH 0 2022-01-01 57915000.0 4577000.0 1 2022-01-02 57531000.0 4652000.0 2 2022-01-03 56641000.0 4591000.0 3 2022-01-04 56023000.0 4619000.0 4 2022-01-05 53854000.0 4382000.0 -- Dates type -- 181 2022-07-01 182 2022-07-02 183 2022-07-03 Name: Dates, dtype: object |
csv 파일 날짜 데이터 타입 변환
판다스의 to_datetime() 함수를 이용하면 날짜 데이터 타입을 datetime 타입으로 바꿀 수 있습니다. 타입이 바뀌고나면 날짜 데이터로 인식합니다. 날짜데이터_타입_변환 코드를 실행시키면 데이터 타입 변환 전 object type이 변환 후 datetime64 type으로 바뀐 것을 확인할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import matplotlib.pyplot as plt import pandas as pd #1) csv 파일 읽어오기 df = pd.read_csv('22_01_BTC_ETH.csv', sep=',') #2) Dates의 type 확인 print("\n","-- Dates type --") print(df['Dates'].tail(3)) #3) Dates의 type 변환 : object --> datetime df['Dates'] = pd.to_datetime(df['Dates']) print("\n","-- Dates type --") print(df['Dates'].tail(3)) |
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] |
마치며 …
이번 포스팅에서는 여러 종류의 데이터를 비교하고 분석하기 위한 기술에 대해 배워보았습니다. pandas 라이브러리를 이용하여 시계열 데이터를 csv 파일로 저장해놓고 필요할 때 csv 파일을 읽어봐서 사용하는 방식입니다. 물론 이 방식은 시계열 데이터 분석에도 유용합니다.
csv 파일을 읽어왔을 때, 날짜, 시간 데이터가 datetime 타입(type)이 아니라 object type입니다. 그래프를 그릴 때 날짜로 인식하게 하려면, 이것을 datetime 타입으로 바꿔줘야 한다는 것도 기억해 주시기 바랍니다. 마지막으로 이 포스팅에서 나왔던 코드의 핵심부분(csv 파일로 쓰고, 읽어오며, 날짜 데이터 타입을 바꾸는 것)을 요약해 보겠습니다.
df.to_csv(’22_01_BTC_ETH.csv’, sep=’,’, na_rep=’NaN’, index=False)
df = pd.read_csv(’22_01_BTC_ETH.csv’, sep=’,’)
df[‘Dates’] = pd.to_datetime(df[‘Dates’])
함께 참고하면 더 좋은 글 :
1. 파이썬 프로그래밍 시작하기 (1) 온라인 프로그래밍 환경 replit
2. 시계열-데이터-가시화-날짜변환-pandas/
3. 시계열 데이터 가시화 (3) 파이썬 날짜변환, pandas를 이용한 그래프 그리기
4. 시계열 데이터 전처리 결과 확인 : pandas Series
5. 업비트 API로 이해해보는 REST API
6. 업비트 REST API를 이용한 비트코인 가격 추출 파이썬 프로그래밍
7. 업비트 시계열 데이터 가시화를 위한 전처리
8. 시계열 데이터 가시화 (2) 보고서용 파이썬 그래프 만들기
9. 파이썬 데이터 분석! 데이터 분석을 위한 코딩언어 파이썬
10. 알아두면 좋을 컴퓨터 작동원리. 폰 노이만 아키텍처
11. 파이썬 판다스 데이터 분석 : pivot, 엑셀 입력, 출력
참고자료
[1] UPbit(2020),일(Day) 캔들
[2] DelftStack (2021),datetime – 기본 날짜와 시간 형