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일까지 데이터인데, 시장이 굉장히 좋았었나봅니다.
이상입니다.
'Programming > Python' 카테고리의 다른 글
pymongo와 BeautifulSoup 이용해서 python에서 크롤링 하기 (2) | 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 |