Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

目的

以前行った回帰分析を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

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

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

ソース

https://github.com/soshi8/finance2/blob/master/PythonTK.py

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

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

soshi8
現コボラーだけどブロックチェーンとかAIなんかに手を出すような無謀な行為に挑戦中。 いくつかの株主総会にも出没、システム関連の質問をしていたりしています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした