Проблема в расчете для кнопки калькулятора
У меня возникает ошибка при запуске в калькаляторе рассчета из 4-х параметров одного ошибка следующего плана setting an array element with a sequence Код калькулятор представлен ниже рассчет производится с помощью модели полученной с помощью машинного обучения
import math
import pickle
import tkinter
from tkinter import *
import pandas as pd
import sklearn
from sklearn.ensemble import GradientBoostingRegressor
def solver():
filename = 'finalized_model_gradient_boosting.sav'
loaded_model_gb = pickle.load(open(filename, 'rb'))
res = loaded_model_gb.predict(df)
print(res)
#Поле очистки информации вывода
def clear(event):
caller =event.widget
caller.delete("0","end")
#Функция удаления информации из поля ввода
def delete():
a.delete(5,'end')
d.delete(5,'end')
b.delete(5,'end')
c.delete(5,'end')
f.delete(5,'end')
#Функция вставки информации
def inserter(value):
e.delete("0.0","end")
e.insert("0.0",value)
def handler():
try:
calc_a_val =float(a.get())
calc_d_val =float(d.get())
calc_b_val =float(b.get())
calc_c_val = float(c.get())
calc_f_val =float(f.get())
inserter(solver(calc_a_val,calc_d_val,calc_b_val,calc_c_val,calc_f_val))
except ValueError:
inserter('Данные не введены')
root = Tk()
root.title("E")
root.geometry('840x440+300+200')
root.resizable(False, False)
text_a = Label(root,text="A:")
text_b = Label(root,text="B:")
text_c = Label(root,text="C:")
text_d = Label(root,text="D:")
text_e = Label(root,text="E")
text_f = Label(root,text="f")
text_F = Label(root,text="F")
text_a.pack()
text_a.grid(row=0,column=0)
a = Entry(root,justify=tkinter.CENTER,font=('Arial',12))
a.bind("<FocusIn>",clear)
a.grid(row=0,column=1)
b = Entry(root,justify=tkinter.CENTER,font=('Arial',12))
b.bind("<FocusIn>",clear)
text_b.grid(row=1,column=0)
b.grid(row=1,column=1)
c = Entry(root,justify=tkinter.CENTER,font=('Arial',12))
c.bind("<FocusIn>",clear)
text_c.grid(row=2,column=0)
c.grid(row=2,column=1)
d = Entry(root,justify=tkinter.CENTER,font=('Arial',12))
d.bind("<FocusIn>",clear)
text_d.grid(row=3,column=0)
d.grid(row=3,column=1)
#поле вывода
e = Text(root,font=('Arial',12),width=15,height=5)
text_e.grid(row=2,column=9)
e.grid(row=2,column=10)
f = Entry(root,justify=tkinter.CENTER,font=('Arial',12))
f.bind("<FocusIn>",clear)
f.grid(row=4,column=1)
text_f.grid(row=4,column=0)
text_F.grid(row=4,column=9)
but = Button(root,text='Вычислить',command=solver).grid(row=12,column=12,padx=(10,0))
root.grid_columnconfigure(0,minsize=120)
root.grid_columnconfigure(2,minsize=60)
root.grid_rowconfigure(0,minsize=60)
root.grid_rowconfigure(1,minsize=60)
root.grid_rowconfigure(2,minsize=60)
root.grid_rowconfigure(3,minsize=60)
root.grid_rowconfigure(4,minsize=60)
but = Button(root,text='Очистить',command=delete).grid(row=11,column=12,padx=(10,0))
data = {"A":[a], "B":[b],"C":[c],"D":[d]}
df = pd.DataFrame(data)
print(df)
root.mainloop()
Это основная часть кода сверху а вот выдает такую ошибку. У меня сделано визуализация калькулятора следующего плана где нужно делать расчет параметра зная другие 4 , так как для выполнения расчетов используется модель, которая считалась с помощью машинного обучения вот такая ошибка выводится:
TypeError: float() argument must be a string or a number, not 'Entry'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\ProgramData\Anaconda3\lib\tkinter\__init__.py", line 1892, in __call__
return self.func(*args)
File "<ipython-input-6-2ed72ab92efd>", line 13, in solver
res = loaded_model_gb.predict(df)
File "C:\ProgramData\Anaconda3\lib\site-packages\sklearn\ensemble\_gb.py", line 1650, in predict
X = check_array(X, dtype=DTYPE, order="C", accept_sparse='csr')
File "C:\ProgramData\Anaconda3\lib\site-packages\sklearn\utils\validation.py", line 63, in inner_f
return f(*args, **kwargs)
File "C:\ProgramData\Anaconda3\lib\site-packages\sklearn\utils\validation.py", line 616, in check_array
array = np.asarray(array, order=order, dtype=dtype)
File "C:\ProgramData\Anaconda3\lib\site-packages\numpy\core\_asarray.py", line 102, in asarray
return array(a, dtype, copy=False, order=order)
File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py", line 1899, in __array__
return np.asarray(self._values, dtype=dtype)
File "C:\ProgramData\Anaconda3\lib\site-packages\numpy\core\_asarray.py", line 102, in asarray
return array(a, dtype, copy=False, order=order)
ValueError: setting an array element with a sequence.
Как исправить ошибку, чтобы можно было вводить данные в калькуляторе и происходил расчет параметра?
Исправил как сказали в ответе:
data = {
"A":[float(a.get())],
"B":[float(b.get())],
"C":[float(c.get())],
"D":[float(d.get())]
Далее стало выдовать ошибку, что не может преобразовать string во float could not convert string to float: ''
Ответы (1 шт):
Думаю проблема тут:
data = {"A":[a], "B":[b],"C":[c],"D":[d]}
df = pd.DataFrame(data)
В словаре есть переменные, типа a, что содержат ссылки на tk.Entry, а pandas умеет работать с базовыми типами, это объясняет ошибку:
TypeError: float() argument must be a string or a number, not 'Entry'
Думаю, если вы возьмете значения из переменных, то проблема будет решена:
data = {
"A": [float(a.get())],
"B": [float(b.get())],
"C": [float(c.get())],
"D": [float(d.get())]
}