반응형
위 글에 이어지는 내용입니다.
이번에는 선생님께서 따로 주신 DB를 이용해 그래프를 그려보았습니다.
오른쪽 링크에서 해당 DB를 다운 받을 수 있습니다. cafe.naver.com/aandroid/453
3952 개의 rows를 가지고 있습니다.
column은 894개의 종목 colum과 in_time 컬럼 1개를 포함해 총 895개가 있습니다.
테이블의 구조에 맞게 전에 작성한 코드를 조금씩 변경해야 합니다.
일단 한개의 종목만 출력되도록 코드를 조금씩 변경해보았습니다.
아래 코드에서
font_location = '/System/Library/Fonts/Supplemental/AppleMyungjo.ttf'
이부분을 본인이 원하는 한글 코드의 경로로 변경하셔야 합니다. mac 사용자라면 따로 변경 안하시고 그대로 가져가셔도 문제 없이 잘 되겠지만, windows 환경이라면 반드시 변경을 해주셔야 합니다.
font_location = 'c:/Windows/Fonts/malgun.ttf'
맑은 고딕 폰트경로인데, 테스트는 안해봤지만 윈도우 환경에서는 위 경로로 하면 잘 될듯 합니다. 아래 코드내용에서는 딱히 한글 출력할 일이 없으니 그냥 폰트 관련 내용을 싹 지워도 괜찮습니다.
import re
import pymysql
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import numpy as np
# 총 출력할 주식수 정하기. 너무많아지면 컴퓨터가 감당을 못해서 실행이 안됨. 40개 넘어가면 느려지고 70개부턴 거의 컴퓨터가 멈춘다.
totalStocks = 30
# 라벨 한글깨짐 방지를 위한 폰트 설정
fm.get_fontconfig_fonts()
font_location = '/System/Library/Fonts/Supplemental/AppleMyungjo.ttf'
font_name = fm.FontProperties(fname=font_location).get_name()
mpl.rc('font', family=font_name)
mpl.rcParams['legend.fontsize'] = 10
# DB 정보 설정
db = pymysql.connect(host='localhost', user='root', db='_stock_old', password='python', charset='utf8')
curs = db.cursor()
# stock 이름들 받아오기
stock = ['s000020']
# stock = []
# sql = "select distinct s_name from stock";
# curs.execute(sql)
# rows = curs.fetchall()
# cnt = 0
# for stockname in rows:
# stock.append(str(str(stockname))[2:-3])
# cnt += 1
# if(cnt==totalStocks):
# break
# 정보를 받아온 횟수 totalNum에 기록해서 time 배열만들기
sql = "select count(*) from stock_sync_0121"
curs.execute(sql)
rows = curs.fetchall()
for i in range(len(rows)):
totalNum = int(re.findall('\d+',str(rows[i]))[0])
time = range(0,totalNum)
# stock 코드에 맞는 종목 검색해 가격변화 priceArr 배열에 기록하기.
priceArr = []
for i in range(len(stock)):
sql = "select {}, in_time from stock_sync_0121 order by in_time".format(stock[i]);
curs.execute(sql)
rows = curs.fetchall()
arr = []
firstPrice = int(re.findall('\d+',str(rows[0]))[0])
for i in range(len(rows)):
price = int(re.findall('\d+',str(rows[i]))[0])
priceGap = price - firstPrice
priceGapPercent = priceGap/firstPrice * 100
arr.append(priceGapPercent)
priceArr.append(arr)
fig = plt.figure()
ax = fig.gca(projection='3d')
#x 축은 0,1,2,... 고정
x = []
for i in range(len(stock)):
x.append(np.zeros(len(time),dtype=int)+i)
# y축은 시간, z축은 가격
# 그래프 그려주기
for i in range(len(stock)):
ax.plot(x[i],time,priceArr[i], label=stock[i])
ax.legend()
plt.show()
일단 한개의 종목 출력을 해내면 그 다음은 어렵지 않습니다.
import re
import pymysql
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import numpy as np
# 총 출력할 주식수 정하기. 너무많아지면 컴퓨터가 감당을 못해서 실행이 안됨. 40개 넘어가면 느려지고 70개부턴 거의 컴퓨터가 멈춘다.
totalStocks = 30
# 라벨 한글깨짐 방지를 위한 폰트 설정
fm.get_fontconfig_fonts()
font_location = '/System/Library/Fonts/Supplemental/AppleMyungjo.ttf'
font_name = fm.FontProperties(fname=font_location).get_name()
mpl.rc('font', family=font_name)
mpl.rcParams['legend.fontsize'] = 10
# DB 정보 설정
db = pymysql.connect(host='localhost', user='root', db='_stock_old', password='python', charset='utf8')
curs = db.cursor()
# stock 이름들 받아오기 - 컬럼명을 쿼리에 보내서 받아온다.
stock = []
sql = """SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA='_stock_old'
AND TABLE_NAME='stock_sync_0121'
and column_name != 'in_time'
""";
curs.execute(sql)
rows = curs.fetchall()
cnt = 0
for stockname in rows:
stock.append(str(str(stockname))[2:-3])
cnt += 1
if(cnt==totalStocks):
break
# 정보를 받아온 횟수 totalNum에 기록해서 time 배열만들기
sql = "select count(*) from stock_sync_0121"
curs.execute(sql)
rows = curs.fetchall()
for i in range(len(rows)):
totalNum = int(re.findall('\d+',str(rows[i]))[0])
time = range(0,totalNum)
# stock 코드에 맞는 종목 검색해 가격변화 priceArr 배열에 기록하기.
priceArr = []
for i in range(len(stock)):
sql = "select {}, in_time from stock_sync_0121 order by in_time".format(stock[i]);
curs.execute(sql)
rows = curs.fetchall()
arr = []
firstPrice = int(re.findall('\d+',str(rows[0]))[0])
for i in range(len(rows)):
price = int(re.findall('\d+',str(rows[i]))[0])
priceGap = price - firstPrice
priceGapPercent = priceGap/firstPrice * 100
arr.append(priceGapPercent)
priceArr.append(arr)
fig = plt.figure()
ax = fig.gca(projection='3d')
#x 축은 0,1,2,... 고정
x = []
for i in range(len(stock)):
x.append(np.zeros(len(time),dtype=int)+i)
# y축은 시간, z축은 가격
# 그래프 그려주기
for i in range(len(stock)):
ax.plot(x[i],time,priceArr[i], label=stock[i])
ax.legend()
plt.show()
2020년 12월 15일부터 2021년 1월 21일까지 데이터인데, 시장이 굉장히 좋았었나봅니다.
이상입니다.
반응형
'Programming > Python' 카테고리의 다른 글
pymongo와 BeautifulSoup 이용해서 python에서 크롤링 하기 (0) | 2021.03.22 |
---|---|
pymongo 이용 Python에서 MongoDB 사용하기, CRUD 예제 (0) | 2021.03.22 |
python 이용해 3차원 주식 그래프 그리기 (0) | 2021.03.19 |
Python에서 Selenium 사용하기 및 Error: “chromedriver” cannot be opened because the developer cannot be verified. Unable to launch the chrome browser 에러코드 해결 (0) | 2021.03.18 |
python 에서 pymysql 이용해 mysql과 연결하기, CRUD 예제 (0) | 2021.03.16 |