使用PyQt实现实现一个腾讯会议参会情况统计工具。本工具主要完成以下功能: 1.加载按照模板格式编制的学生花名朋表格和腾旭会议考勤表,并显示表格详情: 2.对两个表格的数据进行交叉分析,采用花名册中的姓名逐个匹配考勒表的参会人员名称 (参会人员名称中须包含学生姓名): 3.对花名册中可能存在的重名情况进行检查。如果存在重名给出提示信息; 4.统计未参会学生,并计算参会率,在界面信息区进行显示 5.统计参会学生的参会总时长,并以柱状图显示。
时间: 2023-06-15 07:08:01 浏览: 272
基于PyQt5实现可视化自动标注工具可选择YOLOv5、YOLOv8或者自定义模型完整源码+数据.zip
5星 · 资源好评率100%
好的,这是一个比较复杂的项目,需要一步一步来实现。以下是我提供的思路和代码:
1. 加载并显示表格详情
首先需要使用PyQt中的QFileDialog组件来打开文件对话框,选择要加载的两个表格文件。然后使用pandas库来读取表格数据,将它们存储在两个pandas DataFrame对象中。
```python
import pandas as pd
from PyQt5.QtWidgets import QFileDialog
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
# ...
def load_files(self):
# 打开文件对话框选择花名册和考勤表格文件
fname_roster, _ = QFileDialog.getOpenFileName(self, '选择花名册文件', '', 'Excel Files (*.xls *.xlsx)')
fname_attendance, _ = QFileDialog.getOpenFileName(self, '选择考勤表文件', '', 'Excel Files (*.xls *.xlsx)')
# 读取表格数据
self.roster_df = pd.read_excel(fname_roster)
self.attendance_df = pd.read_excel(fname_attendance)
# 显示表格详情
self.roster_model = PandasModel(self.roster_df)
self.roster_table_view.setModel(self.roster_model)
self.attendance_model = PandasModel(self.attendance_df)
self.attendance_table_view.setModel(self.attendance_model)
```
其中,PandasModel类是一个自定义的QAbstractTableModel子类,用于将pandas DataFrame对象显示在Qt界面中的QTableView控件中。具体实现方法可以参考[这篇博客](https://www.cnblogs.com/lsdb/p/11202647.html)。
2. 交叉分析数据
我们可以通过pandas的merge函数来将花名册和考勤表格数据进行交叉分析。具体来说,我们可以先将考勤表格数据中的参会人员名称按照姓名分隔成姓和名两列,然后再将两个表格按照姓名进行合并。最后,我们可以将合并后的表格中参会时间为空的行筛选出来,即为未参会学生。
```python
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
# ...
def analyze_data(self):
# 将考勤表格数据中的参会人员姓名分隔成姓和名两列
self.attendance_df[['Last Name', 'First Name']] = self.attendance_df['参会人员名称'].str.split(' ', expand=True)
# 将两个表格按照姓名进行合并
self.merged_df = pd.merge(self.roster_df, self.attendance_df, how='left', left_on='姓名', right_on='First Name')
# 筛选出未参会学生
self.absent_df = self.merged_df[self.merged_df['参会时间'].isna()]
# 计算参会率
num_present = len(self.merged_df) - len(self.absent_df)
num_total = len(self.merged_df)
attendance_rate = num_present / num_total
self.attendance_rate_label.setText(f'参会率:{attendance_rate:.2%}')
```
3. 检查重名情况
为了检查花名册中可能存在的重名情况,我们可以使用pandas的duplicated函数来查找重复行。具体来说,我们可以在姓名列上查找是否有重复行,如果有则给出提示信息。
```python
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
# ...
def check_duplicates(self):
# 检查花名册中是否存在重名情况
duplicates = self.roster_df[self.roster_df.duplicated(subset='姓名', keep=False)]
if len(duplicates) > 0:
QMessageBox.warning(self, '警告', '花名册中存在重名情况!')
```
4. 统计参会总时长
为了统计参会学生的参会总时长,我们可以先将参会时间列转换为datetime类型,然后使用pandas的groupby和sum函数来对参会学生按照姓名进行分组,并计算每个学生的参会总时长。最后,我们可以将结果显示在Qt界面中的柱状图控件中。
```python
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
# ...
def plot_total_time(self):
# 将参会时间列转换为datetime类型
self.merged_df['参会时间'] = pd.to_datetime(self.merged_df['参会时间'])
# 统计参会学生的参会总时长
total_time_df = self.merged_df.groupby('姓名')['参会时间'].sum().reset_index()
# 显示柱状图
self.total_time_bar.clear()
self.total_time_bar.setTitle('参会总时长')
axis = QtCharts.QBarCategoryAxis()
axis.append([name for name in total_time_df['姓名']])
self.total_time_bar.createDefaultAxes()
self.total_time_bar.setAxisX(axis, self.total_time_bar.series()[0])
y_series = QtCharts.QBarSeries()
for i, time in enumerate(total_time_df['参会时间']):
y_series.append(QtCharts.QBarSet(total_time_df.loc[i, '姓名'], [time.total_seconds() / 3600]))
self.total_time_bar.addSeries(y_series)
```
完整代码如下:
阅读全文