1

目的:

私はアプリケーションを書いています(Tkinter、Python 3.0 - ubuntuを使用)。イベント トリガーは、ユーザーがフロートを入力し、ユーザーがボタンを押すことです。次に、「計算」関数は、パンダデータフレーム (.csv から作成) の列をユーザーの入力と比較します。

5 つの行が返されます。

これらの行は、関数が pandas を使用して作成したデータフレームの特定の列にあるすべてのフロートと比較したユーザーの番号の近接性 (近さ) によって決定されます。次に、返された 5 つの行から (列の 1 つ) の要約統計を返す必要があります。(注: 今のところ pandas の df.column.describe() で十分です)。

(差し迫った締め切りがあるので、思慮深い提案はすぐに良いカルマと即座の賛成票で満たされます)。:-)

エラー 1:

   **TypeError: unsupported operand type(s) for -: 'float' and 'instance'**

注1:

私はそれらがタイプされていないことを知っています-これに関する便利なハックはありますか?

コンパイラは、宣言された es_in=DoubleVar() のデータフレームと「インスタンス」からのフロートを考慮します。

Modification: Tkinter has no 'FloatVar()'. I cast float(es_in). It gives:

エラー 2:

  AttributeError: DoubleVar instance has no attribute '__float__'




import pandas as pd
from Tkinter import *
import ttk

def calculate(*args):
    try:
        df=pd.read_csv('master_pl.csv')

注2:

次の行は、5 つの「最も近い」行を示しています。エラーは次の行から生成されます: ここで、データフレームの列: df["ES"] を es_in というユーザー定義の入力と比較します。

        df.ix[(df["ES"][:]-es_in).abs().argsort()[:5]]

     except ValueError:
       pass


  <___calculate_function_ends_here___>
   # GUI code continues...


root = Tk()
root.title("Cluster Program")

mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)

ユーザー定義の入力は次のとおりです。

es_in = DoubleVar()

es_entry = ttk.Entry(mainframe, width=7)
es_entry.grid(column=2, row=1, sticky=(W, E))


ttk.Button(mainframe, text="Calculate", command=calculate).grid(column=3, row=3, sticky=W)

 ttk.Label(mainframe, text="ES").grid(column=3, row=1, sticky=W)
 ttk.Label(mainframe, text="output_fiveclosestrows").grid(column=3, row=2, sticky=W)



es_entry.focus()
root.bind('<Return>', calculate) 


<end>
4

1 に答える 1

0

私が正しく理解している場合、エラーはこのコードによって生成されます: df["ES"][:]-es_in、正しいですか?

es_inは DoubleVar のインスタンスです。つまり、値は値ではなくインスタンスであるため、その変数の値を直接使用することはできません。エラー メッセージが示しているとおりです。

では、DoubleVar から値を取得するにはどうすればよいでしょうか。getメソッドで。コードを次のように変更して、うまく機能するかどうかを確認します。

df.ix[(df["ES"][:]-es_in.get()).abs().argsort()[:5]]

es_in.get()ではなく、どこで使用されているかに注意してくださいes_in

もちろん、別の問題は、シーケンスから浮動小数点値を減算しているように見えますが、これは意味がありません。シーケンス内の各値からそれを減算しますか?

コードを複数の行に分割すると役立ちます。これにより、コードが理解しやすくなり、デバッグが容易になります。たとえば、コードを複数の行に分割すると、次のようになります。

diff = df["ES"][:]-es_in.get()
delta = diff.abs()
sorted = delta.argsort()
index = sorted[:5]
df.ix[index]

それは私には間違っているように見えますが、numpy や pandas を知らないので、そのコンテキストでは意味があるかもしれません。とにかく、複雑なステートメントを複数のステートメントに分割することは、動作しないコードをデバッグするための最初のステップとして適切です。分割した後、コードのどの部分が失敗しているかをよりよく理解できるようになり、デバッガーまたは print ステートメントを使用して中間値を表示し、仮定を検証することができます。

于 2013-07-29T21:43:57.137 に答える