0%

python标注

常见代码块

合并数据表

1
2
3
4
5
6
7
8
9
10
#选取基本信息表和公开课教学表并合并
basic_info_df=all_dataframe_dict['基本信息'].copy()
subject_teach_df=all_dataframe_dict["公开课教学"].copy()
merge_df=pd.merge(basic_info_df,subject_teach_df,on='关联主键',how='left')

#从all_dataframe_dict中取出基本信息表,本人奖项表
basic_info_df=all_dataframe_dict["基本信息"].copy()
reward_info_df=all_dataframe_dict["本人奖项"].copy()
#合并数据表
merge_df=pd.merge(basic_info_df,reward_info_df,on='关联主键',how='left')

柱状图相关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#基于"基本信息”表的"民族"字段进行统计分析
df_basic_info = all_dataframe_dict["基本信息"].copy()
nation_count = df_basic_info.groupby("民族")["关联主键"].nunique().reset_index()
nation_count.columns = ["民族","人数"]

#按照人数进行排序
nation_count = nation_count.sort_values('人数',ascending=False)

#制作柱状图进行展示
plt.figure(figsize=(10,6))
sns.barplot(data=nation_count,x="民族",y="人数",palette="viridis")
plt.title('我校各民族教师的人数统计')
plt.xticks(rotation=90)
plt.show()

#展示统计结果
nation_count

饼图相关

  • 统计参与过远郊区交流轮岗的专任教划师占比

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #从教师基本信息表中选取所有专任教师的数据
    basic_info_df=all_dataframe_dict["基本信息"].copy()
    exchange_rotation_df=all_dataframe_dict["交流轮岗"].copy()

    #从交流轮岗表中选取参与过远郊区交流轮岗的教师数据
    far_suburb_exchange_df=exchange_rotation_df[exchange_rotation_df["交流形式"]=="远郊区交流轮岗"]

    #合并两张表,使用关联主键进行关联
    merged_df=pd.merge(basic_info_df,far_suburb_exchange_df,on="关联主键",how="inner")

    #可视化展示
    comt8_df=merged_df["教职工类别"].value_counts().sort_index()
    plt.figure(figsize=(10,6))
    plt.pie(counts_df,labels=counts_df.index,autopct='%1.1f%%')
    plt.show()

    #创建DataFrame
    df=pd.DataFrame({'教职工类别':counts_.df.index,'人数':counts_df.values})
    #按人数降序排序
    df=df.sort_values('人数',ascending=False)
    #重置索引
    df = df.reset_index(drop=True)
    #打印结果
    df["占比"]=df["人数"]/df["人数"].sum()
    df

语义顺序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 定义年级顺序
grade_order = ['一年级','二年级', '三年级', '四年级', '五年级', '六年级', '初一', '初二', '初三', '高一', '高二', '高三']
# 将年级转换为分类型变量,并指定排序顺序
merged_df['年级'] = pd.Categorical(merged_df['年级'], categories=grade_order, ordered=True)
# 对学业测评类型进行统计
performance_count = merged_df.groupby(["年级", "学业测评类型"]).size().reset_index(name='count')
# 按照年级排序
performance_count = performance_count.sort_values('年级')

# 定义奖项级别的排序顺序
sort_order = ["校级","集团(学区)","乡镇级","区县级","市级","省级","国家级","全部"]
base_info_df['奖项级别'] = pd.Categorical(base_info_df['奖项级别'], categories=sort_order, ordered=True)

# 常见语义顺序
岗位等级:['专技13级','专技12级','专技11级','专技10级','专技9级','专技8级','专技7级','专技6级','专技5级','专技4级','专技3级','专技2级','专技1级']
本人奖项,奖项级别:["校级","集团(学区)","乡镇级","区县级","市级","省级","国家级","全部"]
公开课级别:["其他","校级","学区级","区县级","市级","省级","国家级"]
刊物级别:['其他','校级普刊','学区级普刊','区级普刊','市级普刊','省部级普刊','国家级普刊','核心期刊']
课题研究:['校级课题','区县级课题','市厅级课题','省部级课题','国家级课题','全部']
学历:['其他','中等职业','普通高中','大学专科','大学本科','硕士研究生','博士研究生','全部']
本人角色——论文:["其他作者","第二作者","通讯作者","第一作者"]
培训学习:["其他","校级","区县级","市级","省级","国家级","全部"]
职称级别:["未定","三级","二级","一级","高级","正高级","全部"]
本人奖项,奖项等级:["不设等级","优秀奖","三等奖","二等奖","一等奖","特等奖"]
考核结果:["未参加考核","不确定考核等级","不合格","基本合格","合格","良好","优秀"]
最高学历:["其他","中等职业","普通高中","大学专科","大学本科","硕土研究生","博士研究生","全部"]


