※ 포스팅의 예시는 업비트 개발자 센터 홈페이지에서 API를 받아 데이터로 저장하였습니다.
※ 주피터 노트북 환경에서 단계별 셀 단위로 실행하였습니다.
1. API 받아오기
업비트 개발자 센터 : https://docs.upbit.com/에 들어가서 원하는 데이터의 API를 받는다. (예시로 분(Minute) 캔들로 진행한다)
import requests
url = "https://api.upbit.com/v1/candles/minutes/1?market=KRW-BTC&count=1"
headers = {"accept": "application/json"}
response = requests.get(url, headers=headers)
print(response.text)

샘플 코드를 실행하면 사진과 같은 값으로 결과가 출력된다.
2. DataFrame으로 변환하여 csv로 저장
import pandas as pd
import json
tmp = open("tmp.txt", "w")
tmp.write(response.text)
tmp.close()
with open("tmp.txt") as f:
_tmp = json.loads(f.read())
df = pd.DataFrame(_tmp)
df.to_csv("chart.csv")
코드를 실행하면 "tmp.txt"와 "chart.csv" 두 개의 파일이 생성된다.
3. MySQL과 연동하기
※ Mysql 서버가 실행되어 있는 상황입니다.
CREATE DATABASE upbit;
MySQL에서 데이터를 저장할 데이터 베이스를 만든다.
import pandas as pd
import pymysql
conn = pymysql.connect(host='127.0.0.1', user='root', password='1234', db='upbit', charset='utf8')
curs = conn.cursor(pymysql.cursors.DictCursor)
위 코드를 실행하면 파이썬과 MySQL이 연동된다.
4. 파이썬 코드로 Table 생성하기
sql = '''create table chart(
idx int,
market VARCHAR(10),
candle_date_time_utc VARCHAR(30),
candle_date_time_kst VARCHAR(30),
opening_price double,
high_price double,
low_price double,
trade_price double,
timestamp long,
candle_acc_trade_price double,
candle_acc_trade_volume double,
unit int);'''
curs.execute(sql)
conn.commit()
저장된 DataFrame의 컬럼들을 받을 Table을 생성할 수 있는 SQL문을 문자열 형태로 저장하여, execute를 해준다.
MySQL에 반영하기 위해서 commit을 실행해줘야 한다.

위 코드가 정상 실행이 됐다면, 파이썬 코드로 MySQL에서 테이블이 생성된다.
5. Table에 데이터 넣기
sql = '''insert into chart
(idx, market, candle_date_time_utc, candle_date_time_kst, opening_price, high_price,
low_price, trade_price, timestamp, candle_acc_trade_price, candle_acc_trade_volume, unit)
values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
'''
for idx in range(len(df)):
curs.execute(sql, tuple(df.values[idx]))
conn.commit()
위 코드를 실행하면 Dataframe 형태로 저장된 데이터가 테이블로 저장된다.
SELECT * FROM;
데이터를 조회하면 아래처럼 저장된 데이터를 확인할 수 있다.

6. 파이썬과 연동 종료
curs.close()
conn.close()
작업을 모두 마쳤으면 close로 연동을 끊어준다.
마주한 에러와 해결 방법
에러 코드
sql = '''insert into chart
(market, candle_date_time_utc, candle_date_time_kst, opening_price, high_price,
low_price, trade_price, timestamp, candle_acc_trade_price, candle_acc_trade_volume, unit)
values (%s, %s, %s, %f, %f, %f, %f, %d, %f, %f, %d)
'''
for idx in range(len(df)):
curs.execute(sql, tuple(df.values[idx]))
conn.commit()
위 코드에서 2가지 에러가 발생했다.
1. TypeError: not all arguments converted during string formatting
API에서 제공하는 컬럼만 생성하여 데이터를 넣어줬더니 계속 에러가 발생했다.
저장된 excel 데이터를 확인하니 데이터 행 가장 앞에 예상하지 못했던 index의 값이 있어서 숫자가 매칭이 안되며 발생한 문제였다.
테이블을 생성할 때 index 값을 받을 수 있는 컬럼을 생성하고 그 값까지 함께 넣어줬다.
2. TypeError: %d format: a real number is required, not str
데이터 타입에 따라 포맷팅을 해주기 위해서 타입에 맞는 반환 변수를 %s, %f, %d을 해줬었다.
하지만 SQL로 보내서 읽으려면 모든 반환 변수를 데이터 타입과 관계없이 %s로 해줘야 한다.
수정 코드
sql = '''insert into chart
(idx, market, candle_date_time_utc, candle_date_time_kst, opening_price, high_price,
low_price, trade_price, timestamp, candle_acc_trade_price, candle_acc_trade_volume, unit)
values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
'''
for idx in range(len(df)):
curs.execute(sql, tuple(df.values[idx]))
conn.commit()
'Computer' 카테고리의 다른 글
| Mac환경 Kafka 설치와 명령어 (3) | 2023.09.04 |
|---|---|
| Websocket으로 데이터를 받아 MySQL에 저장하기 (2) | 2023.09.01 |
| 네트워크 기초 (0) | 2023.07.11 |
| 프로그래밍 패러다임 (0) | 2023.07.03 |
| 디자인 패턴 with Python code (2) | 2023.06.08 |