import tkinter as tk
import pandas as pd
import numpy as np
from tkinter import *
from tkinter import filedialog
from sklearn import preprocessing
import matplotlib.pyplot as plt
from pyecharts.charts import Pie
from pyecharts.charts import Bar
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg as FigureCanvas
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.figure import Figure

# 定义一个名为 DataPreprocessor 的类
class DataPreprocessor:
    # 类的初始化方法,接收一个参数 master
    def __init__(self, master):
        self.master = master
        self.data = None
        self.X_train = None
        self.X_test = None
        self.y_train = None
        self.y_test = None
        self.clf = None

        # 窗口布局,包括导入数据和训练模型按钮、绘图类型下拉菜单和绘图按钮
        self.load_data_button = tk.Button(master, text='导入数据', command=self.load_data)
        self.load_data_button.place(relx=0.1, rely=0.2, relwidth=0.3, relheight=0.1)

        self.train_button = tk.Button(master, text='训练模型', command=self.train_model)
        self.train_button.place(relx=0.4, rely=0.2, relwidth=0.3, relheight=0.1)


        self.plot_type = tk.StringVar()  # 创建一个变量,用于存储当前选中的图像类型
        self.plot_type.set('请选择图像类型')  # 设置默认值
        self.plot_menu = tk.OptionMenu(master, self.plot_type, '直方图', '饼图', '箱线图')
        self.plot_menu.configure(width=20)
        self.plot_menu.place(relx=0.6, rely=0.3, relwidth=0.3, relheight=0.1)

        self.plot_button = tk.Button(master, text='绘制图像', command=self.plot)
        self.plot_button.place(relx=0.6, rely=0.8, relwidth=0.3, relheight=0.1)

    # 绘制图像方法,根据选择的图像类型绘制对应的图像
    def plot(self):
        plot_type = self.plot_type.get()
        if plot_type == '请选择图像类型':
            tk.messagebox.showwarning(title='Warning', message='请选择图像类型!')
            return
        elif plot_type == '直方图':
            self.histogram()
        elif plot_type == '饼图':
            self.pie_chart()
        elif plot_type == '箱线图':
            self.box_plot()
    
    # 加载数据方法,使用 Pandas 库中的 read_csv() 方法读取 CSV 格式的数据文件
    def load_data(self):
        filename = filedialog.askopenfilename(initialdir='./data', title='Select file', filetypes=(('CSV files', '*.csv'),))
        if not filename:
            return
        self.data = pd.read_csv(filename)
        tk.messagebox.showinfo(title='Info', message=f'成功导入 {self.data.shape[0]} 条数据!')

        # 划分训练集和测试集,使用 scikit-learn 库中的 train_test_split() 方法
        self.X_train, self.X_test, self.y_train, self.y_test = train_test_split(self.data.iloc[:, :-1], self.data.iloc[:, -1], test_size=0.3)
        tk.messagebox.showinfo(title='Info', message=f'成功划分训练集和测试集!')


    # 绘制直方图方法,使用 Matplotlib 库绘制直方图
    def histogram(self):
        # 检查是否已经完成数据导入、划分训练集和测试集、训练模型等操作
        if not hasattr(self, 'X_train') or not hasattr(self, 'X_test') or not hasattr(self, 'y_train') or not hasattr(self, 'y_test') or not self.clf:
            tk.messagebox.showwarning(title='Warning', message='请先导入数据集并划分训练集和测试集,再训练模型!')
            return

        # 绘制直方图
        fig, ax = plt.subplots()
        ax.hist(self.X_train.iloc[:, 0], bins=20)
        ax.set_xlabel('Feature 1')
        ax.set_ylabel('Count')
        ax.set_title('Histogram')
        histogram_window = tk.Toplevel(self.master)
        canvas = FigureCanvasTkAgg(fig, master=histogram_window)
        canvas.draw()
        canvas.get_tk_widget().pack()
        toolbar = NavigationToolbar2Tk(canvas, histogram_window)
        toolbar.update()
        canvas.get_tk_widget().pack()

    # 绘制饼图方法,使用 Pyecharts 库绘制饼图
    def pie_chart(self):
        if not hasattr(self, 'X_train') or not hasattr(self, 'X_test') or not hasattr(self, 'y_train') or not hasattr(self, 'y_test') or not self.clf:
            tk.messagebox.showwarning(title='Warning', message='请先导入数据集并划分训练集和测试集,再训练模型!')
            return
        # 统计不同类别的样本数量
        counts = self.data['species'].value_counts()

        # 创建饼状图
        self.fig = Figure(figsize=(5, 4), dpi=100)
        self.fig.add_subplot(111).pie(counts, labels=counts.index, autopct='%1.1f%%')

        # 在窗口中显示饼状图
        self.canvas = FigureCanvasTkAgg(self.fig, master=self.master)
        self.canvas.draw()
        self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)

    # 绘制箱线图方法,使用 Matplotlib 库绘制箱线图
    def box_plot(self):
        # 检查是否已经完成数据导入、划分训练集和测试集、训练模型等操作
        if not hasattr(self, 'X_train') or not hasattr(self, 'X_test') or not hasattr(self, 'y_train') or not hasattr(self, 'y_test') or not self.clf:
            tk.messagebox.showwarning(title='Warning', message='请先导入数据集并划分训练集和测试集,再训练模型!')
            return

        # 绘制箱线图,用于展示特征的分布情况
        fig, ax = plt.subplots()
        box_data = pd.concat([self.X_train, self.X_test], axis=1)
        box_data.columns = [f'Feature {i}' for i in range(1, box_data.shape[1]+1)]
        box_data.plot(kind='box', ax=ax)
        ax.set_title('Box plot')
        box_window = tk.Toplevel(self.master)
        canvas = FigureCanvasTkAgg(fig, master=box_window)
        canvas.draw()
        canvas.get_tk_widget().pack()
        toolbar = NavigationToolbar2Tk(canvas, box_window)
        toolbar.update()
        canvas.get_tk_widget().pack()

    # 训练模型方法,使用 scikit-learn 库中的 RandomForestClassifier() 方法训练随机森林模型
    def train_model(self):
        # 检查是否已经完成数据导入、划分训练集和测试集等操作
        if not hasattr(self, 'X_train') or not hasattr(self, 'X_test') or not hasattr(self, 'y_train') or not hasattr(self, 'y_test'):
            tk.messagebox.showwarning(title='Warning', message='请先导入数据集并划分训练集和测试集!')
            return

        # 训练模型,这里使用 scikit-learn 库中的 RandomForestClassifier() 方法
        self.clf = RandomForestClassifier(n_estimators=10, max_depth=5)
        self.clf.fit(self.X_train, self.y_train)
        tk.messagebox.showinfo(title='Info', message='成功训练模型!')

# 主程序入口
if __name__ == '__main__':
    root = tk.Tk()
    root.geometry('600x400')
    app = DataPreprocessor(root)
    root.mainloop()
数据预处理工具:导入数据、训练模型和绘制图表

原文地址: https://www.cveoy.top/t/topic/orfr 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录