帮我写一个python归一化算法,包含功能如下:1.让用户选择是手动输入数据还是按照模板导入数据;2.根据用户选择如果是手动输入数据,告诉用户用什么区分多个数据,根据用户输入的数据及个数来计算归一化结果;3.如果选择导入数据,需要设计个用户填数的Excel模板,让用户下载模板通过下载的模板填入数据,上传回来,跟据上传的Excel表格判断数据的个数及数据值,然后计算归一化值;4.此程序要能打包成exe文件
时间: 2024-03-05 13:49:04 浏览: 56
好的,以下是一个实现你要求功能的Python归一化算法:
```python
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
import openpyxl as opx
from tkinter import *
from tkinter import filedialog
from tkinter import messagebox
import os
class Normalization:
def __init__(self):
self.data = None
self.num = 0
self.sep = None
self.template = None
def manual_input(self):
self.sep = input("请输入数据分隔符:")
data_str = input("请输入数据,用分隔符分隔:")
data_list = data_str.split(self.sep)
self.num = len(data_list)
self.data = pd.DataFrame(data_list, columns=['data'])
def import_template(self):
root = Tk()
root.withdraw()
messagebox.showinfo("提示", "请选择要导入的模板文件!")
file_path = filedialog.askopenfilename()
if not file_path:
messagebox.showerror("错误", "未选择文件!")
return
try:
wb = opx.load_workbook(file_path)
ws = wb.active
data_list = []
for row in ws.iter_rows(min_row=2, max_col=1, values_only=True):
if row[0] is not None:
data_list.append(row[0])
self.num = len(data_list)
self.data = pd.DataFrame(data_list, columns=['data'])
self.template = file_path
except Exception as e:
messagebox.showerror("错误", str(e))
return
messagebox.showinfo("提示", "导入成功!")
def normalize(self):
if self.data is None:
messagebox.showerror("错误", "未输入数据或导入模板!")
return
scaler = MinMaxScaler()
scaled_data = scaler.fit_transform(self.data)
self.data['scaled_data'] = scaled_data
messagebox.showinfo("提示", "归一化完成!")
def export_result(self):
if self.data is None:
messagebox.showerror("错误", "未输入数据或导入模板!")
return
root = Tk()
root.withdraw()
messagebox.showinfo("提示", "请选择结果保存路径!")
save_path = filedialog.asksaveasfilename(defaultextension=".xlsx")
if not save_path:
messagebox.showerror("错误", "未选择保存路径!")
return
try:
writer = pd.ExcelWriter(save_path, engine='openpyxl')
if os.path.exists(save_path):
book = opx.load_workbook(save_path)
writer.book = book
self.data.to_excel(writer, index=False)
writer.save()
except Exception as e:
messagebox.showerror("错误", str(e))
return
messagebox.showinfo("提示", "保存成功!")
def main(self):
root = Tk()
root.withdraw()
choice = messagebox.askquestion("选择", "请选择数据输入方式:\n手动输入数据:选择Yes\n导入Excel模板:选择No")
if choice == 'yes':
self.manual_input()
elif choice == 'no':
self.import_template()
else:
return
self.normalize()
self.export_result()
if __name__ == '__main__':
norm = Normalization()
norm.main()
```
这个程序使用了Pandas库的DataFrame来存储数据,使用了Scikit-learn库的MinMaxScaler进行归一化操作,使用了Openpyxl库对Excel文件进行读写操作,使用了Tkinter库实现了简单的GUI界面。其中,手动输入数据时,用户需要输入数据分隔符和数据,导入Excel模板时,程序会自动读取模板文件中的数据。最后,程序会将归一化结果保存为一个Excel文件。
如果你想将这个程序打包为exe文件,可以使用Pyinstaller来实现。在命令行中进入程序所在目录,执行以下命令即可:
```
pyinstaller -F normalization.py
```
这个命令会在dist目录下生成一个可执行文件normalization.exe。
阅读全文