深耕专业教研,探索前沿技术
信息技术来源:台州市2026届高三第二次教学质量评估试题

第 14 题

答案与解析

第(1)小题

参考答案
  1. B

  2. D

  3. 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)小题

参考答案
  1. j<n-1 and abs(data[j+1]-data[j])<=50

  2. 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+1

j从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+1

i移到当前段之后,下一轮继续向右处理。各段按出现顺序比较,长度、总和都相同时不更新,便保留较早的一段。

填空分析

①

要使当前段尽可能长,下一项存在且与当前末项的差的绝对值不超过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。这是固定代码的边界缺陷,两处填空无法消除。