一 流程图
二 代码
1 导入库和读取Excel文件(图1)
2 根据球员姓名搜索数据和比较两位球员的数据(图2)
1. `search_by_name(name)`: 这个函数接受一个球员的名字作为参数,并在数据中搜索该球员的数据。它首先将球员名字转换为小写形式,然后在数据中搜索与该名字匹配的记录。最后,它返回包含匹配记录的 DataFrame。
2. `compare_two_people(person1, person2)`: 这个函数用于比较两位球员的数据。它首先调用 `search_by_name` 函数来获取两位球员的数据。如果任一球员的数据为空(即找不到),则返回 `None`。否则,返回包含两位球员数据的元组 `(data_person1, data_person2)`。
3 绘制数据对比图(图3)
这段代码定义了一个名为 `plot_data` 的函数,该函数接受两个参数 `data_person1` 和 `data_person2`,这两个参数应该是 Pandas DataFrame 类型的数据,用于包含两个人的比较数据。
在函数内部,它定义了一个标签列表 `labels`,包含了要绘制的比较项的名称。然后,它从每个人的数据中提取了第一行(假设这一行包含了完整的数据)中包含这些标签的值,存储在 `values_person1` 和 `values_person2` 中。
4 检测是否包含 '%' 符号,进行相应的转换和其他列转换为浮点数(图4)
这段代码看起来是在对一些数据进行处理,将特定列中包含百分号的值转换为浮点数。然后,它将其他列的值都转换为浮点数。
在第一个循环中,它遍历了包含 `'投篮命中率', '三分命中率', '罚球命中率'` 标签的列,并检查是否包含 '%' 符号。如果包含,它会将这些值去除百分号并转换为浮点数。接着,在第二个循环中,它遍历了所有列,并将除了前面提到的三个列外的所有列的值都转换为浮点数。
这样的处理通常用于在数据分析或可视化之前,确保数据的格式是一致的,并且可以被正确地解析和处理。
5 绘制两位球员数据比较的柱状图(图5)
这里使用了 Matplotlib 库。首先,`x` 是一个范围对象,表示了柱子在 x 轴上的位置。`width` 则是每个柱子的宽度。接着,通过 `plt.subplots` 创建了一个大小为 (10, 6) 的图形。
- 使用 `ax.bar` 函数在图形上创建了两组柱状图,分别代表两位球员的数据,`rects1` 和 `rects2` 分别表示这两组柱状图的返回对象。
- 设置了 y 轴标签 (`'数值'`)、图表标题 (`'两位球员数据比较'`)、以及 x 轴的刻度和标签。
- 使用了 `ax.legend()` 添加了图例,其中的标签来自于 `name_entry.get()` 和 `other_name_entry.get()`,这两者可能是用户输入的球员名字。
- 最后,使用 `plt.rcParams` 来设置中文显示和解决负号显示问题,并通过 `plt.show()` 显示图形。
6搜索按钮点击事件处理函数和比较按钮点击事件处理函数
1. `search_button_clicked()`:当搜索按钮被点击时,该函数获取输入的球员名字,然后调用 `search_by_name` 函数搜索与该名字相关的数据。如果找不到相关数据,则在结果标签 `result_label` 中显示相应的提示信息;否则,显示与球员名字相关的数据。
2. `compare_button_clicked()`:当比较按钮被点击时,该函数获取输入的两个球员名字,然后调用 `compare_two_people` 函数比较这两个球员的数据。如果成功比较到了数据,则调用 `plot_data` 函数绘制比较图表;如果找不到相关数据,则在结果标签中显示相应的提示信息。
3. `display_data(data_to_display)`:该函数用于显示数据。它首先定义了每页显示的行数,并计算出数据需要分成几页。然后,通过循环遍历每一页的数据,并利用切片操作 `iloc` 获取当前页的数据,最后将其打印输出。
7 创建了一个简单的GUI界面,用于进行NBA球员搜索和比较。(图8)
首先创建了一个 `Tk()` 对象,即主窗口,标题设置为 "NBA 球员搜索"。
接着创建了姓名输入框 `name_entry` 和搜索按钮 `search_button`,分别用于输入要搜索的球员名字和执行搜索操作。
然后创建了另一个姓名输入框 `other_name_entry` 和比较按钮 `compare_button`,分别用于输入另一个球员的名字和执行比较操作。
最后创建了一个结果标签 `result_label`,用于显示搜索结果或比较结果。
这些组件通过 `grid()` 方法进行布局,指定了它们在网格中的行列位置以及一些间距参数。并且通过 `command` 参数指定了按钮点击时对应的处理函数。
最后调用 `root.mainloop()` 进入事件循环,等待用户交互。