内容正文:
高效作业19[第19课 数据处理与应用综合【A级 新教材落实与巩固】
1.针对选考小陈在气象部门得到了一份某平年不同城市的月平均日照时数(单位:kW·h/m2/day)数据,存放在Excel 文件“日照.xlsx”中。部分界面如图1所示。
图1
请回答下列问题。
(1)第1 步,小陈编写了如下Python程序:
import pandas as pd
df=pd.read_excel(”日照.xlsx”)
mdays=[31,28,31,30,31,30,31,31,30,31,30,31]
months=list(df.columns)
for i in df.index:
s=0
for j in range(12):
m=df.at[i,months[j+1]]
s+=m*mdays[j]
df.at[i,”年度平均”]=round(s/365,2)
该程序实现的功能是__计算每个城市的年度平均日照时数__。
(2)第2 步,仅考虑平均日照时数因素,选出最适合用光伏发电给智能农业大棚提供能源的10个城市。横线处应填入的代码为__C__(单选,填字母)。
A.df.sort_values(”城市名”,ascending=False).head(10)
B.df.sort_values(”城市名”).tail(10)
C.df.sort_values(”年度平均”,ascending=False)[:10]
D.df.sort_values(”年度平均”,ascending=False).tail(10)
df=____________#
#输出结果如图2 所示,代码略
图2
(3)小陈想在家乡温州建一个智能大棚,采用光伏发电加蓄电设备供电,面积为1 平方米的光伏板容量约为0.3 kW/块,光伏的充放电效率为80%,大棚每天消耗的最低电能约为30 kW·h,为确保每月能正常供电,需要1平方米的光伏发电板共__52__或其他等价答案__块。(日均发电量=电池板的容量/块×块数×平均日照时数×充放电效率)
(4)建设光伏发电设备前要先获得当地的平均日照时数情况,小陈通过如下代码获取相关数据。程序运行界面如图3 所示。请在横线处填入合适的代码。
res=df[df[”城市名”]==”温州市”
res=res.values[0][1:13].__min()__
print(”温州市月平均日照最小值为”,res)
图3
【解析】 (1)mdays 列表中存放每个月的天数,Excel 表格中存放的是每个月的月平均日照时数,通过for 循环将月平均日照时数*每个月的天数并进行累加,得到全年的日照时数,再计算出当前城市的日平均日照时数,并通过round()函数保留2 位小数。故该程序的功能为计算每个城市的年度平均日照时数。
(2)最适合用光伏发电的十个城市即日照时数最长的十个城市,通过sort_vlaues()函数进行降序排序,取前十个。故选项C正确。
(3)根据图3 可知温州市月平均日照最小值为2.42,再根据公式:日均发电量=电池板的容量/块×块数×平均日照时数×充放电效率。0.3 kW/块* 块数*2.42 * 0.8=30 kW ,得到需要的光伏发电板共52 块。②处为求最小值,故使用min()函数。
2.针对选考小美收集了某电商平台某年1~12 月的十大空调品牌的销售数据,每个月的数据保存在一个CSV 文件中,文件如图1所示,分别记录了对应月份的订单数据。
图1 图2
请回答下列问题。
(1)定义get_sales() 函数,功能为:读取某月的CSV 文件,返回某品牌当月的销售额。函数的Python代码如下,横线处应填入的代码为__A__(单选,填字母)。
A.df[df['品牌']==brand]
B.df[df['品牌']==month]
C.df['品牌']==brand
D.df['品牌']==month
import pandas as pd
def get_sales(brand, month):
filename=str(month)+'.csv'
df=pd.read_csv(filename) #读取文件
df=________#
sales=(df['数量'] *df['单价']).sum() #求出df 中所有数量*单价的总和
return sales
(2)统计十大品牌全年销售额,并找出销售额最大的品牌,绘制该品牌的1~12 月销售额的线形图,部分Python 程序如下,请在横线处填入合适的代码。
import matplotlib.pyplot as plt
brand_dict={'GL': 0,'MD': 0,'HE': 0,'AKS': 0,'HX': 0,'SL': 0,'RL': 0,'HL': 0,'TL':0,'DJ': 0}
x,y,max_sales,brandmax=[],[],0,''
for i in range(1,13):
for j in brand_dict:
brand_dict[j]+=①__get_sales(j,i)____
for i in brand_dict:
if brand_dict[i]>max_sales:
max_sales=brand_dict[i]
②__brandmax=i__
for i in range(1,13):
x.append(③__i__)
y.append(get_sales(brandmax,i))
plt.plot(x,y)
plt.show() #生成折线图,如图3所示
(3)由图3可知,该空调销售额增量最大的月份是__11__。
图3
【解析】 (1)由题干“定义get_sales()函数,功能为:读取某月的CSV 文件,返回某品牌当月的销售额”可知,函数的两个参数:month 为月份,brand 应为品牌,故选项A正确。
(2)①从brand_dict 的初值,结合累加操作可知,字典brand_dict 用于统计每种品牌的全年销售额,外循环i 遍历月份,内循环j 遍历品牌名称,此处可利用自定义函数来累加该品牌每月的销售额,填:get_sales(j,i)。
②处所在循环可以看出,循环在求所有品牌全年销售额的最大值max_sales,除此之外,绘制图表时还需要最大值的品牌brandmax,此处填:brandmax=i。
③将月份加入列表x中,此处填:i。
(3)观察图表可知,该空调销售额增量最大的月份是11 月。
3.针对选考2024·丽水中学检测某教师收集学生一节课40 分钟专注度情况的测试数据,以帮助自己更好地制定教学策略。测试数据存储在“数据.txt”文件中,每行对应一位学生。40 分钟分为8 个时段记录数据,0~5 分钟为第1 个时段,5~10 分钟为第2 个时段……35~40 分钟为第8 个时段。每个时段都设置了10 个测试点(即每个时段包含10 个数据结果),按时间顺序存储,每行共80 个数据。其中“1”表示专注,“0”表示不专注,数据间用逗号隔开,如图1 所示。
图1
图2
请回答下列问题。
(1)进行数据预处理,将“数据.txt”文件的每行数据分组计算出对应8 个时段的结果(10 个数据为一组计算平均值),结果如图2 所示。请在横线处填入合适的代码。
f=open(”数据.txt”,”r”,encoding='utf——16') #打开文件
file_data=f.readlines() #读取所有行
data=[]
for row in file_data: #逐行读取数据
s=list(map(int,row.split(”,”))) #将字符按逗号分割,转为整型,以列表形式存储
line=[];i=0
while i<len(s):
①__total=0__
for j in range(10):
total+=②__s[i+j]__
i=i+10
line.append(total/10*100) #计算平均值(如10 个数中有5 个1 则为50.0)
data.append(line)
f.close()
(2)调用处理后的文件数据,统计分析学生专注度情况。整节课平均专注度大于或等于65 为优秀,求班级内整节课专注度为优秀的学生数量。请在横线处填入合适的代码。
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams[”font.sans——serif”]=[”SimHei”] #图表显示中文字体
col=[”T1”,”T2”,”T3”,”T4”,”T5”,”T6”,”T7”,”T8”]
df=pd.DataFrame(data,columns=col) #创建DataFrame 对象,指定数据列名称
df[”个人平均”]=df.mean(axis=1) #新增一列,存放学生整节课的平均专注度
df1=__df[df[”个人平均”]>=65]__#筛选专注度优秀的学生
print(”专注度优秀的学生人数: ”,len(df1))
(3)计算每个时段学生的平均专注度,绘制专注度折线图,如图3 所示。
图3
df2=df.mean()
x=col
#
plt.xlabel(”时段”)
plt.ylabel(”学生专注度”)
plt.show()
上述程序段中加框处按顺序应填入的代码为__A__(单选,填字母)。
①y=df2.values[:8] ②y=df2.index[:8]
③plt.plot(x,y) ④df2.plot(x,y)
A.①③ B.①④ C.②③ D.②④
(4)初步分析图像可知,该教师选择在__B__时段讲授重难点更合适。
A.0~10 分钟 B.10~20 分钟
C.20~30 分钟 D.30~40 分钟
【解析】 (1)根据图1、图2 数据的变化,这里是要将每个时段的10 个测试点汇总,①total=0 初始化为0。②再根据i=i+10,total 累加的语句为:total+=s[i+j]。
(2)求班级内整节课专注为优秀的学生,pandas 相应的筛选语句:df[df[”个人平均”]>=65]。
(3)df2=df.mean(),df2 是Series,y 的数据是df2.values,创建折线图的语句plt.plot(x,y),选项A正确。
(4)图上T3、T4 专注度最高,处于10~20 分钟这个时间段,选项B正确。
4.游老师统计了A年至I年每年专科、本科、硕士和博士的毕业人数(单位:万人),数据保存在“Graduate.csv”中,如图1 所示。
年份
专科
本科
硕士
博士
共计
A年
318
319
51
5
B年
318
341
53
5
C年
322
358
55
5
D年
329
374
56
5
E年
351
384
57
5
F年
366
386
60
6
G年
363
394
63
6
H年
376
420
72
6
I年
398
428
77
7
图1
请回答下列问题。
(1)统计每年的毕业总人数并绘制柱形图,请在横线处填入合适的代码。
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans——serif']=['simhei']
df=pd.read_csv(”Graduate.csv”)
df.共计=①__df.sum(axis=1)__或df[”专科”]+df[”本科”]+df[”硕士”]+df[”博士”]或df.专科+df.本科+df.硕士+df.博士__
x=df[”年份”]
y=②__df[”共计”]__或df.共计__
plt.bar(x,y)
#设置绘图参数,绘制柱形图,代码略
(2)游老师编写如下代码用来统计毕业人数增长率最高的年份,增长率相同的年份同时输出(注:B年增长率=(B年毕业人数-A年毕业人数)/A年毕业人数)。请在横线处填入合适的代码。输出结果如图2 所示。
图2
data=df[”共计”].values.tolist() #将每年毕业总人数数据转换成列表
year=[”B年”,”C年”,”D年”,”E年”,”F年”,”G年”,”H年”,”I年”]
rate=[];imax=[0]
for i in range(1,len(data)):
rate.append(round(①__(data[i]-data[i-1])/data[i-1]____,4))
for i in range(len(rate)):
print(year[i],”增长率为: ”,rate[i])
for i in range(1,len(rate)):
if ②__rate[imax[0]]<rate[i]__:
imax=[i]
elif rate[imax[0]]==rate[i]:
imax.append(i)
print(”毕业人数增长率最高的年份是: ”,end=””)
for i in range(len(imax)):
print(③__year[imax[i]]__)
【解析】 (1)①每年的毕业生汇总,水平方向的求和:df.sum(axis=1) 或df[”专科”]+df[”本科”]+df[”硕士”]+df[”博士”] 或df.专科+df.本科+df.硕士+df.博士。
②柱形图的Y 轴数据:df[”共计”] 或df.共计。
(2)①根据给出的公式,对应的代码:(data[i]-data[i-1])/data[i-1]。
②根据下面的代码rate[imax[0]]==rate[i]可知,对应的代码为:rate[imax[0]]<rate[i]。
③根据图2,这里要输出对应的年份,代码:year[imax[i]]。
5.2024·诸暨中学检测某校区举行优秀学员的评比。教务处统计了本校区的相关数据并存储在“cj.xlsx”文件中,学生数据按照班级的先后次序存储,如1 班之后是2 班的学生数据。文件部分内容如图1 所示。为分析本次评比结果的情况,编写Python 程序。
图1 图2
请回答下列问题。
(1)读取“cj.xlsx”文件,为每个学生补充班级名称(1~4 班),班级人数存储在列表num 中。请在横线处填入合适的代码。
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['KaiTi','SimHei']
num=[29,31,30,32] #存储4 个班级的人数
df=pd.read_excel(①__”cj.xlsx”__)
k=0
②__end=num[0]__或end=num[k]__
for i in df.index:
if i==end:
③__k=k+1__
end+=num[k]
df.at[i,”班级”]=str(k+1)+”班”
(2)优秀学员的评比规则为:学业分数不低于80 分,德育等级为A。统计每个班级优秀学员人数,并绘制图表,如图2 所示,部分Python 程序如下。请在横线处填入合适的代码。
dfs=df[df[”学业分数”]>=80]
dfs=①__dfs[dfs[”德育等级”]==”A”]__或dfs[dfs.德育等级==”A”]__
dfg=#
dfg=dfg.rename(columns={”学业分数”:”人数”}) #将”学业分数”重命名为”人数”
plt.bar(dfg[”班级”],②__dfg[”人数”]或dfg.人数__ )
plt.title(”班级优秀人员对比图”)
plt.xlabel(”班级”)
plt.ylabel(”人数”)
plt.show()
(3)上述程序中加框处应填入的代码为__A__(单选,填字母)。
A.dfs.groupby(”班级”,as_index=False).学业分数.count()
B.dfs.groupby(”班级”,as_index=False).学业分数.sum()
C.dfs.groupby(”班级”,as_index=True).学业分数.count()
D.dfs.groupby(”班级”,as_index=True).学业分数.sum()
【解析】 (1)①由题干可知,读取的文件为“cj.xlsx”,填”cj.xlsx”。
②空后的循环,作用是填充所有学生所在班级,当i==end 时,一个班级填充完毕,准备计算下一班级的end 及班号,故end 变量表示下一个班级的起点,②空设置end 的初始值end=num[0]。
③当一个班级填充结束,准备填充下一班级(i==end),除了计算下一个end 外,还要计算下一班级号:k+=1。
(2)①部分代码解释如下:
dfs=df[df[”学业分数”]>=80] #筛选学业分数不低于80 分的记录
dfs=①#筛选德育等级为A 的记录
①处填:dfs[dfs[”德育等级”]==”A”]
②处代码用于画图,观察图表,Y 轴数据为人数,填:dfg[”人数”]。
(3)题干要求“统计每个班级优秀学员人数”,故要对dfg 对象按“班级”进行分组并计数,从plt.bar(dfg[”班级”], ②)可以看出,分组后“班级”未做成索引,分组语句要加参数:as_index=False,选项A正确。
【B级 素养形成与评价】
6.小明收集了某学校某次模拟考试技术成绩的数据,存储在文件“cj.xlsx”中,其中“xx1”表示信息选择题1,共12 个选择题。每小题的分值是2 分,如图1 所示。
图1
图2
请回答下列问题。
(1)观察图1 中第一行数据,该行数据存在的问题是__B__(单选,填字母)。
A.数据缺失 B.逻辑错误
C.格式不一致 D.数据异常
(2)技术学科包括信息技术与通用技术,需要我们关注学科的平衡,而衡量学科平衡的重要指标是学科吻合度,我们采用得分差来判断(3 分一级:0~2 分为0 级偏差,3~5 分为1 级偏差,以此类推),现需要编写Python 程序计算吻合度偏差值,并统计各班偏差较大的人数(吻合度>=3),输出结果如图2所示。代码如下,请在横线处填入合适的代码。
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams[”font.sans——serif”]=[”SimHei”]
df=pd.read_excel(”cj.xlsx”)
df=df[df.技术!=0]
n=len(df)
info=[]
bjc={1:0,2:0,3:0,4:0,5:0} #存储各班吻合度>=3 的人数
for i in range(n):
info.append([df.班级[i],df.姓名[i],df.信息[i],df.通用[i]])
diff=info[i][2]-info[i][3]
info[i].append(①__abs(diff)//3__)
if info[i][4]>=3:
②__bjc[info[i][0]]+=1__
print(”各班吻合度偏差较大人数统计如下: ”)
for bj in bjc:
print(bj,”班”,bjc[bj],”人”)
(3)为了解12 个信息技术选择题的难度系数(难度系数=平均分/分值),选出错误率最高的5 个小题,小明编写了如下Python程序,求各题的难度系数,并给错误率最高的5 个小题绘制了如图3 所示的柱形图。
图3
import matplotlib.pyplot as plt
dif=[]
for i in df.columns[5:]:
dif.append(round(①__df[i].mean()__/2,2))
dic={”题号”:df.columns[5:],”难度系数”:dif}
df1=pd.DataFrame(dic)
df1=df1.sort_values(”难度系数”)
plt.figure(figsize=(8,4))
plt.title(”信息难度最大的5 道题对比图”)
plt.bar(②__df1.题号[0:5],__df1.难度系数[0:5]__或其他等价答案__)
plt.xlabel(”题号”)
plt.ylabel(”难度系数”)
plt.show()
【解析】 (1)数据存在的问题主要有数据缺失、数据重复、数据异常、逻辑错误、格式不一致等。选择题每题的分值为2,故此处为逻辑错误。
(2)①空:diff=信息成绩-通用成绩,得分差来判断(3 分一级:0~2 分为0 级偏差,3~5分为1 级偏差,以此类推),故此空为abs(diff)//3。
②空:bjc={1:0,2:0,3:0,4:0,5:0}存储的是各班的吻合度,依次遍历每个同学的数据,若吻合度>=3,相应班级计数加1,info[i][0]存储为班级,所以此空为bjc[info[i][0]]+=1。
(3)①空:由“for i in df.columns[5:]:”可知,i 为列标签,难度系数=平均分/分值,所以此空要求的是各列的平均分,即df[i].mean()。
②空:由图3 可知,两列数据为题号和难度系数,由题意可知取前5,所以此空为df1.题号[0:5],df1.难度系数[0:5]。
7.针对选考2024·柯桥中学检测一名球迷收集了某3 个赛季的某比赛数据,每个赛季的数据分别保存在独立文件中,如图1 所示。文件中数据记录格式如图2 所示,以球员“A”的“二分”数据“7.9-16.3”为例,7.9 表示二分球平均命中数量,16.3 表示二分球平均投篮次数。
图1 图2
图3
该球迷想根据历史赛季数据预测各球队下个赛季的首发阵容,编写了如下Python 程序,请回答下列问题。
(1)定义readData()函数,功能为:读取某赛季的Excel 文件,返回每位球员的得分(得分=二分球命中数量*2+三分球命中数量*3+罚球命中数量。函数代码如下,横线处应填入的代码为__A__(单选,填字母)。
A.df[”得分”][i]+=n*cols[col]
B.df[”得分”][i]=n*cols[co1]
C.df[”得分”]+=n*cols[col]
D.df[”得分”]=df.二分*2+df.三分*3+df.罚球
import pandas as pd
def readData(file):
df=pd.read_excel(file)#读取文件file 中的数据
cols={”二分”:2,”三分”:3,”罚球”:1}
for i in range(len(df)):#计算每位球员的得分
for col in cols:
p=df[col][i].find(”-”)#在字符串中找到“-”的位置
n=float(df[col][i][:p])
________#
return df
(2)定义select()函数,功能为:筛选各球队得分最高的5 名球员作为首发阵容,并把球员的名字及得分存入列表members 后返回。其中n 号球队各球员的名字存入members[2*n]中,得分存入members[2*n+1]中。请在横线处填入合适的代码。
def select(teams):
#teams 是字典变量,如:{”浙江”:0,”上海”:1},字典的值代表球队编号
seasons=[”20-21”,”21-22”,”22-23”]
members=[0]*len(teams)*2
df=readData(seasons[0]+”.xlsx”)
for season in ①__seasons[1:]____:
file=season+”.xlsx”
df1=readData(file)
df=pd.concat([df,df1])#合并两个DataFrame 对象数据
for team in teams:
df1=②__df[df.球队==team]____
df1=df1.groupby(”球员”,as_index=False).mean()#计算各球员的平均得分
df1=df1.sort_values(”得分”,ascending=False).head(5)#按得分降序排序并选取前5 名
③__n=teams[team]__
members[2*n]=df1[”球员”].values
members[2*n+1]=df1[”得分”].values
return members
(3)定义showChart()函数,功能为:查询某球队的首发阵容,绘制柱形图,图表如图3 所示,程序如下,请在横线处填入合适的代码。
import matplotlib.pyplot as plt
def showChart(tean, menbers):
n=teams[team]
plt.bar(__members[n*2],members[2*n+1]__)
plt.title(team+”队首发阵容”)
plt.show()
(4)主程序代码如下。
teams={”浙江”:0,”上海”:1,”山东”:2,”广东”:3,”北京”:4}
members=select(teams)
while True:
team=input(”输入球队: ”)
if team==””:
break
showChart(team,members)
【解析】 (1)遍历每位球员的二分、三分和罚球的平均命中数量,根据公式求球员的3 种投篮得分之和。col 是字典中的键(二分、三分和罚球),cols[col]是投篮得分,df[col]表示二分等某列值数据,p 是第i 位球员命中数量和投篮次数的分隔位置,因此n*cols[col]的乘积之和为该球员的总得分。
(2)①seasons 列表中存储了3 场比赛的文件名,将这3 个文件合并为一个文件。语句df=readData(seasons[0]+”.xlsx”)已经读取第1 个文件,需对剩余的文件进行合并。②筛选各球队得分最高的5 名球员作为首发阵容。teams 是字典变量,键是球队名称,对每个球队进行遍历,筛选出该球队全部球员,找出在3 场比赛中得分最高的5 名球员。③取出球队编号,将每个球队的球员姓名和得分存储到members 对应的数组元素中。teams 字典值为球队的编号,members 中元素个数为len(teams)*2,n 号球队各球员的名字存入members[2*n]中,得分存入members[2*n+1]中。
8.高三年级的学生名单按班级顺序存放在“student.csv”文件中,每班学生从1 开始连续编号,如图1 所示。小明收集了某次直播讲座的各班签到文件(以班号为文件名,图2 所示是高三(1)班的签到文件“1.csv”中的内容,按签到时间升序排列)。
图1 图2
图3
编写Python 程序分析签到数据,请回答下列问题。
(1)编写自定义函数convert(),功能为:转换时间格式,如将“01:01:00”转换为3660。函数代码如下,请在横线处填入合适的代码。
def convert(s):
t=int(s[:2]) *3600+__int(s[3:5])*60____+int(s[6:])
return t
(2)编写自定义函数cal(),功能为:返回某班签到学生编号列表和迟到人数,多次签到的以最早时间为准。函数代码如下,请在横线处填入合适的代码。
def cal(i,late_time): # 参数i 为班号,late_time 为直播开始时间
df=pd.read_csv(str(i)+'.csv')
arr=[]
late=0
for j in df.index:
if df['id'][j] not in arr:
arr.append(df['id'][j])
if convert(__df['time'][j]__或df.at[j,'time']__)>convert(late_time):
late+=1
return arr,late # 依次返回签到学生编号列表和迟到人数
(3)主程序。统计所有班级准时、迟到和缺席人数,输出结果如图3 所示。程序代码如下。
import pandas as pd
df=pd.read_csv('student.csv')
tot=df.groupby('班级').编号.
late_time=input('请输入直播开始时间: ')
d=[0] * 3 # 存储准时人数、迟到人数和缺席人数
for i in range(1,9):
arr, late=cal(i,late_time)
d[0]+=______________#
d[1]+=late
d[2]+=tot[i-1]-len(arr)
# 输出该班级的迟到人数和缺席人数,代码略
横线处应填入的代码是①__len(arr)-late__;若将加框处代码更改为②__count()__(②处选填:sum()/mean()/count()/min()),程序的运行结果不变。
(4)绘制饼图展示全年级的签到人数比例,如图4 所示,程序代码如下:
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.pie(d, labels=['准时', '迟到', '缺席'])
plt.title('签到人数比例')
plt.show()
图4
下列说法正确的是__BD__(多选,填字母)。
A.缺席人数比迟到人数多
B.该图能增强数据的解释力和吸引力
C.生成该饼图的数据来源于列表labels
D.饼图和环形图都适合展现这类比例关系的数据
【解析】 (1)从t=int(s[:2]) * 3600++int(s[6:])可以看出,横线部分是取出分钟对应的字符串,并计算。代码:int(s[3:5])*60。
(2)根据late+=1,这里是统计迟到人数。要获取每个学生的签到时间,再根据arr.append(df['id'][j]),这里对应代码:df['time'][j],如果熟悉pandas 模块,df.at[j,'time']也能达到相应要求。
(3)①根据上面的注释,d[0]存储准时人数,计算公式=参与人数-迟到人数。代码:len(arr)-late;②max()获取到的是最大学号,也就是班级人数。通过计数的方式也是可以的,对应的是:count()。
(4)选项A,从图上看,迟到的人数比缺席的人数多,选项错误;选项B,图能增强数据的解释力和吸引力,选项正确;选项C,根据语句“plt.pie(d,labels=['准时','迟到','缺席'])”可知,labels 只是标签,数据来源于列表d,选项错误;选项D,饼图和环形图类似,都适合展现这类比例关系的数据,选项正确。
9.针对选考2024·北仑中学检测临近毕业,某校(有6个班级)准备以班级为单位拍摄毕业照。为了提高拍摄当天的效率,事先排定拍照的位置,排位规则为:
①每班平均分4排站立,最后一排人数可能不足;
②身高矮的排前面,身高高的排后面;
③每排身高高的排中间,身高向两边逐渐变矮。
学生信息存储在文件“xsmd.xlsx”中,如图1所示。小李编写Python程序实现排位,并按班级输出排位名单,如图2所示。
图1
图2
请回答下列问题。
(1)如果某班人数为47人,则前三排每排人数为__12__人。
实现上述功能的Python程序段如下:
import pandas as pd
import math
df=pd.read_excel(”xsmd.xlsx”)
bj=[”1班”,”2班”,”3班”,”4班”,”5班”,”6班”]
def paiwei(x): # 每排身高高的排中间,身高向两边逐渐变矮
a=[]
n=len(x)
for i in range(0,n,2):
a.append(x[i])
if n%2==1:
①__n-=2__或__n=n-2____
else:
n-=1
for i in range(n,0,-2):
a.append(x[i])
return a
for m in bj: #按班级排位
df_tmp=__▲__ #按班级筛选名单 ,选择合适的选项
rs=②__(len(df_tmp)-1)//4+1__或__math.ceil(len(df_tmp)/4)__或其他等价答案____ #前三排,每排人数
df_sort=df_tmp. sort_values(”身高”)
lst=list(df_sort[”姓名”]) #lst中数据为['方蓓蕾', '徐盈', '徐若',…]
for j in range(0,len(lst),rs):
lst1=lst[j:j+rs]
k=j//rs+1
s=”第”+str(k)+”排”
fz[s]=③__paiwei(lst1)______________
print(m,”合照排位表”)
for i in fz:
print(i,end=”:”)
print(fz[i])
(2)请在横线处填入合适的代码。
(3)程序段加▲的横线处应填入的代码为__C__(单选,填字母)。
A.df[df.班级==”m”]
B.df[df.班级==bj[m]]
C.df[df[”班级”]==m]
D.df[班级==m]
(4)程序段中加框处的语句改为“fz={}”后__不会__(选填:会/不会)影响程序执行结果。
【解析】 (1)根据图2可知,前三排人数保持一致且和第四排人数尽可能接近,若人数为47人,47/4≈11.7,则前三排每排12人,最后一排11人。
(2)①第一个for循环追加的是下标0、2、4……, 第二个for循环则要倒着追加人数,故需要判断最后的位置。当n为奇数时,需要从n-2的位置开始;当n为偶数时,需要从n-1的位置开始,故此处填写n=n-2或n-=2。
②根据图2可知前三排每排的人数:班级总人数除以4后向上取整,故此处填写(len(df_tmp)-1)//4+1 或 math.ceil(len(df_tmp)/4)或其他合理答案。
③根据代码可知,此处是要对每排的人数进行排位,故填写paiwei(lst1)。
(3)根据题意可知,每次筛选出对应的班级,根据代码“for m in bj:”可知,m中存储的就是班级的名称。故筛选的代码是 df[df.班级==m]或者df[df['班级']==m],故选项C正确 。
(4)根据代码“s=”第”+str(k)+”排””和“fz[s]=_”可知,fz={}时,依然可以正确地赋值进去,所以不会影响结果。
10.针对选考某同学收集了部分城市2023 年4 月每天24 小时空气质量数据,按日分别保存在CSV 文件中,部分文件如图1 所示。数据格式如图2 所示。
图1
图2
请回答下列问题。
(1)定义函数avg(),功能为:读取某天的数据文件,计算该天的空气质量指数(AQI) 的平均值并返回。函数代码如下,请在横线①处应填入的合适的代码。
def avg(filename):
df=pd.read_csv(filename)
df1=df [df.columns[2:]] #取类型及其后的所有列
g=df1.groupby(①__'类型'__,as_index=False).mean ()
return ②________
横线②处应填入的代码为__D__(单选,填字母)。
A.df[df.类型=='AQI']
B.df1.AQI
C.g.AQI
D.g[g.类型=='AQI']
(2)统计本月各城市空气质量最长连续优、良的天数(按照环境空气质量标准,空气污染指数AQI≤50为优级,AQI≤100 为良好),代码如下,绘制的图表如图3 所示。请在横线处填入合适的代码。
图3
import pandas as pd
import matplotlib.pyplot as plt
n=10 #城市个数
count=[0]*n
daymax=[0]*n
for i in range(1,31):
day=str(i)
if len(day)<2:
day='0'+str(i)
daydata='202204'+day+'.csv'
dayaqi=avg(daydata)
city=dayaqi.columns[1:n+1]
for j in range(n):
t=city[j]
if dayaqi.at[0,t]<=100:
①__count[j]+=1__
else:
if count[j]>daymax[j]:
daymax[j]=count[j]
count[j]=0
for k in range(n):
if count[k]>daymax[k]:
②__daymax[k]=count__[k]__
print(daymax)
plt.figure(figsize=(12,4))
x=③__city__
y=daymax
plt.bar(x,y)
plt.show()
【解析】 (1)函数要求计算该天的空气质量指数(AQI) 的平均值,故应按“类型”分组并求平均,①处填:'类型',最后返回AQI 的平均值。②处填:g[g.类型=='AQI'],选项D正确。
(2)①处统计连续优、良的天数,当dayaqi.at[0,t]<=100 时,该城市计数器加1,填count[j]+=1。
②处求count[k]的最大值,填daymax[k]=count[k]。
从图3的图表可以看出,X轴数据为城市名称,从city=dayaqi.columns[1:n+1]可以看出,city 是城市名称列表,③空填:city。
11.针对选考2024·萧山中学检测小天收集了浙江省某年各地市年龄段数据,保存在“T14.xlsx”文件中,如图1 所示。为统计分析各地市不同年龄段的人口占比,小天编写了Python 程序,输出结果如图2 所示。
图1
图2
图3
请回答下列问题。
(1)为统计分析各地市不同年龄段人口占本地市人口比例,编写Python 代码如下,横线①处应填入的代码为__B__(单选,填字母),横线②处应填入的代码为________________。
A.df.groupby(”地市”,as_index=False).count()
B.df.groupby(”地市”,as_index=False).sum()
C.df.groupby(”地市”,as_index=True).mean()
import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_excel(”T14.xlsx”)
df1=①____ # 计算各地市不同年龄段的人数
print(”地市 17 岁及以下 18~34 岁 35~59 岁 60 岁及以上”)
#“df1.values.tolist()”实现将df1 转换为二维列表。列表中每个元素包含5 个数据项,分别对应地市名称和该地市4 个年龄段的人数总计,如['丽水市',501421,…]
df2=df1.values.tolist()
x,y=[],[]
for area in df2:
for c in range(len(area)):
if c==0:
x.append(area[0])
print(area[0],end=”?”)
else:
sm=sum(area[1:]) #sum() 函数实现对序列求和
t=②__area[c]/sm*100____
print('%.2f'%(t),end=”%?”) #按设置格式输出
if c==4:
y.append(t)
print()
plt.title(”浙江省各地市60 岁及以上人数占本地市总人口比例”,fontsize=24)
plt.bar(x,y) #绘制60 岁及以上人数占本地市总人口比例的柱形图
#设置绘图参数,显示如图3 所示,代码略
(2)由图3 可知,60 岁及以上人数占本地市人口比例超过25%的地市有__5__个。
(3)小天编写mygroupby()函数模拟实现上述分类汇总功能,计算各地市不同年龄段的人数,结果以列表形式返回。函数代码如下,请在横线处填入合适的代码。
#df1 为二维列表,列表中每个元素包含6 个数据项,内容如图1 所示;函数返回值dfs 格式同题(1)中的二维列表df2
def mygroupby(df1):
dfs=[] #创建一个空列表dfs
for row in df1:
①__n=len(dfs)__
if n>0:
for j in range(n):
if row[0]==dfs[j][0]:
break
if n==0 or row[0]!=dfs[j][0]:
dfs.append([row[0],0,0,0,0])
j=n
for k in range(2,len(row)):
②__dfs[j][k-1]=dfs[j][k-1]+row[k]__
return dfs
【解析】 (1)本空计算各地市不同年龄段的人数,应采取分组求和的方式,即df.groupby(”地市”,as_index=False).sum()。df2 是一个二维数组,area 是df2 的一个元素,通过c 能访问area 中的一个数据项。area 包含5 个数据项,分别为对应地市名称和该地市4 个年龄段的人数总计。sm 是该地市总人口数量,t 需要计算某个年龄段的人口占比,area[c]访问该年龄段的人数总计。由此可知t 可以通过area[c]/sm*100 计算得到。
(2)观察图3 可以看出,60 岁及以上人数占本地市人口比例超过25%的地市有嘉兴、宁波、湖州、绍兴、舟山,共5 个。
(3)df1 是一个二维数组,row 是df1 的一个元素,包含6 个数据项,分别为对应地市名称、辖区名称和该辖区4 个年龄段的人数。
①由后续两段if 语句可知,本空是对n 的计算,而n 是dfs 中已有元素的个数,可通过求长度得到,即n=len(dfs)
②空分析如下:
if n>0:
for j in range(n):
if row[0]==dfs[j][0]:
break
查找当前读取到的元素area的地市是否已存在于dfs中,如果存在,找到该地市在dfs中的索引位置j
if n==0 or row[0]!=dfs[j][0]:
dfs.append([row[0],0,0,0,0])
j=n
如果没有找到,在dfs中新增一条关于该地市的记录,各年龄段的人数初始化为0
for k in range(2,len(row)):
②________
在dfs[j]的对应位置累加当前读取到的记录row中对应年龄段的人数
答案为:dfs[j][k-1]=dfs[j][k-1]+row[k]或dfs[j][k-1]+=row[k]。
学科网(北京)股份有限公司
$$