Programming/python

python 이용해 3차원 주식 그래프 그리기(2)

Shane_Park 2021. 3. 19. 12:51

shanepark.tistory.com/48

 

python 이용해 3차원 주식 그래프 그리기

3차원 공간에 파이썬을 이용해 주식가격의 변동을 기록한 그래프를 그리는 프로그램을 작성해보았습니다. 일단 주식가격에 대한 데이터를 주기적으로 크롤링 해 와서 데이터베이스에 저장을

shanepark.tistory.com

위 글에 이어지는 내용입니다.

 


 

이번에는 선생님께서 따로 주신 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일까지 데이터인데, 시장이 굉장히 좋았었나봅니다.

 

이상입니다.

728x90