《Python程序設計》第8章 數(shù)據(jù)分析和可視化_第1頁
《Python程序設計》第8章 數(shù)據(jù)分析和可視化_第2頁
《Python程序設計》第8章 數(shù)據(jù)分析和可視化_第3頁
《Python程序設計》第8章 數(shù)據(jù)分析和可視化_第4頁
《Python程序設計》第8章 數(shù)據(jù)分析和可視化_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

口令:RAPID708第8章

數(shù)據(jù)分析和可視化學習目標了解“numpy”模塊和“pandas”模塊的主要功能。掌握“numpy”模塊重要的運算方法。掌握“pandas”模塊重要的數(shù)據(jù)模型結構。了解數(shù)據(jù)可視化和GUI的區(qū)別。掌握“matplotlib”模塊的重要繪圖方法。數(shù)據(jù)分析模塊Python數(shù)據(jù)分析使用“numpy”和“pandas”這兩個科學運算模塊。“numpy”模塊:它是一個科學計算包,支持N維數(shù)組運算、處理大型矩陣、成熟的廣播函數(shù)庫、矢量運算、線性代數(shù)、傅里葉變換、隨機數(shù)生成等功能,并可與C++/Fortran語言無縫結合。

“pandas”模塊:是基于“numpy”的數(shù)據(jù)分析模塊,提供了大量標準數(shù)據(jù)模型和高效操作大型數(shù)據(jù)集所需要的工具,可以說“pandas”是使得Python能夠成為高效且強大的數(shù)據(jù)分析環(huán)境的重要因素之一。Numpy模塊基本屬性#導入模塊importnumpyasnp#將其他數(shù)據(jù)類型轉換為矩陣數(shù)組。>>>print(np.array([1,2,3,4,5,6])) #將列表轉換為一維矩陣數(shù)組[123456]>>>print(np.array((1,2,3,4,5,6))) #將元組轉換為一維矩陣數(shù)組[123456]#使用“numpy”模塊的基本屬性>>>arr1=np.array([1,2,3,4,5,6])>>>print(arr1.ndim) #維度1>>>print(arr1.shape) #行數(shù)和列數(shù)返回為元組類型(6,)>>>print(arr1.size) #元素個數(shù)6Numpy模塊創(chuàng)建矩陣數(shù)組#創(chuàng)建矩陣數(shù)組>>>importnumpyasnp>>>arr1=np.array([1.2,2,3,4,5],dtype=) #類型設置為整形>>>print(arr1)[12345]>>>arr1=np.array([1.2,2,3,4,5],dtype=np.float) #類型設置為浮點型>>>print(arr1)[1.22.3.4.5.]#賦初值>>>arr1=np.zeros((4,5)) >>>print(arr1)[[0.0.0.0.0.][0.0.0.0.0.][0.0.0.0.0.][0.0.0.0.0.]]>>>arr2=np.ones((4,5))>>>print(arr2)[[1.1.1.1.1.][1.1.1.1.1.][1.1.1.1.1.][1.1.1.1.1.]]#修改矩陣數(shù)組的形狀>>>arr3=np.arange(9).reshape(3,3)>>>print(arr3)[[012][345][678]]#創(chuàng)建線段型數(shù)據(jù)>>>arr1=np.linspace(0,5,10)>>>print(arr1)[0.0.555555561.111111111.666666672.222222222.777777783.333333333.888888894.444444445.]Numpy模塊基本運算#矩陣運算>>>importnumpyasnp>>>x=np.array([1,2,3,4])>>>y=np.arange(5,9)>>>z=x-y #矩陣減法>>>print(z)[-4-4-4-4]>>>z=x+y #矩陣加法>>>print(z)[681012]>>>z=x*y #矩陣乘法>>>print(z)[5122132]>>>z=x/y #矩陣除法>>>print(z)[0.20.333333330.428571430.5]>>>z=x**3 #矩陣x的3次方>>>print(z)[182764]#可以使矩陣進行關系運算或者調用某些數(shù)學函數(shù)。>>>print(x<2) #矩陣關系運算判斷矩陣中的每個元素是否小于數(shù)值2[TrueFalseFalseFalse]>>>print(x==y) #矩陣關系運算判斷矩陣x和矩陣y對應元素是否相等[FalseFalseFalseFalse]>>>z=np.sin(x) #矩陣求正弦值>>>print(z)[0.841470980.909297430.14112001-0.7568025]#多維矩陣運算和一維矩陣運算的區(qū)別>>>importnumpyasnp>>>arr1=np.array([[1,2,],[3,4]])>>>arr2=np.arange(5,9).reshape(2,2)>>>arr3=np.dot(arr1,arr2)>>>print(arr3)[[1922][4350]]Numpy模塊索引操作一維矩陣數(shù)組讀取索引語法格式如下:矩陣數(shù)組對象[索引號]>>>importnumpyasnp>>>arr1=np.arange(10)>>>print(arr1[1]) #打印輸出索引號為2的數(shù)據(jù)1>>>arr1=arr1.reshape(2,5)>>>print(arr1[1]) #打印輸出第二行數(shù)據(jù)的數(shù)據(jù)[56789]二維矩陣數(shù)組讀取索引語法格式如下:矩陣數(shù)組對象[行索引][列索引]>>>print(arr1[0][1]) #打印輸出第1行第2列數(shù)據(jù)1>>>print(arr1[0,2:]) #打印輸出第1行第3列之后的本行所有數(shù)值[234]Numpy模塊矩陣數(shù)組合并將多個矩陣數(shù)組進行合并有兩種方式,一種是上下合并,另一種是左右合并。矩陣數(shù)組的上下合并操作。上下合并>>>importnumpyasnp>>>arr1=np.array([1,2,3])>>>arr2=np.array([4,5,6])>>>print(np.vstack((arr1,arr2)))[[123][456]]左右合并類似于列表或字符串的拼接>>>importnumpyasnp>>>arr1=np.array([1,2,3])>>>arr2=np.array([4,5,6])>>>print(np.hstack((arr1,arr2)))[123456]Numpy模塊矩陣數(shù)組轉置矩陣數(shù)組轉置操作,使用語法如下:矩陣數(shù)組對象.T>>>importnumpyasnp>>>arr1=np.array([[1,2,3],[4,5,6],[7,8,9]])>>>print(arr1) #打印輸出未轉置的矩陣數(shù)組[[123][456][789]]>>>print(arr1.T) #打印輸出轉置后的矩陣數(shù)組[[147][258][369]]Numpy模塊矩陣數(shù)組分隔矩陣數(shù)組分隔有三種方式分別是:縱向分隔、橫向分隔和不等量分隔,下面詳細講解這三種分隔方式。>>>importnumpyasnp>>>arr1=np.arange(12).reshape((3,4))>>>print(np.split(arr1,2,axis=1)) #縱向分隔[array([[0,1],[4,5],[8,9]]),array([[2,3],[6,7],[10,11]])]>>>print(np.split(arr1,3,axis=0)) #橫向分隔[array([[0,1,2,3]]),array([[4,5,6,7]]),array([[8,9,10,11]])]>>>print(np.array_split(arr1,3,axis=1)) #不等量分隔[array([[0,1],[4,5],[8,9]]),array([[2],[6],[10]]),array([[3],[7],[11]])]Pandas模塊pandas”模塊是基于“numpy”模塊構建的,它使“numpy”為中心的應用變得更加簡單,要使用“pandas”模塊,需要了解它的兩個主要數(shù)據(jù)結構:“Series”和“DataFrame”?!癝eries”類似于字典,主要特點體現(xiàn)在索引在左邊,值在右邊。>>>importpandasaspd>>>importnumpyasnp>>>num=pd.Series([1,2,3,"Python"])>>>print(num)0112233Pythondtype:object“DataFrame”相當于是“Series”組成的字典,只不過既有行索引也有列索引。>>>importpandasaspd>>>importnumpyasnp>>>dates=pd.date_range('20180101',periods=3)>>>df=pd.DataFrame(np.random.randn(3,3),index=dates,columns=[1,2,3])>>>print(df)1232018-01-01-1.230292-0.7344192.5787212018-01-02-0.561365-1.018703-1.1527342018-01-03-1.287677-1.013893-0.982593Pandas模塊根據(jù)列索引輸出對應的數(shù)據(jù)>>>importpandasaspd>>>importnumpyasnp>>>dates=pd.date_range('20180101',periods=3)>>>df=pd.DataFrame(np.random.randn(3,3),index=dates,columns=[1,2,3])>>>print(df[1]) #輸出索引號為1的列的數(shù)據(jù)2018-01-01-0.2174242018-01-02-0.6377682018-01-03-0.194733Freq:D,Name:1,dtype:float64Pandas模塊指定行、列的索引>>>num=pd.DataFrame({'A':1,'B':pd.Timestamp('20180101'),'C':pd.Series(1,index=list(range(4)),dtype='float32'),'D':np.array([3]*4,dtype='int32'),'E':pd.Categorical(["id1","id2","id3","id4"]),'F':'Python'})>>>print(num)ABCDEF012018-01-011.03id1Python112018-01-011.03id2Python212018-01-011.03id3Python312018-01-011.03id4PythonPandas模塊數(shù)據(jù)翻轉>>>print(num.T)012\A111B2018-01-0100:00:002018-01-0100:00:002018-01-0100:00:00C111D333Eid1id2id3FPythonPythonPython3A1B2018-01-0100:00:00C1D3Eid4FPythonPandas模塊pandas數(shù)據(jù)篩選和賦值>>>dates=pd.date_range('20180101',periods=6)>>>num=pd.DataFrame(np.arange(24).reshape((6,4)),index=dates,columns=['A','B','C','D'])>>>print(num)ABCD2018-01-0101232018-01-0245672018-01-038910112018-01-04121314152018-01-05161718192018-01-0620212223Pandas模塊讀取數(shù)據(jù)>>>print(num['A']) #或者使用print(num.A)語句