按出生日期逆序排序

1
df=df.sort_values(by='出生日期',ascending=False)

计算人数

1
2
3
# 计算人数
num=df_result["关联主键"].nunique()
print("老师人数为:",num,"人")

打印dataframe

1
2
3
4
result_df = result_df.sort_values(by=["刊物级别","参加工作时间"],ascending=[False,False])

.reset_index(drop=True)
#[["教师姓名","作品名称","发表刊物","刊物级别","本人角色","发表年月"]]

字典结果转化为dataframe:

1
2
3
4
5
6
7
8
9
# 如果不是,请先创建这个 Series
# 创建 DataFrame
df = pd.DataFrame({'本人角色': Name.index, '人数': Name.values})
# 按人数降序排序
df = df.sort_values('人数', ascending=False)
# 重置索引
df = df.reset_index(drop=True)
# 打印结果
df

修改列名

1
2
# 重命名列 'B' 为 'New_B'
df = df.rename(columns={'B': 'New_B'})

提取近5年的数据

1
2
3
4
#将"获奖日期"字段转换为datetime类型,并筛选出近5年的数据
df_award['获奖日期']=pd.to_datetime(df_award['获奖日期'],format="%Y.%m.%d")
start_date = pd.to_datetime('today').year -4
df_award=df_award[df_award['获奖日期'].dt.year>=start_date]
1
2
3
4
5
6
7
8
9
10
11
12
# 提取近5年的数据
df_recent_5year = df_exchange[df_exchange['年份']>=pd.Timestamp.now().year-5]

# 构造一个新的数据表,对各年份的交流形式为城市学区交流轮岗的教师数量进行统计
df_city_school = df_recent_5year[df_recent_5year['交流形式']=='城区学区交流轮岗'].groupby('年份').size().reset_index()
df_city_school.columns=['年份','城区学区交流轮岗数量']

