8
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

pythonで株価をスクレイピング→bigqueryに取込んでLookerで可視化してみた

Last updated at Posted at 2019-08-29

Lookerで株価を可視化してみました

データはpython使ってスクレイピングで取ってくる感じにしてます。
python使うならmatplotlib使えよ。的な話もあると思いますが、Lookerに可視化するのに必要な作業手順を一通り体験してみたかったので、やや興味本位(趣味)でやってますので、その辺はご理解よろしくお願いいたします。

利用ツール
google colab(python3)
bigquery
Looker

株価データの取得(スクレイピング)

・まずは可視化対象のデータ取得ですが、個人的にFFとかロマサガが好きなので、スクエニの株価を取得。
・スクレイピングのコードはこちらの記事を参考にさせていただきました。
http://www.stockdog.work/entry/2016/08/28/180911

import pandas
import datetime

def scraping_yahoo(code, start, end, term):
	base = "http://info.finance.yahoo.co.jp/history/?code={0}.T&{1}&{2}&tm={3}&p={4}"

	start = str(start)
	start = start.split("-")
	start = "sy={0}&sm={1}&sd={2}".format(start[0], start[1], start[2])
	end = str(end)
	end = end.split("-")
	end = "ey={0}&em={1}&ed={2}".format(end[0], end[1], end[2])
	page = 1

	result = []
	while True:
		url = base.format(code, start, end, term, page)
		df = pandas.read_html(url, header=0)
		if len(df[1]) == 0:
			break

		result.append(df[1])
		page += 1
	result = pandas.concat(result)
	result.columns = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Close']

	return result

if __name__ == "__main__":
### 取得したい株価のコードを指定する(ここを変更):9684はスクエニの株価コードです
	company = 9684

	EndDate = datetime.date.today()
	StartDate = EndDate - datetime.timedelta(days=180)  ## ここで何日分のデータ取得するかを指定

	data = scraping_yahoo(company, StartDate, EndDate, "d")
	print(data)

実行結果

スクエニの直近180日分の株価を取得してきました。

株価スクレイピング結果1.PNG

DBに取込む為のレイアウトの変換と、7日移動平均の項目追加

・スクレイピングしたデータをそのままbigqueryに突っ込んでみたら、日付がうまくソートできない形式だったり、インデックスの並びが微妙だった為、いい感じに取込めるように変換してます。せっかくなので7日移動平均も追加。

## スクレイピングしたデータを一時退避
df = data

## 日付項目をソートできるようにフォーマット変換
df['Date'] = pd.to_datetime(df['Date'], format='%Y年%m月%d日')

## adj CloseをDBに項目取り込みする為、スペース情報を_に変更
df = df.rename(columns={'Adj Close': 'Adj_Close'})

## 銘柄コードを追加
df['bond_cd'] = company

## 移動平均算出の為、Date順にソートする
df = df.sort_values(by=["Date"], ascending=True)

## 7日移動平均を算出して追加
df['avg_7day_Close'] = df["Close"].rolling(window=7).mean()

## indexをDateに変更
df.set_index("Date",inplace=True)

## 内容確認
df

実行結果

株価スクレイピング結果2

データ定義を確認

df.dtypes

実行結果

Date はインデックスにしたので、ここでは表示されませんがCSVにするとひょっこり出てくるので大丈夫。
株価スクレイピング結果3.PNG

いちおう、matplotlibで株価データを時系列で可視化

df['Close'].plot(legend=True, grid=True)

実行結果

・直近で、結構株価上がってました。
ググったら2019年4-6月期の連結営業利益は前年同期比85.8%増と好調だったみたいで調子よいみたいです。
株価スクレイピング結果4.PNG

CSVにダウンロード(google colabからローカルへ)

## CSV出力
from google.colab import files
filename = "bond.csv"
df.to_csv(filename) 
files.download(filename) 

CSVをBigqueryへ

ここら辺の手順は**こちら**を参考にし、bondというテーブルを作成しました。

bigqueryのテーブルをLookerへ反映(LookMLを自動生成する)

