주식 데이터를 얻고 matplotlib로 표시해 봅니다.
11666 단어 pandas파이썬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()
labels
는 ser_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/
Reference
이 문제에 관하여(주식 데이터를 얻고 matplotlib로 표시해 봅니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ti-ginkgo/items/7b044f6222a4dd73e6c0
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
parsed = parse(urlopen('https://stocks.finance.yahoo.co.jp/stocks/history/?code=1570.T'))
doc = parsed.getroot()
tables = doc.findall('.//table')
calls = tables[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()
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
'''
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()
[1]Python에 의한 데이터 분석 입문
- NumPy, pandas를 사용한 데이터 처리 htps //w w. 미안해. 이. jp/보오 ks/9784873116556/
Reference
이 문제에 관하여(주식 데이터를 얻고 matplotlib로 표시해 봅니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ti-ginkgo/items/7b044f6222a4dd73e6c0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)