#构造一个新的数据表,对各年份的所有教师交流轮岗数量进行统计
df_total=dr_recent_5year.groupby('年份').size().reset_index()
df_total.columns=['年份','全部数量'
#按照年份将两个数据表进行合并
df_merge=pd.merge (df_city_school,df_total,on='年份')
1
2
3
#筛选近三年入校的老师
three_years_ago=pd.to_datetime('today')-pd.DateOffset(years=3)
new_teacher_df=teacher_df[teacher_df['入校时间']>three_years_ago]

我校今年新聘教师中,是否存在未获得教资证书的人

1
2
3
4
5
6
7
8
9
10
11
12
13
merged_df['岗位聘任时间']=pd.to datetime(merged_df['岗位聘任时间'],format='%Y.%m.%d')
merged_df['年份']=merged_df['岗位聘任时间'].dt.year

#筛选出今年新聘的教师
this_year=merged_df[merged_df['年份']==pd.to_datetime('today').year]

#筛选出未获得教资证书的教师
teachers_no_certificate=this_year[this_year['教师资格证编号'].isnull()]

#输出结果
teachers_no_certificate=teachers_no_certificate.reset_index()
teachers_no_certificate=teachers_no_certificate['姓名''岗位聘任时间''教师资格证编号']
teachers_no_certificate
1
[["教师姓名","作品名称","学校名称","发表刊物","刊物级别","本人角色"]]

年龄

1
2
3
4
5
6
7
8
9
10
11
12
#计算教师的年龄
today = pd.to_datetime('today',format='%Y.%m.%d')
merge_df['出生日期']=pd.to_datetime(merge_df['出生日期'],format='%Y.%m.%d')
merge_df['年龄']=today.year-merge_df['出生日期'].dt.year

#获取每个人的年龄
df['出生日期']=pd.to_datetime(df['出生日期'])
df['年龄']=(pd.to_datetime("today")-df['出生日期'])//pd.Timedelta(days=365)
df['距退休年数"]=60-df['年龄']

#筛选出年龄小于35岁的教师
merge_df = merge_df[merge_df['年龄']<35]

年龄分布

1
2
age_ranges = [24, 25, 30, 35, 40, 45, 50, 55, 60, 65]
labels = ['24岁以下', '25-29岁', '30-34岁', '35-39岁', '40-44岁', '45-49岁', '50-54岁', '55-59岁', '60岁以上']

学科竞赛

1
['学科奥林匹克竞赛','自然科学素养类(部级官方赛事)','自然科学素养类(其他级别比赛)','人文综合素养类(部级官方赛事)','人文综合素养类(其他级别比赛)']

近一年:

1
2
3
4
#获取近一年发表论文的时间范围
paper_df["发表年月"] = pd.to_datetime(paper_df["发表年月"])
start_date = pd.to_datetime("today") - pd.DateOffset(years=1)
recent_papers = paper_df[paper_df["发表年月"] >=start_date]

输出最大值

1
2
3
# 输出最后的结论
top_subject = df.iloc[0]
print(f"论文成果最多的学科是{top_subject['主授学科']},共有{top_subject['论文数量']}篇论文。")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 获取基本信息表、集体备课表
basic_info_df = all_dataframe_dict['基本信息'].copy()
group_lesson_df = all_dataframe_dict['集体备课'].copy()

# 合并基本信息表和集体备课表
merged_df = pd.merge(basic_info_df, group_lesson_df, on="关联主键", how="inner")

# 定义年级顺序
grade_order = ['小班', '中班', '大班', '托班', '小小班', '一年级', '二年级', '三年级', '四年级', ]

# 将执教年级转为分类型变量并指定排序顺序
merged_df['执教年级'] = pd.Categorical(merged_df['执教年级'], categories=grade_order, ordered=True)

# 对执教年级和教师姓名进行统计
grade_teacher_count = merged_df.groupby('执教年级')['关联主键'].nunique().reset_index()
grade_teacher_count.columns = ['执教年级', '人数']

# 按照预定义的年级顺序进行排序
grade_teacher_count = grade_teacher_count.sort_values('执教年级')

# 绘制柱状图进行可视化
plt.figure(figsize=(10, 6))
sns.barplot(data=grade_teacher_count, x='执教年级', y='人数', color="skyblue")
plt.title("不同年级进行集体备课的老师数量统计")
plt.xlabel("年级")
plt.ylabel("教师数量")
plt.xticks(rotation=45)
plt.show()

# 打印结果
max_group_lesson_grade = grade_teacher_count.iloc[grade_teacher_count['人数'].idxmax()]
print(f"进行集体备课的老师最多的年级是{max_group_lesson_grade['执教年级']}, 共有{max_group_lesson_grade['人数']}人")

# 直接输出按年级顺序排序的DataFrame
grade_teacher_count

打印top3

1
2
3
4
5
6
7
8
9
10
# 合并数据表,包括教师姓名,并只保留一条记录
result_df = pd.merge(awards_df[['天联主键', '姓名']], top_3_teachers_df, on='天联主键', how='inner').drop_duplicates(subset=['天联主键'])

# 按荣誉次数降序排序
result_df = result_df.sort_values('荣誉次数', ascending=False)

# 打印这三位教师的姓名和荣誉次数
print("荣誉次数最多的三位教师:")
for index, row in result_df.iterrows():
print(f"姓名: {row['姓名']}, 荣誉次数: {row['荣誉次数']}")

犯过的错误:

  • query中涉及本人奖项级别的,记得勾上“查询教师个人奖项级别分布”;

  • 查看知识元的语义顺序是否有漏选;

  • 筛选后连接表要用inner;

  • 改代码的时候记得注释也要看一下,别忘了改注释

  • 注意rotation什么时候用,什么时候改为90,以及figure(10,6)

  • =还是>,看清楚题目;

  • 涉及到教师名单的,求“哪些教师”等的query,记得print一下人数

  • 注意关联树的字段与输出表格是否一致(常见遗漏:姓名,性别);

  • “有哪些老师有过以第一作者身份在国家级期刊上发表论文的记录”,在这个query中,“国家级期刊”:既要筛选刊物级别:国家级普刊,也要筛选发表刊物为:期刊刊物;
    query中出现“第一作者”,不需要筛选“一作”这个知识元;

  • 统计人数用nunique();

  • 注意字符串筛选规范,什么时候用“==”,什么时候用“str.contains”;

  • 涉及教师的学科分布记得用“主授学科

知识元的作用是用来澄清概念的;

query:请帮我筛选出所有5年内校外合作果题名称;这里的五年内再加上一个<=today(如果问近n年也是一样)

1
2
3
4
5
6
#将完成时间转换为日期格式
df_course_research["完成时间"] = pd.to_datetime(df_course_research["完成时间"],format='%Y.%m')

#筛选最近5年的数据
start_date = pd.to_datetime('today').year -4
df_course_research = df_course_research[(df_course_research['完成时间'].dt.year>=start_date) & (df_course_research['完成时间']=pd.to_datetime('today'))]

用value_counts统计:

1
2
3
4
5
6
```

### 用groupby统计:

```python

图形的横坐标顺序和表格的横坐标顺序输出不一致:

典型例题

2019年获得市级及以上特等奖本人奖项的教师有哪些

1
2
关联字段:查询教师个人奖项级别分布
知识元:本人奖项>奖项级别>语义顺序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#从all_dataframe_dict中取出"本人奖项”表
award_df=all_dataframe_dict["本人奖项"].copy()

#定义奖项级别的排序顺序
ort_order=["校级","集团(学区)","乡镇级","区县级","市级","省级","国家级","全部"]
award_df['奖顶级别']=pd.Categorical(award_df['奖项级别'],categories=sort_order,ordered=True)

#将获奖日期改为日期格式
award_df['获奖日期']=pd.to_datetime(award_df['获奖日期'])

#筛选出2019年获得市级及以上特等奖的教师
selected_df = award_df[(award_df["获奖日期"].dt.year=2019)&
(award_df["奖项级别"]>="市级")&
(award_df["奖项等级"]="特等奖“)]

#计算人数
num=selected_df["关联主键"].nunique()
print("2019年获得市级及以上特等奖本人奖项的教师人数为:",num,"")

#打印结果
elected_df=selected_df.sort_values("奖项级别")
elected_df[["教师姓名","奖项名称","奖项类别","奖项级别","奖项等级","获奖日期"].reset_index(drop=True)

查询2012年以来我校教师在省部级及以上”论坛刊物”上发表过的文章名称

1
2
关联字段:查询科研成果级别
知识元:论文发表刊物级别>>语义顺序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#从all_dataframe_dict中提取"论文发表”数据表
paper_publish_df = all_dataframe_dict["论文发表"].copy()

#对时间字段进行筛选,获取2012年以来的数据
paper_publish_df["发表年月"]=pd.to_datetime(paper_publish_df["发表年月“],format="%Y.%m")
paper_publish_df=paper_publish_df[paper_publish_df["发表年月"].dt.year>=2012]

#定义刊物级别的排序顺序
sort_ordr=['其他','校级普刊','学区级普刊','区级普刊','市级普刊','省部级普刊','国家级普刊','核心期刊']
paper_publish_df=paper_publish_df.copy()
paper_publish_df["刊物级别"] = pd.Categorical(paper_publish_df["刊物级 别"],categories=sort_order,ordered=True)

#筛选出省级及以上论坛刊物
result_df=paper_publish_df[(paper_publish_df["刊物级别"]>="省部级普刊") &
(paper_publish_df["发表刊物"]=="论坛刊物")]

#展示数据,使用富文本展示
print("2012年以来我校教师在省部级及以上论坛刊物上发表过的文章名称有:",len(result_df),"")
result_df=result_df.sort_values("刊物级别")
result_df.reset_index(drop=True)["教师姓名","作品名称","发表年月","发表刊物","刊物级别","本人角色"]