Watson Studio CloudのJupyter Notebookジョブ実行。日経平均株価を毎日取得してDb2 on Cloudに保管

# はじめに
Jupyter Notebookは出力結果を確認しながら、試行錯誤でデータの分析を行うことができて便利です。
しかし、そのままで実行することが難しいため、定期的に実行したいような場合、いったん素のpythonのプログラム(.py)に書き直してから、スケジューラーから呼び出すという運用が一般的だと思います。

しかしながら、Watson StudioにはJupyter Notebookをそのままジョブとして実行できる機能があり、さらに簡単なスケジューラーもついているので定期的な自動実行も可能です。

分析業務には

- データの収集
- データの加工
- フィードバックデータによるモデルの評価

など日次などで定期的に自動実行したい処理がよくあります。

ここでは、日経平均株価を取得して、DBaaSのDb2 on Cloudに書き出すJupyter Notebookをジョブとして登録し、毎日最新のデータを保存していくことをやってみます。
オープンデータをAPIやスクレイピングによって定期的に取得してクラウドのDBに保存しておけば、自分のデータと組み合わせて分析したり、予測したりすることも容易になります。

# 事前準備
以下を参考にあらかじめWatson StudioとDb2 on Cloudを準備しておいてください。

無料でなんでも試せる! Watson Studioセットアップガイド - Qiita
https://qiita.com/makaishi2/items/b666f847a98c2e42dfbb

IBM Cloud で無償枠のDb2 on Cloudを使ってみる（パスワードの確認方法含む） - Qiita
https://qiita.com/Asuka_Saito/items/c40a17f02a588953f576

また、日経平均はQuandlからAPIで取得しますので、以下でサインアップしてAPIKEYを取得してください（一応、1日数回はAPIKEYがなくても取得できます）。
Financial, Economic and Alternative Data | Quandl 
https://www.quandl.com/

# 日経平均株価を取得してDb2に書き出すNotebook
Watson StudioのプロジェクトにNotebookを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/7db95860-bb59-fddd-ea3f-2ead60fd33e9.png)


URLからを選び名前をnikkei3とします。そしてNotebook URLに以下のURLを入力し、作成してください。
https://github.com/hkwd/200616WSCJobExecution/blob/master/nikkei3._pub.ipynb

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/938ace36-34b7-2d71-6e50-ec50394c615a.png)

いちばん最初のセルにdb2の資格情報とquandleのAPIKEYを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/5687544b-15c5-f092-7748-59ec0a72f6dd.png)

以下のコードで日経平均株価の過去5日分を取得しています。
CHRIS/CME_NK2が日経平均株価を示しています。
rows=5で最新5レコードを指定しています。

quandlからは株価や多くの経済指標などがAPIで入手できます。

``` python
#quandlから日経平均の過去5日分を取得
import quandl
import pandas as pd
import  matplotlib.pyplot as plt

quandl.ApiConfig.api_key = quandl_api_key
df = quandl.get("CHRIS/CME_NK2", rows=5)
```

参考：Quandl Python Module | Quandl 
https://www.quandl.com/tools/python

以下のコードでdb2に接続しています。ibmdbpyというパッケージを使っています。

```python

#DB接続
from ibmdbpy import IdaDataBase, IdaDataFrame

dsn = 'DASHDB;Database={};Hostname={};Port={};PROTOCOL=TCPIP;UID={};PWD={}'.format(
    credentials_db2['database'],
    credentials_db2['host'],
    credentials_db2['port'],
    credentials_db2['username'],
    credentials_db2['password']
)

idadb = IdaDataBase(dsn)
```
参考：Watson StudioのJupyter NotebookからDb2の表にデータ出力をする - Qiita https://qiita.com/tetsuya1969/items/867ae78132e969fd078a

なお、以下のコメントをとるとQuandlから取得したdata frameがCME_NK2という名前のDb2のテーブルとして保存されます。初回のみコメントをはずして実行し、テーブルを作ってください。

```python
#初回投入時にはテーブルを作成する
#ida_df=idadb.as_idadataframe(df1, 'CME_NK2', clear_existing = True, primary_key='DATE')
#idadb.commit
```

以下でQuandlで取得した5件がすでにDb2のテーブルにある場合は削除して、入れなおしています。
毎日自動で取得する想定なので、最後の1件だけをINSERTしてもよいのですが、何かの手違いで実行されなかったり、逆に二重実行したり、元データが万が一修正されたような場合にも対応できる想定でこのような取得方法にしました。

今回は日経平均株価を日次取得していますが、取得したいデータの発生頻度や提供形態などによって、収集蓄積方法は検討する必要があります。

```python
#重なるデータをテーブルから削除
dates=df.index
idadb.ida_query('DELETE FROM CME_NK2 WHERE DATE BETWEEN \'{}\' AND \'{}\''.format(dates.min(),dates.max()))

#取得したデータをINSERT
ida_df = IdaDataFrame(idadb, 'CME_NK2')
idadb.append(ida_df, df1)
idadb.commit
```

「#初回投入時にはテーブルを作成する」の2行がコメントアウトされていることを確認して、FileメニューからSave Versionをクリックしてバージョンを保存しておいてください。
のちほどジョブとして実行する場合にはバージョンを指定する必要があります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/5422ea46-ddff-4ce6-7bfe-f9e91ea174f0.png)

# ジョブの登録
プロジェクト名を選択し、ジョブのタブに移ります。そして、「新規ジョブ＋」のボタンをクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/0021fd5e-74c7-6aa9-24a6-c2b455c152a2.png)

ジョブ名を入力し、説明も何かわかりやすいものを入力します。そして、資産の選択をクリックしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/905a41cd-369c-7fc0-8a51-dc5f9131fef4.png)

先ほど作成したnikkei3のNotebookを選び、保存をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/bb7ddc68-928a-27e2-0c21-e427c500a42f.png)

実行をスケジュールを有効にし、繰り返しにチェックをいれ、毎日5:00に起動するように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/01d1457f-4fc5-728f-56fc-e3d95a3d5806.png)

これで毎日5:00にnikkei3のJuypterNotebookが起動して、自動的にDb2に日経平均株価を記録していくことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e79f9d53-5830-3888-3063-cb32e78d27ce.png)

自動実行されると以下のように実行履歴が記録されていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/87626c40-3ff7-b40d-1396-92ff349fe374.png)

ちなみにDb2にもデータが入っていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/06ea7e55-c1d7-92d6-f97e-7bca945152c6.png)

# おわりに
とても簡単にNotebookの自動実行ができるようになりました。試行錯誤して作ったNotebookをそのままバッチジョブにできるので効率よく分析システムが作成できることがお分かりいただけたかと思います。

ちなみにジョブを起動するときには、環境変数を与えて動きを変えることもできるので、様々な応用も可能です。

#参考
Quandl Python Module | Quandl <BR>https://www.quandl.com/tools/python

Pythonで株価情報を取得して、MySQLに格納する - Qiita <BR>https://qiita.com/ITNewcomer/items/513ef4504038b7f935ae

PythonでのCloud Pak for Dataのオブジェクト操作例 (WML client, project_lib) - Qiita <BR>https://qiita.com/ttsuzuku/items/eac3e4bedc020da93bc1#%E3%83%87%E3%83%BC%E3%82%BF%E8%B3%87%E7%94%A3%E3%81%B8%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E4%BF%9D%E5%AD%98-%E5%88%86%E6%9E%90%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88