주식 데이터를 얻고 matplotlib로 표시해 봅니다.

주식 데이터를 검색하고 matplotlib로 표시



라이브러리 가져오기



평소처럼 필요한 라이브러리를 가져옵니다.
from lxml.html import parse
from urllib.request import urlopen
import pandas as pd
import matplotlib.pyplot as plt 
import string
import re
from pandas import DataFrame
from pandas.io.parsers import TextParser

python2에서는 urllib.request 대신 urllib2입니다.

url에서 사이트 정보 얻기



취득 방법은 다음과 같습니다.
parsed = parse(urlopen('https://stocks.finance.yahoo.co.jp/stocks/history/?code=1570.T'))
doc = parsed.getroot()

우선은 urlopen() 로 취득하고 싶은 페이지를 지정해, parse() 로 그 페이지를 퍼스 합니다.
다음으로, getroot() 로 루트가 되는 노드를 취득합니다.
이 흐름은 파일등의 해석에서도 정평의 흐름이므로 기억해 두면 편리합니다.

취득한 문서에서 주식 정보를 검색


tables = doc.findall('.//table')
calls = tables[1]
findall() 를 사용하여 주식 데이터가 기록된 데이터의 테이블을 검색합니다.
테이블 정보를 읽는 데 필요한 함수를 정의합니다.

참고 문헌 [1]의 인용
def _unpack(row, kind='td'):
    elts = row.findall('.//%s' % kind)
    return [val.text_content() for val in elts]
def parse_options_data(table):
    rows = table.findall('.//tr')
    header = _unpack(rows[0], kind='th')
    data = [_unpack(r) for r in rows[1:]]
    return TextParser(data, names=header).get_chunk()

위의 함수를 사용하여 데이터를 읽습니다.
여기서 인덱스를 시계열 순으로 정렬한 상태로 표시하기 위해 reset_index() 를 사용합니다.calls_data.iloc[::-1] 에 의해 역순으로 정렬되고 reset_index() 에 의해 인덱스가 다시 표시됩니다.reset_index() 는 인덱스를 되돌리는 함수이며, reset_index(drop=True) 라고 하면(자) 에 의해 원래의 인덱스열을 소거합니다.
calls_data = parse_options_data(calls)
calls_data2 = calls_data.iloc[::-1].reset_index(drop=True)

#print(calls_data2)
'''
    日付             始値     高値     安値    終値     出来高       調整後終値*
0   2017年9月29日    16,610  16,700  16,560  16,650  4,073,463   16,650
1   2017年10月2日    16,740  16,770  16,690  16,760  3,106,816   16,760
2   2017年10月3日    16,860  17,140  16,820  17,120  6,525,809   17,120
3   2017年10月4日    17,170  17,230  17,070  17,140  5,417,610   17,140
4   2017年10月5日    17,170  17,190  17,090  17,150  3,542,774   17,150
5   2017年10月6日    17,260  17,290  17,190  17,250  3,075,106   17,250
6   2017年10月10日   17,200  17,460  17,180  17,450  3,820,090   17,450
7   2017年10月11日   17,420  17,600  17,400  17,550  3,737,587   17,550
8   2017年10月12日   17,700  17,730  17,620  17,680  4,153,253   17,680
9   2017年10月13日   17,670  18,110  17,630  18,040  7,215,394   18,040
10  2017年10月16日   18,130  18,350  18,070  18,210  5,615,892   18,210
11  2017年10月17日   18,380  18,430  18,140  18,350  7,059,034   18,350
12  2017年10月18日   18,390  18,460  18,290  18,390  4,002,389   18,390
13  2017年10月19日   18,530  18,610  18,400  18,530  5,226,126   18,530
14  2017年10月20日   18,400  18,600  18,370  18,520  5,312,583   18,520
15  2017年10月23日   18,980  19,000  18,800  18,950  7,695,544   18,950
16  2017年10月24日   18,880  19,150  18,850  19,150  6,304,942   19,150
17  2017年10月25日   19,330  19,350  18,860  19,000  9,746,906   19,000
18  2017年10月26日   18,980  19,110  18,950  19,030  5,165,178   19,030
19  2017年10月27日   19,230  19,520  19,160  19,510  8,236,187   19,510
'''

matplotlib로 표시



matplotlib로 표시하려면 다음을 수행합니다.
labels = []
for date in calls_data2.iloc[::2, 0]:
    labels.append(re.sub(u'[一-龥]', '/', str(date)))

#print(labels)
'''
['2017/9/29/', '2017/10/3/', '2017/10/5/', '2017/10/10/', '2017/10/12/', 
 '2017/10/16/', '2017/10/18/', '2017/10/20/', '2017/10/24/', '2017/10/26/']
'''

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot(calls_data2.iloc[:, 1], 'o-', linewidth=3)

ax.set_xticks([0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
ax.set_xticklabels(labels, rotation=30, fontsize='small')
ax.set_xlabel('Date')
ax.set_ylabel('Opening Price')
ax.grid(True)
plt.show()
labelsser_xtickslabels 에서 사용하기 때문에 준비하고 있습니다.
정규 표현을 이용해, 예를 들면 2017년 9월 29일이라고 하는 것을 2017/9/29라고 하는 바람으로 옮겨놓고 있습니다.
파이썬에서 한자의 정규식은 u'[一-龥]' 입니다만, 별로 사용하는 것은 없다고 생각합니다.
ax.set_xticks([0, 2, 4, 6, 8, 10, 12, 14, 16, 18])ax.set_xticklabels(columns, rotation=30, fontsize='small')와 같이 함으로써 데이터 간격에 대응한 라벨을 출력할 수 있습니다.



참고문헌



[1]Python에 의한 데이터 분석 입문
- NumPy, pandas를 사용한 데이터 처리 htps //w w. 미안해. 이. jp/보오 ks/9784873116556/

좋은 웹페이지 즐겨찾기