列操作2018-01-0102018-01-0242018-01-0382018-01-04122018-01-05162018-01-0620Freq:D,Name:A,dtype:int32>>>print(num[0:2]) #行操作ABCD2018-01-0101232018-01-024567Pandas模塊篩選數(shù)據(jù)篩選數(shù)據(jù)主要有四種方式,根據(jù)行、列標簽篩選、根據(jù)序列篩選、混合篩選和條件篩選。根據(jù)行、列標簽篩選使用的是“l(fā)oc”屬性。>>>print(num.loc['20180101'])#輸出“20180101”這行數(shù)據(jù)A0B1C2D3Name:2018-01-0100:00:00,dtype:int32>>>print(num.loc['20180102','B']) #輸出“20180102”行,“B”列的數(shù)據(jù)5>>>print(num.loc[:,['C','D']]) #“:”代表所有行CD2018-01-01232018-01-02672018-01-0310112018-01-0414152018-01-0518192018-01-062223根據(jù)序列篩選使用的是“iloc”屬性。>>>print(num.iloc[0,0]) #輸出0行0列索引的數(shù)據(jù)0>>>print(num.iloc[0:3,0:3]) #輸出0-2行,0-2列索引的數(shù)據(jù)ABC2018-01-010122018-01-024562018-01-038910>>>print(num.iloc[[0,3],0:3]) #輸出0行和2行索引,0-2列索引對應的數(shù)據(jù)ABC2018-01-010122018-01-04121314混合篩選是將標簽篩選和序列篩選結合使用,使用的是“ix”屬性。>>>print(num.ix[:2,['B','C']])BC2018-01-01122018-01-0256條件篩選可以提前設置約束條件然后篩選數(shù)據(jù)。>>>print(num.C) #輸出C列標簽的原始數(shù)據(jù)2018-01-0122018-01-0262018-01-03102018-01-04142018-01-05182018-01-0622Freq:D,Name:C,dtype:int32>>>print(num.C>10) #判斷C列標簽大于10的數(shù)據(jù)2018-01-01False2018-01-02False2018-01-03False2018-01-04True2018-01-05True2018-01-06TrueFreq:D,Name:C,dtype:boolPandas模塊賦值操作賦值通常使用的方式是:根據(jù)行、列設置、根據(jù)序列、標簽設置和根據(jù)條件設置。根據(jù)行列設置。>>>num['A']="NULL" #A行數(shù)據(jù)都設置為“NULL”字符串>>>print(num)ABCD2018-01-01NULL1232018-01-02NULL5672018-01-03NULL910112018-01-04NULL1314152018-01-05NULL1718192018-01-06NULL212223根據(jù)序列、標簽設置。>>>num.iloc[0,0]=0 #將第0行、0列的數(shù)值賦值為0>>>num.loc['20180102','A']=4#將標簽為“20180102”行、“A”列的數(shù)值賦值為4>>>print(num)ABCD2018-01-0101232018-01-0245672018-01-03NULL910112018-01-04NULL1314152018-01-05NULL1718192018-01-06NULL212223根據(jù)條件設置。>>>num.A[num.A>10]='Yes' #在A列將所有大于10的數(shù)值賦值為字符串“Yes”>>>print(num)ABCD2018-01-0101232018-01-0245672018-01-038910112018-01-04Yes1314152018-01-05Yes1718192018-01-06Yes212223可以將一條新的數(shù)據(jù)追加到舊矩陣數(shù)據(jù)中。>>>num['E']=pd.Series([1,2,3,4,5,6],index=pd.date_range("20180101",periods=6)) #添加新列E>>>print(num)ABCDE2018-01-01012312018-01-02456722018-01-0389101132018-01-04Ye01-05Ye01-06Yes2122236Pandas模塊數(shù)據(jù)合并數(shù)據(jù)合并就是將多條數(shù)據(jù)合并成一條矩陣據(jù)集,進行分析處理,數(shù)據(jù)合并有兩方式:“concat()”方法和“merge()”方法。>>>importpandasaspd>>>importnumpyasnp>>>num1=pd.DataFrame(np.ones((3,4))*0,columns=['A','B','C','D'])>>>num2=pd.DataFrame(np.ones((3,4))*1,columns=['A','B','C','D'])>>>num3=pd.DataFrame(np.ones((3,4))*2,columns=['A','B','C','D'])>>>res=pd.concat([num1,num2,num3],axis=0,ignore_index=True)>>>print(res)ABCD00.00.00.00.010.00.00.00.020.00.00.00.031.01.01.01.041.01.01.01.051.01.01.01.062.02.02.02.072.02.02.02.082.02.02.02.0“concat()”方法。Pandas模塊“concat()”方法可以使不同的數(shù)據(jù)矩陣合并后依照“column”(列標簽名)來做縱向合并,有相同的“column”上下合并在一起,其余的“column”自成列,原本沒有值的位置均以NaN(空值)填充。>>>importpandasaspd>>>importnumpyasnp>>>num1=pd.DataFrame(np.ones((3,4))*0,columns=['A','B','C','D'],index=[1,2,3])>>>num2=pd.DataFrame(np.ones((3,4))*1,columns=['B','C','D','E'],index=[2,3,4])>>>res=pd.concat([num1,num2],axis=0,join='outer')>>>print(res)ABCDE10.00.00.00.0NaN20.00.00.00.0NaN30.00.00.00.0NaN2NaN1.01.01.01.03NaN1.01.01.01.04NaN1.01.01.01.0參數(shù)“join='outer'”是預設值,因此沒有設定任何參數(shù)時,系統(tǒng)默認“join='outer'”。當參數(shù)“join='inner'”時,只有將相同的“column”合并,其余的自動舍棄。>>>res=pd.concat([num1,num2],axis=0,join='inner')>>>print(res)BCD10.00.00.020.00.00.030.00.00.021.01.01.031.01.01.041.01.01.0Pandas模塊“merge()”方法用于多組有“keycolumn”的數(shù)據(jù),統(tǒng)一索引的數(shù)據(jù)。>>>importpandasaspd>>>num1=pd.DataFrame({'key':['K0','K1','K2','K3'],'A':['A0','A1','A2','A3'],'B':['B0','B1','B2','B3']})>>>num2=pd.DataFrame({'key':['K0','K1','K2','K3'],'C':['C0','C1','C2','C3'],'D':['D0','D1','D2','D3']})>>>res=pd.merge(num1,num2,on='key')>>>print(res)ABkeyCD0A0B0K0C0D01A1B1K1C1D12A2B2K2C2D23A3B3K3C3D3數(shù)據(jù)可視化“matplotlib”模塊是Python中功能非常強大的畫圖工具。它可以畫出美觀的線圖、散點圖、條形圖、柱狀圖、3D圖甚至圖片動畫等。#繪制一條“y=2*x+1”的直線importmatplotlib.pyplotaspltimportnumpyasnpx=np.linspace(-1,1,50)y1=2*x+1y2=x**2plt.figure(num=3,figsize=(5,5))plt.plot(x,y1)plt.plot(x,y2,color="red",linewidth=2,linestyle="--")#繪制曲線plt.xlim(-2,2)plt.ylim(-2,2)plt.xlabel("X")plt.ylabel("Y")#添加坐標ax=plt.gca()ax.spines['right'].set_color('none')ax.spines['top'].set_color('none')#添加圖例plt.plot(x,y1,label='linearline')plt.plot(x,y2,color='red',linewidth=1.0,linestyle='--',label='squareline')plt.legend(loc='upperright')#添加注釋plt.text(-1,-1,r'$test$',fontdict={'size':16,'color':'r'})plt.show()數(shù)據(jù)可視化散點圖importmatplotlib.pyplotaspltimportnumpyasnpn=1000 #1000個數(shù)據(jù)點X=np.random.normal(0,1,n) #高斯分布/正態(tài)分布Y=np.random.normal(0,1,n)plt.scatter(X,Y,s=75,c="Y",alpha=.5)plt.xlim(-1.5,1.5)plt.xticks(()) #隱藏X軸坐標plt.ylim(-1.5,1.5)plt.yticks(()) #隱藏X軸坐標plt.show()數(shù)據(jù)可視化柱狀圖importmatplotlib.pyplotaspltimportnumpyasnpn=12X=np.arange(n)#生成12條數(shù)據(jù),獲取X的值(0-11)Y1=(1-X/float(n))*np.random.uniform(0.5,1.0,n)Y2=(1-X/float(n))*np.random.uniform(0.5,1.0,n)plt.bar(X,+Y1,facecolor='#9999ff',edgecolor='white')#設置上半軸plt.bar(X,-Y2,facecolor='#ff9999',edgecolor='white')#設置下半軸forx,yinzip(X,Y1):#注釋說明plt.text(x+0.4,y+0.05,'%.2f'%y,ha='center',va='bottom')forx,yinzip(X,Y2):plt.text(x+0.4,-y-0.05,'%.2f'%y,ha='center',va='top')plt.xlim(-.5,n)plt.xticks(())plt.ylim(-1.25,1.25)plt.yticks(())plt.show()數(shù)據(jù)可視化等高線圖importmatplotlib.pyplotaspltimportnumpyasnpdeff(x,y):return(1-x/2+x**6+y**3)*np.exp(-x**2-y**2)#256個數(shù)據(jù)集點n=256x=np.linspace(-3,3,n)y=np.linspace(-3,3,n)#將每一個x和每一個y分別對應起來,編織成柵格X,Y=np.meshgrid(x,y)#色彩填充plt.contourf(X,Y,f(X,Y),8,alpha=.75,cmap=plt.cm.hot)#繪制等高線C=plt.contour(X,Y,f(X,Y),8,colors='black',linewidth=.5)#顯示等高線的數(shù)值plt.clabel(C,inline=True,fontsize=10)plt.xticks(())plt.yticks(())plt.show()數(shù)據(jù)可視化3D繪圖importnumpyasnpimportmatplotlib.pyplotaspltfrommpl_toolkits.mplot3dimportAxes3Dfig=plt.figure()#將坐標軸設置為3D效果ax=Axes3D(fig)X=np.arange(-4,4,0.25)Y=np.arange(-4,4,0.25)#將x和y對應設置為平面網格X,Y=np.meshgrid(X,Y)R=np.sqrt(X**2+Y**2)#設置高度Z=np.cos(R)#設置3D圖形的跨度和顏色ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=plt.get_cmap('rainbow'))#設置投影方式ax.contourf(X,Y,Z,zdir='z',offset=-2,cmap=plt.get_cmap('rainbow'))#設置高度的范圍ax.set_zlim(-2,2)plt.sho

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論