LoginSignup
4
8

More than 5 years have passed since last update.

株価をscikit-learnで機械学習してみる GUI化

Last updated at Posted at 2018-11-18

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

目的

以前行った回帰分析をGUI化してみます。

GUI化方法

ライブラリ

ググってみるとtkinterというツールがあるようなので試してみます。

開発環境

今まではjupyterで開発していましたが、Spiderに変えます。

jupyterは使いやすいのですが、各セル単位で文法チェックしてしまうため

後に書いておくものがチェック対象にならずエラーとなるのが面倒と考えたためです。

作ってみる

とりあえず画面を作ってみます。

import tkinter 

root = tkinter.Tk()
root.title(u'My First App')
root.geometry("600x450")
root.mainloop()

app1.png

意外と簡単そうですねえ。
では入力欄を作成します。

label1 = tkinter.Label(text=u'4営業日前:',font=8)
label1.pack()
label2 = tkinter.Label(text=u'3営業日前:',font=8)
label2.pack()
label3 = tkinter.Label(text=u'2営業日前:',font=8)
label3.pack()
label4 = tkinter.Label(text=u'1営業日前:',font=8)
label4.pack()
label5 = tkinter.Label(text=u'予想結果:',font=8)
label5.pack()
label6 = tkinter.Label(text=u'xxxxx円',font=8)
label6.pack()

Entry1 = tkinter.Entry(font=8)
Entry1.pack()
Entry2 = tkinter.Entry(font=8)
Entry2.pack()
Entry3 = tkinter.Entry(font=8)
Entry3.pack()
Entry4 = tkinter.Entry(font=8)
Entry4.pack()

app2.png

かっこ悪い・・・

packではなくplaceとすることで位置決めできるみたいなので変えてみます。

ただし画面の大きさに応じてみたいなことができなくなってしまうようなので一長一短ですが。

label1 = tkinter.Label(text=u'4営業日前:',font=8)
label1.place(x=50,y=50)
(略)
Entry4 = tkinter.Entry(font=8)
Entry4.place(x=200,y=200)

app3.png
これなら見れますね。

ボタン追加します。押したときにcalcNikkeiで計算させます。

Button1 = tkinter.Button(text=u'予測します。', font=8)
Button1.bind("<Button-1>", calcNikkei)
Button1.place(x=100,y=300)
root.bind('<Return>', calcNikkei) 

Button1.bind("", calcNikkei)

bindについて解説

- 1つ目:"":対象行為。これは左クリック。 「Button-2」真ん中クリック、「Button-3」は右クリック C++、VBなどではOnClick()イベントみたいなイメージ
- 2つ目:calcNikkeiがよびだす関数。

root.bind('', calcNikkei)

- これはroot画面でリターンキーを押したときcalcNikkeiを実行

- C++、VBなどではButton1のdefault=trueのようなイメージ。  

値の読み取り

floatでないといけないのでチェックが必要です。

さてチェックし方ですかpythonではgotoで飛ばせそうもないのでtry-catchで対応します。

retをTrueで初期化し、Falseとしエラーの場合にメッセージ表示させます。

    ret = True
    if ret:
        try:
            val1 = float(Entry1.get())
        except ValueError:
            msg.showerror(title = '4日前のエラー', message = u'4日前の値が数字ではありません')
            ret = False

この調子で入力欄4まで判定します。

ここまでで1つでもエラーの場合はretはFalseになっていますので計算結果は表示しません。Trueの場合のみ入力欄1~4の値で計算します。

    if ret:
        test_data = np.array([[val1,val2,val3,val4]])
        predicted = reg.predict(test_data)
        label6["text"] = str(predicted.tolist()[0]) + "円"        
    else:    
        label6["text"] = "xxxxx円"

実行してみた結果
app4.png

クリアボタン、終了ボタン等も作成しています。

メニューバー等を作ってみたいですね。

ソース

とりあえず並べただけのソースです。
画面作成部分はクラス化できそうですかね。

学習データも選択できるようにできれば。

4
8
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
4
8