株価をscikit-learnで機械学習してみる　webアプリ化

（注）ここでは最終結果だけでなくエラーの試行錯誤も含めて書いていきます。
　　　また中途半端でもアップし後々更新することとします。

# 目的
以前行った[回帰分析](https://qiita.com/soshi8/items/4ed22872cf185ce421ea)をwebアプリ化してみます。

# web化の手法

pythonにはFlaskというフレームワークがあるため使ってみます。
Djangoという本格的なものもあるようですが、とりあえずはそこまでは必要ないとおもいますので。

## サンプルの実行

### フォルダ構成
![pic6.png](https://qiita-image-store.s3.amazonaws.com/0/248083/9c5d5de2-4a4e-fafb-802d-eed2508a1f40.png)


``` app_sample.py
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
    return render_template('first_app.html')
if __name__ == '__main__':
    app.run()
```

``` first_app.html
<!doctype html>
<html>
    <head>
        <tytle>First APP Tytle</tytle>
    </head>
    <body>
        <div>First App </div>
    </body>
</html>
```

### 結果
![pic4.png](https://qiita-image-store.s3.amazonaws.com/0/248083/7d8ed250-eb1d-3801-669f-c8c7a34a683b.png)


## 試算の実行

### フォルダ構成
![pic7.png](https://qiita-image-store.s3.amazonaws.com/0/248083/56e307b9-ba76-85c2-ecb2-977b24a9dadd.png)
input.htmlで入力させ、result.htmlに出力します。


最初にいつもの学習。

``` app.py
from flask import Flask, render_template,request
from sklearn.linear_model import LinearRegression
import pandas as pd
import numpy as np

stock_data = pd.read_csv('stockchart_201809xx.csv')
count_s =  len(stock_data)
owarine = stock_data['終値'].values.tolist()
successive_data = []
answers = []
for i in range(4, count_s):
    successive_data.append([owarine[i-4], owarine[i-3], owarine[i-2], owarine[i-1]])
    answers.append(owarine[i] )
reg = LinearRegression().fit(successive_data, answers)
```

input.htmlを呼ぶところ。

``` app.py
app = Flask(__name__)

@app.route('/')
def index():
    return render_template('input.html')
```

``` input.html（form部分のみ抜粋）
          <form action = "/result" method = "POST" class="form-group">
            <p>４日前<input type = "text" name = "bef4" class="form-group"/></p>
            <p>３日前<input type = "text" name = "bef3" class="form-group"/></p>
            <p>２日前<input type = "text" name = "bef2" class="form-group"/></p>
            <p>１日前<input type = "text" name = "bef1" class="form-group"/></p>
            <p><input  type = "submit" value = "submit" class="btn btn-default"/></p>
          </form>
```

``` app.py
@app.route('/result',methods = ['POST', 'GET'])
def result():
    if request.method == 'POST':
        try:
           val1 = float(request.form['bef4'])
        except ValueError:
           return "４日前の値が数字ではありません"

      （略）

        test_data = np.array([[val1,val2,val3,val4]])
        predicted = reg.predict(test_data)
        msg = str(predicted.tolist()[0]) + "円" 
        return render_template("result.html",val = msg)

if __name__ == '__main__':
    app.debug = True
    app.run()
```

``` result.html（body部分のみ抜粋）
    <body>
        <div>{{ val }} </div>
    </body>
```

index.htmlにはbootstrapを適用してみました。
http://～/resultにアクセスしたときの処理
（formの「action = "/result"」と合わせる）
「methods = ['POST', 'GET']」postでもgetでも受け付けるという意味。
floatで受け付けられるか判断し、okの場合のみ受け付け。
エラーの場合はリターンした内容が表示されます。

### 結果
![pic8.png](https://qiita-image-store.s3.amazonaws.com/0/248083/cf27a18a-5108-7a41-8e56-576df21cde24.png)
↓
![pic9.png](https://qiita-image-store.s3.amazonaws.com/0/248083/52b0e6a7-24db-72f8-7e2d-17ecc5d282c4.png)


### メモ
1) htmlはUTF-8で作成します。保存するときもです。  
 「unicodedecodeerror: 'utf-8' codec can't decode」というエラーになります。

2)app.debug = Trueとすることでエラーの時デバック画面を表示できます。
![pic5.png](https://qiita-image-store.s3.amazonaws.com/0/248083/e9609cb8-c962-63b3-bf4a-10d5a12e5f56.png)


## ソース
<a href="https://github.com/soshi8/finance3"><img src="https://qiita-image-store.s3.amazonaws.com/0/248083/ada61bf8-945e-2252-f7ee-a4560636410f.png" width="460px"></a> 
面白そうだったので以下の画像を使ってみました。
https://qiita.com/po3rin/items/eac851304cf058c532af