我有预约表和入馆表,他们两个都有学生id,通过学生id去核对2013-2019年预约了但是未入馆的各年人数,用pyecharts实现并绘制柱形图,直观看出预约数和预约为入馆数的差值
时间: 2024-10-03 21:04:47 浏览: 30
为了实现这个需求,你需要先获取预约表和入馆表中对应的学生ID、年份以及各自的记录数量。然后计算每年未入馆的预约人数。最后使用PyEcharts库创建柱状图展示数据。
以下是步骤概述:
1. **数据处理**:
- 加载预约表和入馆表数据,通常可以使用pandas库读取CSV文件。
- 确保两个表格都有`student_id`和`year`字段,并合并它们基于学生ID和年份。
- 对于每个年份,找出预约次数(可能是从预约表中计数),再找出实际入馆的人数(从入馆表中筛选出当年学生ID对应的记录数)。
- 计算每年的未入馆人数(预约次数 - 入馆次数)。
2. **数据可视化**:
- 使用PyEcharts创建一个新的Bar()图表。
- 设置x轴为年份,y轴为未入馆的预约数。
- 创建两条数据系列,一条表示预约总数,另一条表示已入馆人数,最后画出两者之间的差值作为第三条数据系列。
- 添加图表标题和标签等元素,以便于理解和解读。
下面是一个简单的示例代码,不过实际操作需要根据你的数据结构调整:
```python
import pandas as pd
from pyecharts.charts import Bar
# 假设df1是预约表,df2是入馆表
# df1 = pd.read_csv('appointment.csv')
# df2 = pd.read_csv('entry.csv')
# 合并数据
merged_data = pd.merge(df1[['student_id', 'year']], df2[['student_id', 'year']], on=['student_id', 'year'])
# 计算各年的数据
data = merged_data.groupby(['year']).agg({'appointment': 'count', 'entry': 'sum'}).reset_index()
data['unentered'] = data['appointment'] - data['entry']
# 创建柱状图
chart = Bar()
chart.add_xaxis(data['year'].tolist())
chart.add_yaxis("预约总数", data['appointment'])
chart.add_yaxis("已入馆人数", data['entry'])
chart.add_yaxis("未入馆数", data['unentered'], is_selected=False) # 把未入馆数放在最后,颜色可能不同
# 设置图形样式
chart.set_global_opts(title_opts=TitleOpts(title="未入馆人数差异"))
chart.render('预约未入馆比较图.html') # 输出到HTML文件
```
阅读全文