Pythonのデータ可視化ツールである「Dash」を活用して、株価を時系列に表示するWebアプリケーションを作成します。
ここでは、「DatePickerRange」を導入して、カレンダーから日付を選択できる様にします。
以下の記事を前提として進めますので、まだの方はこちらを読んで下さい。
完成品(株価を時系列に表示するアプリ)
- 株価を時系列に表示するダッシュボードを作成します
- 株式シンボルと期間を選択するとグラフが表示されます
- 株式シンボルをクリックする事で非表示・表示を切り替えられます
pandas-datareaderでデータ取得し、Dashで表示
それでは、早速以下のコードをJupyter Notebookで実行してみましょう。
# 必要なモジュールのインポート import dash import dash_core_components as dcc import dash_html_components as html from dash.dependencies import Input, Output import pandas_datareader.data as web from datetime import datetime # Dashアプリケーションを作成 app = dash.Dash() # ヘッダー、ボックス、グラフを含むページを作成 app.layout = html.Div([ html.H1('Stock Ticker Dashboard'), html.Div([ html.H3('Enter a stock symbol:'), dcc.Input( id ='my_ticker_symbol', value='AAPL',# 初期値を設定 style={'fontSize':24, 'width':75} #スタイルを追加 ) ],style={'display':'inline-block','verticalAlign':'top'}), #DatePickerの追加 html.Div([ html.H3('Select a start and end data:'), dcc.DatePickerRange(id='my_date_picker', min_date_allowed = datetime(2015,1,1), max_date_allowed = datetime.today(), start_date = datetime(2019,1,1), end_date= datetime.today() ) ],style={'display':'inline-block'}), dcc.Graph(id='my_graph', figure={ 'data': [ {'x': [1,2], 'y': [3,1]} ] } ) ]) # コールバック関数の追加 @app.callback( Output('my_graph', 'figure'), [Input('my_ticker_symbol', 'value'), Input('my_date_picker', 'start_date'), Input('my_date_picker', 'end_date')]) def update_graph(stock_ticker, start_date, end_date): # スタート日とエンド日の定義 start = datetime.strptime(start_date[:10], '%Y-%m-%d') end = datetime.strptime(end_date[:10], '%Y-%m-%d') # DataReaderで接続し、Dataframeに格納(df) df = web.DataReader(stock_ticker,'iex',start,end) fig = { 'data': [ # dfをアウトプット {'x': df.index, 'y': df.close} ], 'layout': {'title':stock_ticker} } return fig # サーバーを起動 if __name__ == '__main__': app.run_server()
実行結果
日付をカレンダーから選択すると、アップデートした期間で株価が表示されます。
なお、テキストボックスに銘柄(ティッカー)を入力すると、銘柄が変わる度にそれぞれの株価を取得する点は前回通りです。
解説
「Stock Symbol」入力ボックスのレイアウト追加
html.Div([ html.H3('Enter a stock symbol:'), dcc.Input( id ='my_ticker_symbol', value='AAPL',# 初期値を設定 style={'fontSize':24, 'width':75} #スタイルを追加 ) ],style={'display':'inline-block','verticalAlign':'top'}),
「Stock Symbol」の入力ボックスをdivタグで囲み、フォントサイズといったスタイルを追加しています。
DatePickerRangeの追加
#DatePickerの追加 html.Div([ html.H3('Select a start and end data:'), dcc.DatePickerRange(id='my_date_picker', min_date_allowed = datetime(2015,1,1), max_date_allowed = datetime.today(), start_date = datetime(2019,1,1), end_date= datetime.today() ) ],style={'display':'inline-block'}),
日付をカレンダーから選択できる様に、「DatePickerRange」を追加しています。
「start_date」の初期値を「2019/1/1」とし、end_dateを「当日(datetime.today())」に設定します。
例えば、「2019/6/3」にプログラムを実行すると、「2019/1/1-2019/6/3」の期間で日付が設定されます。
また、「min_date_allowed」と「max_date_allowed」を設定する事で受け付け可能な最小・最大の日付を設定する事が可能です。
いずれも、’YYYY-MM-DD’の「String型」でデータを受け付けるため、datetime関数を使用します。
詳細は、公式ページをご覧下さい。
コールバック関数に日付レンジを追加
# コールバック関数の追加 @app.callback( Output('my_graph', 'figure'), [Input('my_ticker_symbol', 'value'), Input('my_date_picker', 'start_date'), Input('my_date_picker', 'end_date')])
「DatePickerRange」で選択した日付をリアルタイムに反映させるため、「start_date」と「end_date」をコールバック関数のInputに追加します。
pandas-datareaderで接続し、Dataframeに格納
def update_graph(stock_ticker, start_date, end_date): # スタート日とエンド日の定義 start = datetime.strptime(start_date[:10], '%Y-%m-%d') end = datetime.strptime(end_date[:10], '%Y-%m-%d') # DataReaderで接続し、Dataframeに格納(df) df = web.DataReader(stock_ticker,'iex',start,end)
The Investors Exchange (IEX) のデータに接続し、「stock_ticker(テキストボックスに入力された値)」について、「start」から「end」の期間でDatafremeの形でデータを取得しています。
「strptime関数」は文字列から日付・時間へ変換する関数です。
例えば、以下のコードを実行してみましょう。
from datetime import datetime before = '2019-06-05' print(type(before)) print(before) after = datetime.strptime(before, '%Y-%m-%d') print(type(after)) print(after)
実行結果
<class 'str'> 2019-06-05 <class 'datetime.datetime'> 2019-06-05 00:00:00
「before」では「str」クラスでしたが、「strptime」メソッドの結果datetimeオブジェクトに変換されています。
「start_date」と「end_date」が文字列で渡されるため、「strptime」メソッドを使用して変換しています。