版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十二章数据处理1常州工业职业技术学院19五月2026丁辉袁凯烽商俊燕韩少勇范晓玲郝亚平王霞俊吴春晖目录
Contents01numpy模块02Pandas模块03Matplotlib模块04050704数据处理精选案例小结2numpy模块014numpy是在Python中进行科学计算,尤其是数据分析时,所用到的一个基础库。numpy是科学计算包,支持N维数组运算、处理大型矩阵、矢量运算、线性代数、傅立叶变换以及随机数生成等功能。pandas库充分借鉴了numpy的相关概念。numpy将常用的数学函数进行数组化,这些数学函数能够直接对数组进行操作,明显地提高程序的运算速度。0.概述5使用array()函数创建>>>importnumpyasnp#导入numpy库>>>ya=np.array((1,2,3,4))>>>yb=np.array(((1,2,3,4),(5,6,7,8),(9,10,11,12)))>>>yc=np.array([(1,2,3,4),(5,6,7,8),(9,10,11,12)])>>>la=np.array([5,6,7,8])>>>lb=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])>>>print("ya:","\n",ya)ya:[1234]>>>print("yb:","\n",yb)yb:[[1234][5678][9101112]]>>>print("yc:","\n",yc)yc:[[1234][5678][9101112]]>>>print(“la:","\n",la)la:[5678]>>>print(“lb:","\n",lb)lb:[[1234][5678][9101112]]>>>zz=np.zeros((3,3))#用zeros()函数创建全0数组>>>print(zz)[[0.0.0.][0.0.0.][0.0.0.]]1.数组对象的创建6>>>no=np.ones((3,3))#用ones()函数创建全1数组>>>print(no)[[1.1.1.][1.1.1.][1.1.1.]]>>>na=np.arange(0,10)#用arrange()函数创建数组>>>print(na)[0123456789]>>>na=np.arange(4,8)>>>print(na)[4567]#用random()函数生成随机数>>>nr=np.random.random((3,3))>>>print(nr)[[0.190729870.468048610.11329046][0.803860930.33965850.24501026][0.511152340.200445040.65714201]]使用特殊函数创建1.数组对象的创建7shape属性:表示数组的大小。>>>print(ya.shape)(4,)>>>print(yb.shape)(3,4)>>>yb=np.array(((1,2,3,4),(5,6,7,8),(9,10,11,12)))#将yb数组的形(3,4)通过reshape()函数改成了(2,6)>>>ybre=yb.reshape(2,6)>>>print(ybre)[[123456][789101112]]>>>print(ybre.shape)(2,6)ndim秩属性:数组的维称为轴,轴的数量称为秩。要获取数组的轴数量或秩,使用数组的ndim属性。>>>print(ya.ndim)1>>>print(yb.ndim)22.数组的属性size属性:表示数组中元素的总个数,等于shape属性中元组元素的乘积。>>>print(yb.size)12dtype属性:用来描述数组中元素的数据类型。>>>print(ya.dtype)int32itemsize属性:表示数组中每个元素的字节大小。>>>print(ya.itemsize)48算术运算:数组的第一类运算是使用算术运算符进行的算术运算。>>>na=np.arange(0,4)>>>nj=na+4>>>njj=na-1>>>nc=na*2>>>ncc=na/2>>>print(nj,njj,nc,ncc)[4567][-1012][0246][0.0.51.1.5]在numpy中,这些运算符为元素级,只用于位置相同的元素之间进行运算,所得到的运算结果组成一个新的数组。3.数组的基本操作9>>>na=np.arange(0,4)>>>nb=np.arange(2,10,2)>>>print(na)[0123]>>>print(nb)[2468]>>>nj=na+nb>>>njj=na-nb>>>nc=na*nb>>>ncc=na/nb>>>print(nj,njj,nc,ncc)[25811][-2-3-4-5][041224][0.0.250.333333330.375]3.数组的基本操作10函数运算:numpy中内置了很多运算函数,它们的计算速度非常快。numpy中函数有通用函数和聚合函数。>>>na=np.arange(1,4)>>>ns=np.sin(na)>>>nq=np.sqrt(na)>>>nl=np.log(na)>>>print(ns,nq,nl)
[0.841470980.909297430.14112001][1.1.414213561.73205081][0.0.693147181.09861229]>>>na=np.arange(1,13).reshape(3,4)>>>print(na)[[1234][5678][9101112]]>>>nzz=na.transpose()#转置>>>print(nzz)[[159][2610][3711][4812]]>>>na=np.arange(1,4)>>>ns=np.sum(na)#聚合函数,对一组数进行操作,返回一个单一值作为结果的函数>>>nm=np.min(na)>>>nma=np.max(na)>>>nme=np.mean(na)>>>print(ns,nm,nma,nme)6132.03.数组的基本操作11数组索引机制:指的是用方括号“[]”加序号(索引)的形式引用单个数组元素,利用索引机制可以抽取元素,选取数组的几个元素,也可以为其赋一个新值。numpy数组可以从左向右索引也可以从右向左索引。>>>na=np.arrange(1,4)>>>print(na[0],na[1],na[2])123>>>print(na[-1],na[-2],na[-3])321>>>na=np.arange(1,10).reshape(3,3)>>>print(na[0],na[1],na[2])[123][456][789]>>>print(na[0,0],na[1,2])164.数组的索引、切片等12切片操作:是指抽取数组的一部分元素生成新数组。如想抽取(或查看)数组的一部分,必须使用切片句法。切片方法同字符串、列表等有序序列。>>>na=np.arange(1,10)>>>print(na)[123456789]>>>naq=na[1:5]>>>print(naq)[2345]>>>print(na[1:5:2])[24]在切片时,如省去第一个数字,numpy会认为第一个数字是0(对应数组的第一个元素);如省去第二个数字,numpy则会认为第二个数字是数组的最大索引值;如省去最后一个数字,它被默认为1,也就是抽取所有元素而不再考虑间隔。>>>print(na[::2],na[:5:2],na[:5])[13579][135][12345]4.数组的索引、切片等13迭代:只需要使用for结构就可以了。>>>na=np.arange(1,10)>>>foriinna:print(i,end='')123456789对于二维数组的迭代使用两层for结构,第一层循环扫描数组的行,第二层循环扫描数组的列。如果想遍历矩阵的每个元素,可以使用flat属性。>>>na=np.arange(1,13).reshape(3,4)>>>foriinna:print(i)[1234][5678][9101112]>>>forilinna.flat:print(il,end=‘**')1**2**3*4**5**6**7**8**9**10**11**12**4.数组的索引、切片等pandas模块0215pandas是基于numpy构建的含有更高级数据结构和工具的数据分析包,是一个专门用于数据分析的开源Python库。目前,所有使用Python语言研究和分析数据集的专业人士,在做统计分析和决策时,pandas都是他们的基础工具。它能够以最简单的方式提供数据处理、数据抽取和数据操作所需的全部工具。pandas定义了三种数据结构,即Series、DataFrame、Panel。数据分析常用的是Series、DataFrame。pandas常用的引入方式>>>frompandasimportSeries,DataFrame>>>importpandasaspd1.pandas简介16Series对象类似numpy一维数组的数据结构,同时每个元素带有标签(lable)或者说索引(index)。支持float、int、bool、datatime、timedelta、category、object类型。①创建Series对象可以使用Series()构造函数来声明,把要存放在Series对象中的数据以数组形式传入。>>>frompandasimportSeries>>>sn=Series([1,2,3,'as'])>>>print(sn)011223Asdtype:object>>>sn=Series([1,2,3,‘as’],index=[‘a’,‘b’,‘c’,‘d’])
#增加索引参数>>>print(sn)a1b2c3dasdtype:object2.Series对象索引/标签指定的索引创建时指定索引17>>>print(sn.index)Index(['a','b','c','d'],dtype='object')>>>print(sn.values)[1,2,3,'as']②访问Series内部元素>>>sn=Series([1,2,3,4],index=['a','b','c','d'])>>>print(sn[2],sn['c’])33>>>print(sn[0:2])a1b2dtype:int64
2.Series对象18
DataFrame对象是一种二维的表结构,类似Excel中的工作表。pandas的DataFrame可以存储多种不同的数据类型,并且每一个坐标轴都有自己的标签。DataFrame由按一定顺序排列的多列数据组成,各列的数据类型可以不同。①创建DataFrame对象>>>importpandasaspd>>>frompandasimportDataFrame>>>data={‘id’:[2000,2001,2002,],‘name’:[‘lily’,‘apple’,‘micky’],‘age’:[15,17,19]}#从字典创建>>>frame1=DataFrame(data)>>>print(frame1)idnameage02000lily1512001apple1722002micky193.DataFrame对象行索引列名19②
通过属性来获取元素使用DataFram对象的columns属性,可以获取DataFram中所有列名。>>>fc=frame1.columns>>>print(fc)Index(['id','name','age'],dtype='object‘)使用DataFram对象的index属性获取索引列表,values属性获取所有元素。>>>print(frame1.index)RangeIndex(start=0,stop=3,step=1)>>>print(frame1.values)[[2000'lily'15][2001'apple'17][2002'micky'19]]3.DataFrame对象20③函数应用>>>frame2=pd.DataFrame(np.arange(6).reshape((2,3)),columns=['id','name','age’])>>>print(frame2)
idnameage00121345>>>fs=np.sqrt(frame2)>>>fm=np.max(frame2)>>>fmean=np.mean(frame2)>>>print(fs)idnameage00.0000001.01.41421411.7320512.02.236068>>>print(fm)id3name4age5dtype:int32>>>print(fmean)
id1.5name2.5age3.5dtype:float64按列进行计算3.DataFrame对象21④NaN(缺失值)数据处理pandas中使用浮点值NaN(NotaNumber)表示浮点和非浮点数组中的缺失数据。>>>frompandasimportSeries,DataFrame>>>importnumpyasnp>>>importpandasaspd>>>ser=pd.Series([0,1,np.NaN,3],index=['red','blue','white','green'])>>>print(ser)red0.0blue1.0whiteNaNgreen3.0dtype:float64>>>ser.dropna()#过滤掉缺失值red0.0blue1.0green3.0dtype:float643.DataFrame对象22>>>frame1=pd.DataFrame([[1,np.NaN,np.NaN],[2,np.NaN,np.NaN]],columns=['id','name','age'])>>>f=frame1.dropna()#只要有NaN,则整列或整行被删除>>>print(f)
EmptyDataFrameColumns:[id,name,age]Index:[]
>>>print(frame1.dropna(how=‘all’))#只会删除全列或行都为NaN的列或行
idnameage01NaNNaN12NaNNaN>>>print(frame1.fillna(5))#用一个值替换NaNidnameage015.05.0125.05.0>>>print(frame1.fillna({'name':'zhanglin','age':25}))
idnameage01zhanglin25.012zhanglin25.03.DataFrame对象23①使用merge()函数进行合并merge()函数的格式为:merge(left,right,how='inner',on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=True,suffixes=('_x','_y'))
left与right:两个不同的DataFrame。how:指合并(连接)的方式,有inner(内连接),left(左外连接),right(右外连接),outer(全外连接),默认为inner。on:
指用于连接的列名。必须存在左右两个DataFrame对象中,如果没有指定且其它参数也未指定则以两个DataFrame的重叠列名做为连接键。4.数据集成pandas.merge()函数可根据一个或多个键将不同DataFrame中的行连接起来;pandas.concat()函数可以沿着一条轴将多个对象堆叠到一起。24left_on:左则DataFrame中用作连接键的列名。当两个DataFrame对象中没有相同列名,但有含义相同的列时,就可以使用这个参数。right_on:与left_on配合使用,右则DataFrame中用作连接键的列名。left_index:使用左则DataFrame中的行索引作为连接键。right_index:使用右则DataFrame中的行索引作为连接键。sort:默认为True,将合并的数据进行排序。在大多数情况下设置为False可以提高性能。suffixes:字符串值组成的元组,用于指定当左右DataFrame存在相同列名时,在列名后面附加的后缀名称,默认为(‘_x’,‘_y’)。4.数据集成25>>>frame1=pd.DataFrame({'id':['101','102','103'],'name':['lily','mike','jerry']})>>>frame2=pd.DataFrame({'id':['101','102','104'],'score':[84,93,76]})
#对两个DataFrame对象应用merge()函数,执行合并操作>>>print(pd.merge(frame1,frame2))#默认按id进行合并
idnamescore0101lily84102mike93>>>frame1=pd.DataFrame({'id':['101','102','103'],'name':['lily','mike','jerry']})>>>frame2=pd.DataFrame({'sid':['101','102','104'],'score':[84,93,76]})>>>print(fml=pd.merge(frame1,frame2,left_on='id',right_on='sid'))#设置left_on=‘id’、right_on=‘sid’,将frame1对象中的id和frame2对象中的sid作为连接键idnamesidscore0101lily10184102mike10293>>>frame1=pd.DataFrame({'id':['101','102','103'],'name':['lily','mike','jerry']})>>>frame2=pd.DataFrame({'id':['101','102','104'],'score':[84,93,76]})
>>>fml=pd.merge(frame1,frame2,how=‘left’,)#不同的合并方式>>>fmr=pd.merge(frame1,frame2,how='right')>>>fmo=pd.merge(frame1,frame2,how='outer')>>>fmi=pd.merge(frame1,frame2,how='inner')4.数据集成26>>>print(fml)
idnamescore0101lily84.01102mike93.02103jerryNaN>>>print(fmr)idnamescore0101lily841102mike932104NaN76>>>print(fmo)idnamescore0101lily84.01102mike93.02103jerryNaN3104NaN76.0>>>print(fmi)idnamescore0101lily841102mike934.数据集成27concat()函数的格式为:concat(objs,axis=0,join='outer,ignore_index=False)
objs:参与连接的多个对象的列表,唯一必须给定的参数。axis:指明连接的轴向,0是纵轴,1是横轴,默认是0。join:“inner”(交集),“outer”(并集),默认是“outer”。Ignore_index:重建索引,默认为False。>>>frame1=pd.DataFrame({'id':['101','102','103','105'],'name':['lily','mike','jerry','tom']})>>>frame2=pd.DataFrame({'id':['101','102','104'],'name':['lily','mike','peppg']})
>>>print(pd.concat([frame1,frame2],axis=0))#axis=0,纵轴连接idname0101lily1102mike2103jerry3105tom0101lily1102mike2104peppg②使用concat()函数进行拼接4.数据集成28>>>print(pd.concat([frame1,frame2],axis=1))#横轴连接idnameidname0101lily101lily1102mike102mike2103jerry104peppg3105tomNaNNaN>>>frame1=pd.DataFrame({'id':['101','102','103','105'],'name':['lily','mike','jerry','tom']})>>>frame2=pd.DataFrame({'id':['101','102','104'],'name':['lily','mike','peppg']})>>>fco=pd.concat([frame1,frame2],axis=1,join=‘outer’)#并集>>>fc=pd.concat([frame1,frame2],axis=1,join=‘inner’)#交集>>>print(fco)idnameidname0101lily101lily1102mike102mike2103jerry104peppg3105tomNaNNaN>>>print(fc)
idnameidname0101lily101lily1102mike102mike2103jerry104peppg4.数据集成29【例12-1】dianying.csv中包含多个城市中多部电影的票房信息,要求任选dianying.csv中某部电影统计其上映天数和日平均票房。分析:dianyig.csv文件中包含有电影名称、上映时间、下线时间、公司、导演、主演、类型、票房、城市信息。首先筛选出该电影的电影名称、电影上映时间、下线时间、票房信息等列;接着对筛选出的信息进行去重、去空等清洗处理;再将新数据进行格式转换;最后统计电影的上映天数和日平均票房。#eg12_1.py#导入pandas库importpandasaspd#读入csv中的数据,以“;”作为分割添加字段名df=pd.read_csv('dianying.csv',delimiter=';',encoding='utf-8',names=['电影名称','上线时间','下线时间','公司','导演','主演','类型','票房','城市'])#筛选影片《冲上云霄》数据dyxx=df[df['电影名称']=='《冲上云霄》'].loc[:,['电影名称','上线时间','下线时间','票房','城市']]#去重处理,并进行重新索引dyxx=dyxx.drop_duplicates().reset_index().drop('index',axis=1)#去除票房列多余的字符‘票房(万)’,且转为float类型
dyxx['票房']=dyxx['票房'].str.split(')').str[1].astype(float)综合示例30#将时间列转换datetime时间类型dyxx['上线时间']=pd.to_datetime(dyxx['上线时间'])dyxx['下线时间']=pd.to_datetime(dyxx['下线时间'])#计算上映总天数day=(dyxx['下线时间'].max()-dyxx['上线时间'].min()).days+1#计算总票房box=dyxx['票房'].sum()#计算平均票房
avg_box=box/day#输出计算结果print(dyxx[‘电影名称’][0],‘电影上映:’,day,‘天’,‘;日平均票房:',avg_box)
综合示例Matplotlib模块031.数据可视化概述在数据分析工作中,数据可视化是重要的一步。
数据可视化是以图形或图表的形式展示数据。数据可视化后,可以更加直观地帮助人们快速地理解数据,发现数据的关键点。
数据可视化技术是关于数据视觉表现形式的科学技术研究。主要指较为高级的技术方法,而这些技术方法允许利用图形、图像处理、计算机视觉以及用户界面,通过表达、建模以及对立体、表面、属性和动画的显示,对数据加以可视化解释。Python语言有丰富的、功能强大的、第三方库的支持,在数据可视化方面具有较强的功能。3233数据可视化对于数据描述以及探索性分析至关重要,恰当的统计图表可以更有效的传递数据信息。在Python中已经有很多数据可视化方面的第三方库,例如:Matplotlib、pandas、Seaborn、ggplot、Bokeh、pygal、geoplotlib等。matplotlib是一个Python绘图库,已经成为Python中公认的数据可视化工具,通过matplotlib可以很轻松地画一些或简单或复杂的图形,几行代码即可生成折线图、直方图、条形图、散点图等,使用方便简单。pandas库变得更加普及,它的身影经常见于市场分析、金融分析以及科学计算中。作为数据分析工具的集大成者,pandas作者曾说,pandas中的可视化功能比matplotlib的子库pyplot更加简便和功能强大。通常情况下pandas就足够应付全部的可视化工作了。Seaborn是基于matplotlib产生的一个模块,专攻于统计可视化,可以和pandas进行无缝链接,使初学者更容易上手。相对于matplotlib,Seaborn语法更简洁,两者关系类似于numpy和pandas之间的关系。
HoloViews是一个开源的Python库,可以用非常少的代码行完成数据分析和可视化,除了默认的matplotlib后端外,还添加了一个Bokeh后端。Bokeh提供了一个强大的平台,通过结合Bokeh提供的交互式小部件,可以使用HTML5canvas和WebGL快速生成交互性和高维可视化,非常适合于数据的交互式探索。Altair是Python一个公认的统计可视化库。它的API简单、友好、一致,并建立在强大的vega-lite(交互式图形语法)之上。AltairAPI不包含实际的可视化呈现代码,而是按照vega-lite规范发出JSON数据结构。由此产生的数据可以在用户界面中呈现,这种优雅的简单性产生了漂亮且有效的可视化效果,且只需很少的代码。2.可视化工具简介34PyQtGraph是在PyQt4/PySide和numpy上构建的纯Python的GUI图形库。它主要用于数学、科学、工程领域。尽管PyQtGraph完全是在Python中编写的,但它本身就是一个非常有能力的图形系统,可以进行大量的数据处理,数字运算;使用了Qt的GraphicsView框架优化和简化了工作流程,实现以最少的工作量完成数据可视化,且速度也非常快。
ggplot是基于R的ggplot2和图形语法的Python绘图系统,实现了更少的代码绘制更专业的图形。它使用一个高级且富有表现力的API来实现线、点等元素的添加,颜色的更改等不同类型可视化组件的组合或添加,而不需要重复使用相同的代码,然而这对那些试图进行高度定制的用户来说,ggplot并不是最好的选择,尽管它也可以制作一些非常复杂、好看的图形。ggplot与pandas紧密联系。如果你打算使用ggplot,最好将数据保存在DataFrames中。
Bokeh是一个Python交互式可视化库,支持现代化web浏览器展示(图表可以输出为JSON对象、HTML文档或者可交互的网络应用)。它提供风格优雅、简洁的D3.js的图形化样式,并将此功能扩展到高性能交互的数据集、数据流上。使用Bokeh可以快速便捷地创建交互式绘图、仪表板和数据应用程序等。
Bokeh能与NumPy、Pandas、Blaze等大部分数组或表格式的数据结构完美结合。pygal是一种开放标准的矢量图形语言,它基于XML(ExtensibleMarkupLanguage),可以生成多个输出格式的高分辨率Web图形页面,还支持给定数据的HTML表导出。用户可以直接用代码来描绘图像,可以用任何文字处理工具打开SVG图像,通过改变部分代码来使图像具有交互功能,并且可以插入到HTML中通过浏览器来观看。
VisPy是一个用于交互式科学可视化的Python库,快速、可伸缩、且易于使用,是一个高性能的交互式2D/3D数据可视化库,利用了现代图形处理单元(gpu)的计算能力,通过OpenGL库来显示非常大的数据集。2.可视化工具简介35NetworkX是一个Python包,用于创建、操纵和研究复杂网络的结构、以及学习复杂网络的结构、功能及其动力学。NetworkX提供了适合各种数据结构的图表、二合字母和多重图,还有大量标准的图算法,网络结构和分析措施,可以产生随机网络、合成网络或经典网络,且节点可以是文本、图像、XML记录等,并提供了一些示例数据(如权重,时间序列)。NetworkX测试的代码覆盖率超过90%,是一个多样化,易于教学,能快速生成图形的Python平台。Plotly的Pythongraphinglibrary在网上提供了交互式的、公开的,高质量的图表集,可与R、Python、Matlab等软件对接。它拥有在别的库中很难找到的几种图表类型,如等值线图,树形图和三维图表等,图标类型也十分丰富,申请了API密钥后,可以一键将统计图形同步到云端。但美中不足的是,打开国外网站会比较费时,且一个账号只能创建25个图表,除非你升级或删除一些图表。folium是一个建立在Python系统之上的js库,可以很轻松地将在Python中操作的数据可视化为交互式的单张地图,且紧密地将数据与地图联系在一起,可自定义箭头、网格等HTML格式的地图标记。该库还附有一些内置的地形数据。Gleam允许你只利用Python构建数据的交互式,生成可视化的网络应用。无需具备HTMLCSS或JaveScript知识,就能使用任一种Python可视化库控制输入。当创建一个图表的时候,可以在上面加上一个域,让任何人都可以实时地玩转你的数据,让你的数据更通俗易懂。Vincent是一个很酷的可视化工具,它以Python数据结构作为数据源,然后把它翻译成Vega可视化语法,并且能够在D3.js上运行。这让你可以使用Python脚本来创建漂亮的3D图形来展示你的数据。Vincent底层使用pandas数据,并且支持大量的图表:条形图、线图、散点图、热力图、堆条图、分组条形图、饼图、圈图、地图等等。Python-igraph是Python界面的igraph高性能图形库,主要针对复杂的网络研究和分析。2.可视化工具简介36Mayavi2是一个通用的、跨平台的三维科学数据可视化工具。可以在二维和三维空间中显示标量、向量和张量数据。可通过自定义源、模块和数据过滤器轻松扩展。Mayavi2也可以作为一个绘图引擎,生成matplotlib或gnuplot脚本,也可以作为其它应用程序的交互式可视化的库,将生成的图片嵌入到其它应用程序中。geoplotlib是Python的一个用于地理数据可视化和绘制地图的工具箱,并提供了一个原始数据和所有可视化之间的基本接口,支持在纯Python中开发硬件加速的交互式可视化,并提供点映射、内核密度估计、空间图、泰森多边形图、形状文件和许多更常见的空间可视化的实现。除了为常用的地理数据可视化提供内置的可视化功能外,geoplotlib还允许通过定义定制层来定义复杂的数据可视化(绘制OpenGL,如分数、行和具有高性能的多边形),创建动画。Basemap和Cartopy包支持多个地理投影,并提供一些可视化效果,包括点图、热图、等高线图和形状文件。PySAL是一个由Python编写的空间分析函数的开源库,它提供了许多基本的工具,主要用于形状文件。但是,这些库不允许用户绘制地图贴图,并且对自定义可视化、交互性和动画的支持有限。Leather适用于现在就需要一个图表并且对图表是不是完美并不在乎的人。它可以用于所有的数据类型,然后生成SVG图像,这样在调整图像大小的时候就不会损失图像质量。这个库很新,一些文档还没有最后完成。图像成品非常基础——但是这就是设计目标。missingno用图像的方式让你能够快速评估数据缺失的情况,而不是在数据表里面步履维艰。可以根据数据的完整度对数据进行排序或过滤,或者根据热度图或树状图来考虑对数据进行修正。2.可视化工具简介37Python有很多不同的可视化工具,选择一个合适的工具有时是一种挑战。如果你想做一些专业的统计图表,推荐你使用Seaborn、Altair;数学、科学、工程领域的学者就选择PyQtGraph、VisPy、Mayavi2;网络研究和分析方面,NetworkX、Python-igraph会是一个不错的选择;地理投影就选geoplotlib、folium;评估数据缺失就选missingno;有了HoloViews再也不用为高维图形犯愁;如果你不喜欢花俏的修饰,那就选择Leather。如果你是一名新手matplotlib、pandas会很好上手。
本节将讲解matplotlib的绘图功能,这也是现在最为常用、最为稳健,同时功能也非常丰富的数据可视化解决方案。2.可视化工具简介38【例12-2】matplotlib简单应用示例。#导入pyplot子库importmatplotlib.pyplotaspltimportnumpyasnpplt.axis([0,6,-2,2])#[xmin,xmax,ymin,ymax]定义x轴和y轴的取值范围plt.title(‘Myfirstplot’,fontsize=20,fontname=‘TimesNewRoman’)#标题plt.xlabel(‘counting’,color=‘gray’)#x轴标签设置plt.ylabel(‘Squarevalues’,color=‘gray’)#y轴标签设置plt.text(1.5,0.9,‘First’)#设置文本的摆放位置plt.text(3.2,0.6,'Second')plt.text(4.,-0.4,'Third')plt.text(5,0.5,'$y=sin(x)$',fontsize=20,bbox={'facecolor':'yellow','alpha':0.2})plt.grid(True)#显示网格线x=np.arange(0,5,0.1)#x轴的刻度y1=np.sin(x)#曲线1y2=np.sin(x+4)#曲线2y3=np.sin(x+8)#曲线3plt.plot(x,y1,‘b-’)#画曲线1,用蓝色实线plt.plot(x,y2,‘g^’)#画曲线2,绿色箭头线plt.plot(x,y3,‘r-.’)#画曲线3,红色虚线plt.legend([‘Firsts’,‘Seconds’,‘Thirds’],loc=1)#图例设置plt.savefig(‘e:\\dd\\plot.png’)#图形存盘plt.show()#显示图3.1Matplotlib绘图元素393.1Matplotlib绘图元素40设置图的标题:plt.title('Myfirstplot',fontsize=20,fontname='TimesNewRoman'),定义图表的标题为“Myfirstplot”,并设置标题的字号和字体。设置x轴标签:plt.xlabel('counting',color='gray'),定义x轴标签为“counting”,颜色为gray。设置y轴标签:plt.ylabel('Squarevalues',color='gray'),同上。设置显示文本:plt.text(5,0.5,'$y=sin(x)$',fontsize=20,bbox={'facecolor':'yellow','alpha':0.2}),在图(5,0.5)位置添加“y=sin(x)”文本,并设置文本的字号,并将文本放入文本框。text()方法支持放在两个$符号之间的数学表达式。设置网格线:plt.grid(True),“True”表示显示网格线。设置图例:plt.legend(['First','Second','Third'],loc=1),loc是图例放置位置,默认值为1即图表的右上角。当图表中有多个序列线条时,图例的顺序要与调用plot()函数顺序一致。保存图表:plt.savefig(‘e:\\dd\\plot.png'),图表以png的格式保存到usr目录下,方便其它文件使用这个图表。但是需要注意的是savefig()函数需要放在生成图表的一系列命令最后,否则会得到一个空白的文件。设置x,y轴的比例:plt.axis('equal')。3.1Matplotlib绘图元素41【例12-3】绘制两个子图,在画布上绘制2个上下向水平方向延伸的子图。#eg12_3.pyimportmatplotlib.pyplotaspltimportnumpyasnpplt.grid(True)x=np.arange(0,5,0.1)y1=np.sin(x)y2=np.sin(x+4)plt.subplot(211)#设置第一个子图plt.plot(x,y1,'b-')plt.legend(['Firsts'],loc=1)plt.subplot(212)#设置第二个子图plt.plot(x,y2,'g^')plt.legend(['Seconds'],loc=1)plt.savefig(‘d:\\dd\\plot_1.png')plt.show()如果参数传入的两个数字分别为121和122,图形就分为左右子图3.2子图绘制subplot()函数将整个绘图区域等分为m行和n列个子区域,然后按照从左到右,从上到下的顺序对每个子图进行编号,左上角子图编号为1,即subplot(m,n,子图编号),如subplot(3,2,1)。如果三个数字都小于10,则可简写为subplot(321)。423.2子图绘制43plt.plot()方法是一个绘制线方法。常用的格式如下:plot([x],y,[fmt],**kwargs)#画单条折线plot([x],y,[fmt],[x2],y2,[fmt2],...,**kwargs)#画多条折线[x],y:用于画线的点。[x]省略时,默认从0开始;[fmt]:格式字符串,按颜色、点标记和线型顺序组合,如“ro.”,当然也可分别用“linestyle='.',color='r',marker='o’”关键参数格式表示。点的标记有“.”表示实心的点,“o”表示空心的点,“v”表示倒三角形,“^”表示正三角形等共22种;**kwargs:用来设置图形属性的选项,如“linewidth=2”表示线宽为2,“alpha=0.5”表示透明度为0.5等。随着使用的需要,不断熟悉多种选项参数,也可用help(plt.plot)查看。
3.3线图绘制44【例12-4】绘制一个正弦曲线图,即y=sin(x)。#eg12_4.pyimportmatplotlib.pyplotaspltimportnumpyasnpx=np.arange(-2*np.pi,2*np.pi,0.01)y=np.sin(x)plt.plot(x,y,'b-.')plt.show()3.3线图绘制45直方图(Histogram),又称质量分布图,是一种统计报告图。直方图由竖立在x轴上多个相邻的矩形组成,这些矩形把x轴拆分为一段段彼此不重叠的线段(线段两个端点所标识的数据范围称面元),矩形的面积跟落在其所对应的面元元素数量成正比。这种可视化方法常被用于样本分布等统计研究。3.4直方图绘制46hist()函数原型如下:hist(x,bins=None,range=None,density=None,weights=None,cumulative=False,bottom=None,histtype='bar',align='mid',orientation='vertical',rwidth=None,log=False,color=None,label=None,stacked=False,normed=None,hold=None,data=None,**kwargs)x:输入的数据,可以为一个序列数,也可以多组;bins:直方图中分组个数;range:指定分组区间的上下限,默认为(x.min(),x.max()),若bins为序列,range失效;density:决定hist()方法返回值的第一个输出元组n。如果为True,直方图面积和为1,频数/(总数*组距);如果为False,返回的是频数;normed:决定直方图y轴取值是落在某个面元中元素的个数(normed=False或normed=0),还是某个面元中元素的个数占总体的百分比(normed=True或normed=1);cumulative:为True即计算累计频数或频率。即cumulative=True,density=True时,计算累计频率;bottom:如果是标量,每个bin的基线位置都平移相同的单位。如果是与分组区间数长度相同的列表,则每个bin的基线都独立地平移独立的单位,默认为0;histtype:表明画出的图形状,可以是“bar”、“barstacked”、“step”、“stepfilled”;align:设置画的bar是以什么为中心,可以是“left”、“mid”、“right”;rwidth:控制每个bar的宽度。weights:权重,与x的形状一致;Barstacked:表示有多个分组的直方图时,是否堆叠放置;log:控制y坐标是否使用科学计数法;orientation
:直方图是垂直还是水平的,可以是“horizontal”、“vertical”。hist()的返回值:n:数组或数组列表,每一个bar区间的数量或者百分比;bins:数组,bar的范围和bins参数含义一样;patches:列表或者列表的列表,图形对象。3.4直方图绘制47【例12-5】随机生成一个序列作为样本,画出它的直方图。把随机生成的100个样本数据作为参数传递给hist()函数,创建一个直方图,指定直方图中有20个面元。#eg12_5.pyimportmatplotlib.pyplotaspltimportnumpyasnppop=np.random.randint(0,100,100)n,bins,patches=plt.hist(pop,bins=20,rwidth=0.8)plt.show()3.4直方图绘制48柱形图,又称长条图、柱状统计图、条图、条状图、棒形图,是一种以长方形的长度为变量的统计图表。长条图用来比较两个或以上的价值(不同时间或者不同条件),可以只有一个变量,通常用于较小的数据集分析。长条图亦可横向排列,或用多维方式表达。3.5柱(条)形图绘制493.5柱(条)形图绘制matplotlib.pyplot.bar()来绘制柱形图bar(x,height,width=0.8,bottom=None,align='center',**kwargs)x:表示x坐标,数据类型为int或float类型,刻度自适应调整;也可传dataframe的object,x轴上等间距排列;
height:表示柱形图的高度,也就是y坐标值,数据类型为int或float类型;
width:表示柱形图的宽度,取值在0~1之间,默认为0.8;
bottom:柱形图的起始位置,也就是y轴的起始坐标;
align:柱形图的中心位置,默认“center”居中,可设置为“lege”边缘;
color:柱形图颜色;
edgecolor:边框颜色;
linewidth:边框宽度;
tick_label:下标标签;
log:柱形图y值使用科学计算方法,bool类型;
orientation:柱状图是竖直还是水平,竖直:“vertical”,水平条:“horizontal”;……50【例12-6】随机生成7个值作为”星期一~星期天”的值,绘制柱形图。#eg12_6.pyimportmatplotlib.pyplotaspltimportnumpyasnp#设置中文标签的显示plt.rcParams['font.sans-serif']=['SimHei']x=np.arange(7)print(x)data=np.random.randint(0,100,7)print(data)colors=np.random.rand(7*3).reshape(7,3)print(colors)labels=['星期一','星期二','星期三','星期四','星期五','星期六','星期天']plt.title("星期图")plt.bar(x,data,alpha=0.8,color=colors,tick_label=labels)plt.show()3.5柱(条)形图绘制51pie()原型如下:pie(x,explode=None,labels=None,colors=None,autopct=None,pctdistance=0.6,shadow=False,labeldistance=1.1,startangle=None,radius=None,counterclock=True,wedgeprops=None,textprops=None,center=(0,0),frame=False,rotatelabels=False,hold=None,data=None)x:指定绘图的数据;explode:指定饼图某些部分的突出显示,即呈现爆炸式;labels:为饼图添加标签说明,类似于图例说明;colors:指定饼图的填充色;autopct:自动添加百分比显示,可以采用格式化的方法显示;pctdistance:设置百分比标签与圆心的距离;shadow:是否添加饼图的阴影效果;labeldistance:设置各扇形标签(图例)与圆心的距离;startangle:设置饼图的初始摆放角度;radius:设置饼图的半径大小;counterclock:是否让饼图按逆时针顺序呈现;wedgeprops:设置饼图内外边界的属性,如边界线的粗细、颜色等;textprops:设置饼图中文本的属性,如字体大小、颜色等;center:指定饼图的中心点位置,默认为原点;frame:是否要显示饼图背后的图框,如果设置为True的话,需要同时控制图框x轴、y轴的范围和饼图的中心位置。3.6饼图绘制52饼图,或称饼状图,是一个划分为几个扇形的圆形统计图表,用于描述量、频率或百分比之间的相对关系。在饼图中,每个扇区的弧长(以及圆心角和面积)大小为其所表示的数量比例,这些扇区合在一起刚好是一个完全的圆形。顾名思义,这些扇区拼成了一个切开的饼形图案。3.6饼图绘制53matplotlib.pyplot.pie(x,explode=None,labels=None,colors=None,autopct=None,pctdistance=0.6,shadow=False,labeldistance=1.1,startangle=0,radius=1,counterclock=True,wedgeprops=None,textprops=None,center=0,0,frame=False,rotatelabels=False,*,normalize=None,data=None)x:各个饼块的尺寸。类似一维数组结构。explode:每个饼块相对于饼圆半径的偏移距离,取值为小数。类似一维数组结构。默认值为None。labels:每个饼块的标签。字符串列表。默认值为None。colors:每个饼块的颜色。类数组结构。默认值为None,使用当前色彩循环。autopct:饼块内标签。None或字符串或可调用对象。默认值为None。如果值为格式字符串,标签将被格式化,如果值为函数,将被直接调用。pctdistance:饼块内标签与圆心的距离。浮点数。默认值为0.6,autopct不为None该参数生效。shadow:饼图下是否有阴影。布尔值。默认值为False。labeldistance:饼块外标签与圆心的距离。浮点值或None。默认值为1.1。如果设置为None,标签不会显示,但是图例可以使用标签。startangle:饼块起始角度。浮点数。默认值为0,即从x轴开始。角度逆时针旋转。radius:饼图半径。浮点数。默认值为1。……3.6饼图绘制54【例12-7】绘制一个星期的饼图。#eg12_7.pyimportmatplotlib.pyplotaspltimportnumpyasnpdata=np.arange(1,8)labels=['星期一','星期二','星期三','星期四','星期五','星期六','星期天']colors=np.random.rand(7*3).reshape(7,-1)explode=[0.5,0,0,0,0,0,0]plt.pie(data,labels=labels,colors=colors,startangle=0,autopct='%1.2f%%',explode=explode,shadow=True)plt.axis('equal')plt.show()data为饼图的数据,lables为每一块饼图外侧显示的说明文字,colors为每一块饼图的颜色,startangle表示起始绘制角度,默认为0,图是从x轴正方向逆时针画起,autopct为控制饼图内百分比设置,'%1.2f%'表示小数点前后位数,explode为每一块图表离开中心距离,shadow表示图表的阴影,默认为无。3.6饼图绘制553.6饼图绘制56散点图由一些散乱的点组成的图,由x和y值确定每个点的位置。利用散点图可以展示数据的分布和聚合情况。使用matplotlib.pyplot.scatter()函数来绘制散点图。scatter()函数原型如下:scatter(x,y,s=None,c=None,marker=None,cmap=None,norm=None,vmin=None,vmax=None,alpha=None,linewidths=None,verts=None,edgecolors=None,hold=None,data=None,**kwargs)x,y:输入数据,长度相同的序列;c:颜色序列;s:设置点的大小;marker:设置点的形状;cmap:指定色图,只有当c参数是一个浮点型的数组时才起作用;norm:设置数据亮度,标准化到0~1之间,使用该参数仍需要c为浮点型的数组;linewidths:设置线宽;edgecolors:设置点的边缘颜色;vmin,vmax:亮度设置,与norm类似,如果使用了norm则该参数无效。3.7散点图绘制57【例12-8】散点图示例。#eg12_8.pyimportmatplotlib.pyplotaspltimportnumpyasnp#设置中文标签和负号的显示plt.rcParams['font.sans-serif']=['SimHei’]plt.rcParams['axes.unicode_minus']=Falseplt.figure(figsize=(9,6))n=1000x=np.random.randn(1,n)y=np.random.randn(1,n)c=np.random.rand(n*3).reshape(n,3)plt.title('散点图')plt.xlabel('x值')plt.ylabel('y值')plt.grid(True)plt.scatter(x,y,s=50,c=c,alpha=0.4,marker='o')plt.show()x,y是散点图中的数据,s为点的大小,colors(c)为点的颜色,marker为点的样式,alpha表示点的透明度,界于0到1之间3.7散点图绘制583.7散点图绘制数据处理精选案例0460
【例12-9】dianying.csv文件中包含多个城市中多部电影的票房信息,要求任选dianying.csv中三部电影统计总票房,绘制一个柱状图。柱状图中需包含图例,y轴表示票房收入,单位为万元,x轴表示电影名称,以三部电影名字作为刻度。
分析:dianying.csv文件中包含有电影名称、上映时间、下线时间、公司、导演、主演、类型、票房、城市信息。先进行数据清洗处理;然后抽取三部电影的记录;统计三部部电影的总票房;最后画图。#eg12_9.py
frompandasimportSeries,DataFrameimportnumpyasnpimportpandasaspdimportmatplotlib.pyplotasplt
#设置中文标签的显示plt.rcParams['font.sans-serif']=['SimHei’]
#数据清洗并获取有效数据defget_data(path):film_data=pd.read_csv(path,delimiter=';',encoding='utf8',names=['电影名称','上线时间','下线时间','公司','导演','主演','类型','票房','城市'])#去重film_data=film_data.drop_duplicates().reset_index().drop('index',axis=1)#选择需要的列,并去空film_data=film_data[['电影名称','票房']].dropna()#获取票房列数据,去除")"film_data['票房']=film_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年地铁车站大客流组织与应急预案
- 临泽《戈壁农业种植》培训试卷
- 护理交接班制度培训课件
- 26年化学暴露人群基因检测要点
- 母婴皮肤接触对新生儿微生物群影响的研究进展总结2026
- 2026年老鼠的拼音说课稿模板
- 26年神经内分泌瘤基因检测匹配实操
- 医学26年:心理压力对心血管影响 心内科查房
- 2026年小陀螺说课稿
- 初中数学几何图形解题技巧主题班会说课稿
- 2025年山东济南国有资产运营管理集团有限公司招聘笔试真题
- (2025年)中级专业技术职务水平能力测试(测绘工程)综合试题及答案
- 2026年东北三省三校高三语文第二次模拟考试作文题目及范文:智能科技与养老
- 南京传媒学院辅导员真题
- 医疗器械销售合规性培训试题
- 骨科耗材行业分析报告
- 基于生成式AI的初中语文教学问题解决策略探究教学研究课题报告
- 学校室外管网施工方案
- DB11-T 2382-2024 建设工程施工消耗量标准
- 保税业务内部管理制度
- 审计学基础课件培训资料
评论
0/150
提交评论