第 14 题
答案与解析
第(1)小题
B
D
F
数据处理过程
df = pd.read_excel("data.xlsx") # 读取文件读入DataFrame df,每行记录某宿舍在某一时刻的用电功率,列为“宿舍号”“时间”“功率”。
df2 = df1.groupby("宿舍号",as_index=True).count() # 分组计数按“宿舍号”分组,再分别统计其他列的非空值个数。as_index=True使宿舍号成为index,每行对应一个宿舍,“功率”列存放该宿舍在df1中的功率记录数。
# 重命名df2中'功率'列名称为'次数',代码略将计数结果所在的“功率”列改名为“次数”,宿舍号仍保存在index中。
index名称:宿舍号。N501、N502表示功率列的计数,T501、T502表示时间列的计数,以下用符号展示结果结构。
| index | 时间 | 次数 |
|---|---|---|
| 501 | T501 | N501 |
| 502 | T502 | N502 |
| … | … | … |
m = df3.index[0] # 获取宿舍号,如502取df3第一行的索引标签,保存到m;注释说明该标签是宿舍号。
df4 = df1[df1["宿舍号"]==m]从df1中保留宿舍号为m的记录,筛选后的df4沿用原行索引。
rq=[]
for i in df4.index:
rq.append(str(df4.at[i,"时间"])[8:10]+"日")按df4的行索引读取时间,将字符串中下标8、9处的日期截出并加上“日”,例如“01日”。rq中的日期与df4各行一一对应。
df4.insert(2,"日",rq) # 插入一列,列名"日",值为列表rq把rq作为“日”列插入df4,供后续按日期统计。
plt.plot(df5.index,df5.values)以df5.index为横坐标、df5.values为纵坐标绘制折线。
填空分析
①
每条功率超过2000 W的记录对应一次警报,需先筛选这些完整记录,再按宿舍计数。df["功率"]>2000只产生布尔Series,放入df[...]后才得到保留各列的DataFrame,因此填写df[df["功率"]>2000],选B。
②
m取排序后首行的宿舍号,要让它对应警报最多的宿舍,应按重命名后的“次数”列降序排列,填写df2.sort_values("次数",ascending=False),选D。
③
df4的每行是目标宿舍的一次警报记录。按“日”分组,对各组非空的“宿舍号”计数,即得每日警报次数。绘图需要日期作index、次数作一维values,因此应设置as_index=True并选取“宿舍号”单列,填写df4.groupby("日",as_index=True)["宿舍号"].count(),选F。
结果为Series,名称为“宿舍号”,index名称为“日”。C01、C02等表示对应日期的警报次数。
| index | values |
|---|---|
| 01日 | C01 |
| 02日 | C02 |
| … | … |
| 07日 | C07 |
第(2)小题
j<n-1 and abs(data[j+1]-data[j])<=50
st = i
程序分析
n = len(data)
mlen = 1
st = 0
i = 0
s = data[0]
while i<n:
...
print("最长平缓变化序列长度:",mlen,"起始下标:",st)data按时间顺序存放一周功率数据,程序按非空列表处理。i从0开始,循环条件为i<n;结束后输出mlen和st。
j = i
while ①:
j += 1
t = j-i+1j从i开始逐项向右移动,t=j-i+1计算两端都包含的段长,因而i、j分别对应当前段的起始和结束下标。
if t > 1:
total = 0
for k in data[i:j+1]:
total += k
if t > mlen or (t == mlen and total < s):
mlen = t
s = total
②当t>1时,对data[i:j+1]求和得到total。当前段更长,或等长而总和更小时,才用t、total更新mlen、s。因此mlen、s保存已选段的长度和总和,初值对应下标0的单元素段。
i = j+1i移到当前段之后,下一轮继续向右处理。各段按出现顺序比较,长度、总和都相同时不更新,便保留较早的一段。
填空分析
①
要使当前段尽可能长,下一项存在且与当前末项的差的绝对值不超过50时,j才继续右移。因此填写j<n-1 and abs(data[j+1]-data[j])<=50。先判断j<n-1,可借助and短路避免访问data[n];差恰好为50时仍可接入。
遇到相邻差超过50的断点后,合格连续段都不能跨过它,所以可从断点之后重新开始,比较各个延伸到尽头的连续段。
②
更新分支已将当前段的长度、总和存入mlen、s,还需把同一段的起始下标i保存到st,因此填写st = i。
原程序的if t > 1会跳过单元素段。例如data=[200,100]时,两段长度均为1,应选总和较小的下标1,程序却保留初始下标0。这是固定代码的边界缺陷,两处填空无法消除。
问题反馈
解析有疑问或显示异常?请先复制题目信息,再打开反馈表单填写。
题目编号:2026_04_G3_taizhouermo_q014