・Lookerを開いて、開発用のDevelopment Modeに切り替える
株価スクレイピングlooker作成1.PNG

・ProjectのViewsにbigqueryのテーブルを追加してLookMLを生成
株価スクレイピングlooker作成2.PNG
株価スクレイピングlooker作成3.PNG
株価スクレイピングlooker作成4.PNG

自動生成されたLookML

view: bond {
  sql_table_name: sample_analysis_looker.bond ;;

  dimension: adj_close {
    type: number
    sql: ${TABLE}.Adj_Close ;;
  }

  dimension: avg_7day_close {
    type: number
    sql: ${TABLE}.avg_7day_Close ;;
  }

  dimension: bond_cd {
    type: number
    sql: ${TABLE}.bond_cd ;;
  }

  dimension: close {
    type: number
    sql: ${TABLE}.Close ;;
  }

  dimension_group: date {
    type: time
    timeframes: [
      raw,
      date,
      week,
      month,
      quarter,
      year
    ]
    convert_tz: no
    datatype: date
    sql: ${TABLE}.[Date] ;;
  }

  dimension: high {
    type: number
    sql: ${TABLE}.High ;;
  }

  dimension: low {
    type: number
    sql: ${TABLE}.Low ;;
  }

  dimension: open {
    type: number
    sql: ${TABLE}.Open ;;
  }

  dimension: volume {
    type: number
    sql: ${TABLE}.Volume ;;
  }

  measure: count {
    type: count
    approximate_threshold: 100000
    drill_fields: []
  }
}

LookMLの修正その1:描画用にmeasure項目を追加

・Lookerのお作法的なものですが、LookMLの自動生成では、数値項目でもmeasureではなくdimensionとして認識されます。そのため、グラフなどに描画したい情報の場合、以下のようにmeasure項目として追加する必要があります。詳細は**こちら**

### 追加コード
  measure: avg_7day_close_sum {
    type: sum
    sql: ${TABLE}.avg_7day_Close ;; ### 7日移動平均
  }
  
  measure: close_sum {
    type: sum
    sql: ${TABLE}.Close ;; ### 当日終値
  }
  
  measure: volume_sum {
    type: sum
    sql: ${TABLE}.Volume ;; ### 当日出来高
  }

LookMLの修正その2:日付け項目の修正対応

・こちらもLookML使うときのお作法です。テーブルの日付項目名に一定の文字列があると、自動で[]がつけられますが、bigqueryでは項目名に[]をつけると現時点ではエラーとなる為、コードの手直しが必要。詳細は**こちら**

  dimension_group: Date {
    type: time
    timeframes: [
      raw,
      date,
      week,
      month,
      quarter,
      year
    ]
    convert_tz: no
    datatype: date
    sql: ${TABLE}.[Date] ;;  ### ここの[Date]というところはbigqueryでエラーになる
  }

### ↓ 上記を以下のように変更
  dimension_group: Date{
    type: time
    timeframes: [
      raw,
      date,
      week,
      month,
      quarter,
      year
    ]
    convert_tz: no
    datatype: date
    sql: ${TABLE}.Date ;;  ### 修正箇所:[Date] → Date に変更する
  }

Lookerで株価を可視化

dimension日付/Dateを選択
measure7日移動平均/avg_7day_close_sum当日終値/close_sum当日出来高/volume_sumの3つを選択
・株価データは土日祝のデータがない為、DateNULLを除外→やり方は**こちら**
当日出来高/volume_sumは2軸にする→やり方は**こちら**

株価可視化looker2.PNG

まとめ

・サクッと可視化したいなら、colab上でmatplotlibなどを使う方が楽。
・LookMLでカスタマイズがしやすそうだが、お作法的な対処が必要なので慣れが必要。
・LookMLで分析軸を増やして、Lookerのフィルタに追加可能なので、一度作ってしまえば、分析担当者でなくてもいろいろ分析出来る可能性があるので、分析の民主化的な体制を作りたい企業には良さそう。

8
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?