内容正文:
第17课 编程处理数据(见学生用书P91)
——4.2 大数据处理,教材第134~138页
利用matplotlib模块对数据进行可视化处理。
1.matplotlib是一个绘图库,使用其中的__pyplot__子库所提供的函数可以快速绘图和设置图表的坐标轴、坐标轴刻度、图例等。
2.在Python中导入matplotlib的pyplot子库的方法为:
import matplotlib.pyplot as plt
3.matplotlib模块的常用绘图函数
分类
函数
说明
创建对象
figure()
创建一个新的图表对象,并设置为当前绘图对象
注:不创建figure对象,直接调用plot等绘图函数进行绘图,matplotlib会自动创建一个figure对象
绘制图形
__plot()__
绘制线形图
bar()
绘制垂直柱形图
barh()
绘制水平柱形图
scatter()
绘制散点图
续表
分类
函数
说明
修饰美化
__title()__
设置图表的标题
xlim()、ylim()
设置X、Y轴的取值范围
xlabel()、ylabel()
设置X、Y轴的标签
legend()
显示图例
显示
show()
显示创建的所有绘图对象
4.语法说明
(1)figure(num=None,figsize=None,dpi=None,facecolor=None,edgecolor=None,frameon=None)
num为图像标号;figsize为figure的高度和宽度;dpi为figure的分辨率;facecolor为背景颜色;edgecolor为边框颜色;frameon为边框显示情况。
(2)plt.plot(x,y,label='cos(x)',color='r',linewidth='2')
color为线条颜色;linewidth为线条宽度。
如图1所示,小林将收集到的各地区的油价存于文件“数据.xlsx”中,并对数据进行了如下操作:
(1)筛选出对象“df”中数据“0号柴油”不大于8.4元的数据行,保存到对象“d5”中;
(2)统计对象“d5”中的各个地域的地区个数,并绘制图表,如图2所示。
图1 图2
import pandas as pd
import matplotlib.pyplot as plt
plt.rc('font',**{'family':'SimHei'})
df=pd.read_excel('数据.xlsx')
df.at[19,'92号汽油']=8.8
df=df.sort_values('地区',ascending=False)
d5=df[df['0号柴油']<=8.4]
# 情况1:以“地域”为分组依据,由“d5.groupby('地域')”可知,缺少属性“as_index”,则值默认为True,语句等价为“d5.groupby('地域',as_index=True)”,则分组依据“地域”作为索引
g=d5.groupby('地域').count()
plt.bar(g.index,g.地区)
plt.title('地域分布图')
plt.show()
# 情况2:以“地域”为分组依据,由“d5.groupby('地域',as_index=False)”可知,分组依据“地域”不作为索引
g=d5.groupby('地域',as_index=False).count()
plt.bar(g.地域,g.地区)
plt.title(”地域分布图”)
plt.show()
# 情况3:以地域为分组依据,由“d5.groupby('地域',as_index=True)['地区'].count()”得知,单独对地区列计算,g为Series对象
g=d5.groupby('地域',as_index=False) ['地区'].count()
plt.bar(g.index,g.values)
plt.title(”地域分布图”)
plt.show()
有如下Python程序段:
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import random
s1=random.sample('abcdefghij',5)
items=[1,2,3,4,5]
random.shuffle(items) #随机排列items中的值
plt.bar(s1,items)
plt.show()
执行该程序段后,输出的结果可能是( B )
A. B. C. D.
【解析】 语句“s1=random.sample('abcdefghij',5)”是5个小写字母;语句“plt.bar(s1,items)”产生柱形图,横坐标是s1,选项B正确。
变式 用于绘制x5+x4+x-3=0图像的Python程序代码如下。
import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(-1,2,300)
y=x**5+x**4+x-3
plt.plot(x,y)
plt.title('x^5+x^4+x-3')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()
下列选项不正确的是( C )
A.np.linspace(-1,2,300)表示在[-1,2]之间,生成300个等差数
B.plt.plot(x,y)表示绘制线形图
C.plt.xlabel('X')、plt.ylabel('Y')表示绘制X、Y轴
D.plt.show()表示显示图像
【解析】 plt.xlabel('X')、plt.ylabel('Y')表示设置X、Y轴的标签,选项C错误。
小明收集了全国各地区某年第一、二、三、四季度的季度生产总值,并将其存储在“生产总值.xlsx”中,其数据格式如图1所示。
图1
请回答下列问题。
(1)小明收集的数据存在一些问题,需要进行数据整理,下列说法不正确的是__A__(单选,填字母)。
A.不符合一般规律的异常数据应该直接删除
B.数据集中格式不一致的数据,需要进行数据转换
C.重复的数据应在进一步审核的基础上进行合并或删除等操作
D.缺失的数据通常可采用平均值、中间值或概率统计值来填充缺失值
(2)为了找出平均生产总值最大的五个地区,小明通过Python编程进行数据处理,并以图表的形式呈现结果。实现上述功能的Python程序如下,运行结果如图2所示,请在横线处填入合适的代码。
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams[”font.sans——serif”]=[”SimHei”] #中文显示
df=pd.read_excel(”生产总值.xlsx”)
g=df.groupby()
g=g.①__mean()__
df1=g.sort_values(”生产总值”,ascending=②__False__)
图2
x=df1.地区[0:5]
③__y=df1.生产总值[0:5]__或__y=df1.生产总值.head(5)__
plt.④__bar__ (x,y,label=”季度平均值”)
plt.title(”全国生产总值季度平均值前五的地区”)
plt.xlabel(”地区”)
plt.ylabel(”平均值”)
plt.legend()
plt.show()
(3)上述程序加框处应填入的代码为__A__(单选,填字母)。
A. ”地区”,as_index=False B. ”地区”,as_index=True
C. ”生产总值”,as_index=False D. ”生产总值”,as_index=True
【解析】 (1)选项A,不符合一般规律的异常数据中可能包含重要的信息,不能直接删除,选项错误。
(2)根据题意,本题生成的图表为各地区四个季度的平均值最大的前5项,所以应按“地区”分类,对四个季度求平均值,故第①空填入mean();再结合最大的前5行,第②空填入 False;第③空设置图表的Y轴数据为生产总值前5项,故填入y=df1.生产总值[0:5];第④空是绘制柱形图,填入bar。
(3)根据前面题意分析应按“地区”分类,且取“地区”列数据是通过列号来取的,所以分类完后前面应该有0,1…索引行,as_index的值应为False。
变式1 2024·诸暨中学检测某次模拟考试成绩存储在“Scores.xlsx”数据文件中(如图1 所示),现利用Excel 软件与Python程序对这些数据进行统计分析并可视化,请回答下列问题。
(1)在Excel 软件中计算每位学生的成绩总分。选择M2 单元格输入公式,然后利用自动填充功能完成区域M3:651 的计算,则M2 单元格的公式为=SUM(__C2:L2__)。
图1
(2)利用Pandas 模块读取数据,统计出各选科组合的选择人数,部分程序代码如下,请在横线处填入合适的代码。
df=pd.read excel(”Scores.xlsx”)
df1=df.groupby(”选科”,as_index=False)
df2=df1.__count()__#统计各选科组合的人数
df2=df2.rename(columns=(”学号”:”人数”))
(3)为了获取选科人数最多的前8 个组合,结果如图2 所示,下列代码可行的是__CD__(多选,填字母)。
A.df3=df2.sort_values(”人数”).tail(8)
B.df3=df2.sort_values(”人数”).head(8)
C.df3=df2.sort_values(”人数”),ascending=False)[0:8]
D.df3=df2.sort_values(”人数”),ascending=False).head(8)
图2 图3
(4)对处理后的数据进行可视化操作,结果如图3 所示,部分程序代码如下,请在横线处填入合适的代码。
plt.bar(__df3.选科,df3.人数__或__df3[”选科”],df3[”人数”]__) #绘制柱形图
plt.title(”选科人数最多的前8 个组合”) #设置标题
plt.show()
【解析】 (1)总分为对应C列至L 列的数据之和,公式为=SUM(C2:L2)。
(2)计数用函数count()。
(3)从图2 可以看出,数据按人数做了降序排序,选项A、B 未加参数ascending=False,选项错误。取前8人可以用head(8)或采用切片方式[0:8],故选项C、D正确。
(4)从图3 可以看出,数据来自df3 对象的选科和人数两列。
变式2 2024·萧山中学检测小明收集了学校某次考试的成绩,部分成绩情况如图1所示。为统计分析考试成绩,小明编写了Python 程序。请回答下列问题。
图1 图2
(1)处理成绩数据:小明需要将第1 位同学的语文成绩由138 改为135,统计并输出“七选三”科目的考试人数,再筛选出语文成绩大于等于100 的数据行,存入df1 对象。请在横线处填入合适的代码。
import pandas as pd
df=pd.read_excel('exam.xlsx')
①__df.at[0,'语文']=135__或dg['语文'][0]=135__#将第1 位“张吉雅”同学的语文成绩修改为135
▲____#此处多选,选项在第(2)小题中
for km in df.columns[6:13]: #统计并输出“七选三”科目的考试人数
renshu=②__df[km].count()__
print(km,renshu)
df1=③__df[df['语文']>=100]__
(2)统计语数英总分:上述程序中加▲的横线处应填入的代码为__AB__(多选,填字母)。
A.df['语数英总分']=df['语文']+df['数学']+df['英语']
B.df.语数英总分=df.语文+df.数学+df.英语
C.df.'语数英总分'=df.'语文'+df.'数学'+df.'英语'
D.df.['语数英总分']=df.['语文']+df.['数学']+df.['英语']
(3)小明需要根据df1 对象的数据建立一张男女生语文成绩均分比较条形图,如图2 所示。下列程序中加▲的横线处应填入的代码为__C__(单选,填字母)。
A.groupby('语文')['性别'].mean()
B.groupby('性别').mean()
C.groupby('性别')['语文'].mean()
D.groupby('性别',as_index=False)['语文'].mean()
import matplotlib.pyplot as plt
plt.rc('font', **{'family': 'SimHei'}) #设置显示中文字体
g=df1.____▲____#此处单选,选项在第(3)小题中
plt.barh(g.index,g.values)
plt.title('男女生语文成绩均分比较')
plt.show()
【解析】 (1)①第1行的行索引是0,使用at方式,答案为df.at[0,'语文']=135;不使用at,答案为df['语文'][0]=135。
②学考从第7列开始(列索引为6),逐列提取并统计。
③筛选出语文成绩大于或等于100 的数据行,采用条件筛选。
(2)“df['语数英总分']”采用字典法表示,“df.语数英总分”采用属性法表示,选项A、B正确。
(3)由语句“plt.barh(g.index,g.values)”可知,选项C正确。
|随|堂|检|测|
1.小李利用他所学习的知识帮助老师整理成绩单,部分界面如图1所示。
图1
(1)为统计每个学生的技术成绩排名,选中F2单元格并输入公式,然后利用自动填充完成F2:F393的数据计算,发现结果有误,请修改F2单元格的计算公式:__=RANK(E2,E$2:E$393)__。(提示:RANK函数用于计算某单元格中数据在某区域内的排名,如=RANK(G2,G2:G100),计算G2单元格中数据在G2:G100的排名)
(2)根据表格“chengji.xlsx”中的数据利用如下Python 程序计算出如图2的结果, 并绘制图表,如图3所示,请在横线处填入合适的代码。
图2 图3
import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_excel(”chengji.xlsx”)
g=①__df.groupby__(”班级”,as_index=False)
average=g.mean()
print(round(average,2))
a=average[”班级”]
b=average[”技术总分”]
plt.title(”Average Score”)
plt.②__plot__(a,b)
plt.show()
【解析】 (1)使用排名函数RANK,在自动填充过程中需要加上绝对引用。
(2)①按班级进行分组;②绘制的是折线图,使用plot。
2.2024·长兴中学检测小林收集了各地市各年份检测的PM2.5浓度值,并保存于Excel文件“PM2.5.xlsx”中,部分数据如图1所示。小林使用Python进行数据分析。
图1 图2
请回答下列问题。
(1)小林先将同一个地区的数据输出到各自独立的Excel文件中,部分结果如图2所示,实现上述功能的Python程序段如下:
import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_excel(”PM2.5.xlsx”)
# cities保存所有地区名称,此处仅演示部分数据
cities=[”安吉县”,”淳安县”,”慈溪市”,”杭州市”,”湖州市”]
for city in cities:
dfc=________
dfc.to_excel(city+”.xlsx”,index=False) # 输出文件结果如图2所示
上述程序段中横线处可填入的代码有__AC__(多选,填字母)。
A.df[df[”地区名称”]==city] B.df[df[”地区名称”]]==city
C.df[df.地区名称==city] D.df[df.”地区名称”]]==city
(2)对于图1所示的原始数据,小林要进行数据整理:删除“地区编码”“指标名称”“计量单位”等对后面统计无用的数据列。请在横线处填入合适的代码。
df=pd.read_excel(”PM2.5.xlsx”)
# 删除“地区编码”“指标名称”“计量单位”数据列
df=df.drop([”地区编码”,”指标名称”,”计量单位”],axis=__1__ )
(3)对于整理后的数据,在同一个地市中取历次PM2.5浓度最高的值,然后将数据按PM2.5浓度值升序排序,最后输出排序后的最后5行结果,输出结果如图3所示。下列程序中横线处应填入的代码为__D__(单选,填字母)。
A.df.groupby(”PM2.5”).max() B.df.groupby.地区名称.max()
C.df.sort_values(”PM2.5”).max() D.df.groupby(”地区名称”).max()
# 同一个地市中取历次PM2.5浓度最高的值
dfg=________
# 按PM2.5浓度值升序排序
dfg=dfg.sort_values(”PM2.5”,ascending=True)
# 输出排序后的最后5行结果
print(dfg.tail())
图3 图4
(4)在排序后的数据中分别取PM2.5浓度值最高和最低的5行数据,将其合并成新的DataFrame对象,并绘制柱形图,如图4所示。请在横线处填入合适的代码。
df2=pd.concat([dfg.head(5),dfg.tail(5)]) # 合并两个对象成为新的DataFrame对象
plt.rcParams['font.sans——serif']=['KaiTi','SimHei','FangSong'] # 设置图表字体
plt.figure(figsize=(8,4))
plt.title(”部分地市PM2.5浓度值对比”)
plt.bar(①__df2.index__,df2[”PM2.5”],color=”orange”)
for i in range(len(df2)):
x=df2.index[i]
y=②__df2[”PM2.5”][i]__
# text()方法可以绘制数据标签,语法:text(横坐标,纵坐标,显示内容)
plt.text(x,y,'%d'%y)
【解析】 (1)由题意可知,程序需要将“地区名称”符合条件的数据行筛选出来输出的独立Excel文件,而数据筛选的格式是df[条件],其中“条件”部分是关于数据列的一个关系表达式,选项A、C正确,选项B、D的使用格式错误。
(2)pandas处理数据函数,既可以处理行也可以处理列,drop()就是如此,参数axis=1表示处理列,即删除指定的列。
(3)同一个地市中取PM2.5浓度值最高的数据行可以用分组函数groupby()和求最大值函数max()实现,其中groupby()函数的参数是地区名称,选项D正确。选项A的分组依据错误,因为它会将PM2.5浓度值相同的数据行分到同一组中,而不是按地区分组。选项B的函数格式错误。选项C是按PM2.5浓度值先升序排序,然后求所有数据中的最大值,此时PM2.5浓度最高的值只有一个数据,无法求出各个地市的PM2.5浓度最高值。
(4)plt.bar()函数绘制柱形图需要两个参数:X轴数据和Y轴数据(每个x对应的纵轴数据)。由题中图3和图4可知,横坐标是各个地区的名称,而由于数据框df2是分组后的结果,地区名称列已经成为了索引列,因此第①空应该填写df2.index。第②空,由程序和标签的效果图可知df2.index[i]取出了每行数据的横坐标值,类似地,对应的纵坐标值是df2[”PM2.5”][i]。
温馨提示:请完成高效作业17 )
学科网(北京)股份有限公司
$$