株価とスクレイピング①
目的:webスクレイピングの活用とエクセルの操作
目標
1 webスクレイピングをやってみる
2 取得したデータを扱ってみる
3 エクセルへデータを出力してグラフ化
webスクレイピングについて
スクレイピング(scraping)とは「擦り取る」を元にしたネット用語
ウェブ上のデータを拾い集めること
スクレイピングの注意点
法整備がまだみたい、これといった規定がない
問題提起
(総務省 消費者物価指数へのウェブスクレイピングの活用についてより)
・サイト側の著作権について
→収集するデータが数値の場合、著作物とは認められない
引用にはあたる
・サイトの利用規約に違反しないか
→オープン(誰でもアクセス可能)なサイトの場合、規約に合意する必要 はない
・業務妨害にならないか
→大量のアクセスによって、サーバーの負荷やシステムに障害があった場合は、業務妨害となる
また、yahooファイナンスのように、スクレイピング禁止を明示しているサイトもある→データの有料化をしている
このようなデータをスクレイピングすることは法的な問題が生じるおそれがある
※なので今回は、アメリカのyahoo financeを使っているのでセーフと思われる
一応、探したが禁止する規約みたいなものは見つからなかったので
プログラム実行順
1、必要なものをインポート
内容
import pandas as pd データフレーム(2次元配列)を扱うライブラリ
import datetime 日付を扱う
import openpyxl Excelを扱うライブラリ
Excelのグラフの参照範囲を指定するReference()関数
from openpyxl.chart import Reference
from 〇〇 import 〇〇は、書式をショートカットできる
openpyxl.chart.Reference()を → Referenceのみにできる
WEBスクレイピングする専用ライブラリ(プログラム)
from pandas_datareader import data as pdr
pandas_datareaderについて
世界人口や経済指標、株価データなどを取得できる
スクレイピングのことを何も知らなくても、1行のコードでデータを取得できてしまう便利なもの(怖いっちゃ怖い?)
2、株価のスクレイピングとエクセルへの入出力
内容
取得したい株価のコードを指定、日経平均とソフトバンクGのコードを入力、Yahoo FinanceのWebサイト(アメリカ)から株価のコードを調べる
code = ['^N225','9984.T']
データの取得開始と終了を指定、終了を今日の日付とし、その180日前からのデータを取得する
s = datetime.datetime.now() - datetime.timedelta(days=180)
e = datetime.date.today()
Dateresderの書式(サイトに合わせた株価のコード、データの取得サイト、取得開始日、終了日)
取得したデータをデータフレーム(2次元配列)に入れる
データフレームは縦と横の配列なのでそのままエクセルに変換できる
df = pdr.DataReader(code,'yahoo',s,e)
確認のため、データフレームの先頭5行を出力(必要ではない)
print(df.head(5))
エクセルに出力する書式、エクセルファイルがなければ、新規作成になる
ファイルの作成はプログラムと同じディレクトリになる
df.to_excel('エクセルのパス')
Excelワークブック・シート読込
なんか、2度手間感があるが、エクセルを保存してそれをもう一度ロードする
openpyxlはエクセルデータを扱うため、ロードが必要かな?と判断
今回はエクセル上にグラフを出力することを目標にしている
エクセルファイルをロード
wb = openpyxl.load_workbook(エクセルのパス)
book作成と同時にシートが1つできるので、ワークシートをロード
今回は保存したデータをそのまま取り出す
[0]はインデックス番号で0番目、1番最初のシートのこと
ws = wb.worksheets[0]
取得したシートの名前を変更
ws.title = '株価'
グラフを書くシートを新規作成、('名前')でシートの名前を指定
gs = wb.create_chartsheet('グラフ')
※chartsheetはグラフシートのこと、普通の表のシートも作れる
3、エクセルデータからグラフ範囲を指定し、グラフを出力する
内容
エクセルの空いてるセルにタイトルを入力
ws["A3"] = "日付"
ws["B3"] = "日経平均[円]"
ws["C3"] = "ソフトバンクG[円]"
グラフ作成
oresen_gという、空のグラフデータを作成
タイトル、軸ラベルを設定する
oresen_g = openpyxl.chart.LineChart()
oresen_g.title = "株価グラフ"
oresen_g.y_axis.title = "日経平均" #Y軸
oresen_g.x_axis.title = "日付" #X軸
データの範囲設定
Y軸範囲 Reference(シート名、最小列、最小行、最大列、最大行を指定)
4行、2列目(B4)からデータの最終行、3列目の範囲を指定している
y_jiku = Reference(ws, min_col=2, min_row=4, max_col=3, max_row= ws.max_row)
add_data()でY軸のデータをグラフに入力
oresen_g.add_data(y_jiku)
X軸範囲
x_jiku = Reference(ws, min_col=1, min_row=4, max_col=1, max_row = ws.max_row)
set_categories()でX軸のデータをグラフに入力
oresen_g.set_categories(x_jiku)
add_chart()で、グラフを指定の場所に出力
gsは、最初に設定したグラフシート
gs.add_chart(oresen_g)
※通常シートならadd_chart(グラフデータ,'セル')で指定のセルにグラフを書く
保存
wb.save(エクセルのパス)
コード全体
import pandas as pd
import datetime
from pandas_datareader import data as pdr
import openpyxl
from openpyxl.chart import Reference
code = ['^N225','9984.T']
s = datetime.datetime.now() - datetime.timedelta(days=180)
e = datetime.date.today()
df = pdr.DataReader(code,'yahoo',s,e)
print(df.head(5))
df.to_excel('エクセルのパス')
wb = openpyxl.load_workbook('エクセルのパス')
ws = wb.worksheets[0]
ws.title = '株価'
gs = wb.create_chartsheet('グラフ')
ws["A3"] = "日付"
ws["B3"] = "日経平均[円]"
ws["C3"] = "ソフトバンクG[円]"
#グラフ作成
oresen_g = openpyxl.chart.LineChart() #グラフの種類 折れ線グラフ
oresen_g.title = "株価グラフ" #グラフのタイトル
oresen_g.y_axis.title = "日経平均" #y軸ラベル
oresen_g.x_axis.title = "日付"
#Y軸範囲
y_jiku = Reference(ws, min_col=2, min_row=4, max_col=3, max_row= ws.max_row)
oresen_g.add_data(y_jiku)
#X軸範囲
x_jiku = Reference(ws, min_col=1, min_row=4, max_col=1, max_row = ws.max_row)
oresen_g.set_categories(x_jiku)
gs.add_chart(oresen_g)
wb.save('エクセルのパス')