1

客观的:

我正在编写一个应用程序(使用 Tkinter、Python 3.0 - ubuntu)。事件触发是用户输入一个浮点数,用户按下一个按钮;然后 'calculate' 函数将 pandas 数据帧(由 .csv 制成)中的列与用户的输入进行比较。

它应该返回五行。

这些行由用户数字与使用 pandas 创建的函数的数据帧的特定列中的所有浮点数的接近度(接近度)确定。接下来,它应该从这 5 个返回的行中返回(一个 0f 列)的摘要统计信息。(注意: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:

以下行给了我五个“最接近”的行。错误是从这一行生成的:我将数据框的一列: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,所以在这种情况下可能是有道理的。无论如何,将一个复杂的语句分解为多个语句是尝试调试无法按照您的行为方式运行的代码的良好的第一步。将其分解后,您将更好地了解代码的哪一部分失败,并且您可以使用调试器或打印语句来显示中间值以验证您的假设。

于 2013-07-29T21:43:57.137 回答