Python常用扩展包
一. Python常用擴(kuò)展包
????????參考張良均的《Python數(shù)據(jù)分析與挖掘?qū)崙?zhàn)》,下圖展示了常見的Python擴(kuò)展包。
????????常用的包主要包括:
????????1.Numpy
????????Python沒有提供數(shù)組,列表(List)可以完成數(shù)組,但不是真正的數(shù)據(jù),當(dāng)數(shù)據(jù)量增大時(shí),,它的速度很慢。所以Numpy擴(kuò)展包提供了數(shù)組支持,同時(shí)很多高級(jí)擴(kuò)展包依賴它。例如:Scipy、Matplotlib、Pandas。
????????2.Scipy
????????該包提供矩陣支持,以及矩陣相關(guān)的數(shù)值計(jì)算模塊。如果說Numpy讓Python有了Matlab的味道,那么Scipy就讓Python真正地成為二半個(gè)Matlib。因?yàn)樯婕暗骄仃噧?nèi)容,而課程中主要使用數(shù)組,所以不再介紹。
????????3.Pandas
????????Pandas是面板數(shù)據(jù)(Panel Data)的簡寫。它是Python最強(qiáng)大的數(shù)據(jù)分析和探索工具,因金融數(shù)據(jù)分析工具而開發(fā),支持類似SQL的數(shù)據(jù)增刪改查,支持時(shí)間序列分析,靈活處理缺失數(shù)據(jù),后面詳細(xì)介紹。
????????4.Scikit-Learn
????????Scikit-Learn是一個(gè)基于python的用于數(shù)據(jù)挖掘和數(shù)據(jù)分析的簡單且有效的工具,它的基本功能主要被分為六個(gè)部分:分類(Classification)、回歸(Regression)、聚類(Clustering)、數(shù)據(jù)降維(Dimensionality Reduction)、模型選擇(Model Selection)、數(shù)據(jù)預(yù)處理(Preprocessing),前面寫的很多文章算法都是出自該擴(kuò)展包。
????????詳見官網(wǎng):http://scikit-learn.org/stable/
????????5.Matplotlib
????????該包主要用于繪圖和繪表,強(qiáng)大的數(shù)據(jù)可視化工具,做圖庫,語法類似MATLAB。同時(shí),Seaborn也是數(shù)據(jù)可視化的工具包。
????????注意:這些包在Anaconda集成環(huán)境中已經(jīng)存在,可以直接使用,最早我是通過Python2.7來編寫代碼的,安裝過程通過pip install numpy,而且安裝順序非常講究,容易出錯(cuò),所以推薦大家使用該集成包。
二. Numpy科學(xué)計(jì)算包
????????NumPy(Numeric Python)系統(tǒng)是Python的一種開源的數(shù)值計(jì)算擴(kuò)展,一個(gè)用python實(shí)現(xiàn)的科學(xué)計(jì)算包。它提供了許多高級(jí)的數(shù)值編程工具,如:矩陣數(shù)據(jù)類型、矢量處理,以及精密的運(yùn)算庫。專為進(jìn)行嚴(yán)格的數(shù)字處理而產(chǎn)生。
????????推薦學(xué)習(xí):http://old.sebug.net/paper/books/scipydoc/numpy_intro.html
????????下面通過這段代碼詳細(xì)講解這個(gè)包在數(shù)據(jù)分析中的常見用法:
????1.一維數(shù)組處理
#導(dǎo)入包并重命名 import numpy as np#定義一維數(shù)組 a = np.array([2, 0, 1, 5, 8, 3]) print u'原始數(shù)據(jù):', a#輸出最大、最小值及形狀 print u'最小值:', a.min() print u'最大值:', a.max() print u'形狀', a.shape#數(shù)據(jù)切片 print u'切片操作:' print a[:-2] print a[-2:] print a[:1]#排序 print type(a) a.sort() print u'排序后:', a
????????輸出結(jié)果如下所示:
????????核心代碼:
????????代碼通過np.array定義了一個(gè)數(shù)組[2, 0, 1, 5, 8, 3],其中min計(jì)算最小值,max計(jì)算最大值,shape表示數(shù)組的形狀,因?yàn)槭且痪S數(shù)組,故6L(6個(gè)數(shù)字)。
????????最重要的一個(gè)知識(shí)點(diǎn)是數(shù)組的切片操作,因?yàn)樵跀?shù)據(jù)分析過程中,通常會(huì)對(duì)數(shù)據(jù)集進(jìn)行"80%-20%"或"70%-30%"的訓(xùn)練集和測試集劃分,通常采用的方法就是切片。
????????a[:-2]表示從頭開始獲取,"-2"表示后面兩個(gè)值不取,結(jié)果:[2 0 1 5]
????????a[-2:]表示后往前數(shù)兩個(gè)數(shù)字,獲取數(shù)字至結(jié)尾,即獲取最后兩個(gè)值[8 3]
????????a[:1]表示從頭開始獲取,獲取1個(gè)數(shù)字,即[2]
??2.二維數(shù)組處理
注意的是定義二維數(shù)組括號(hào)不要弄錯(cuò),正確的應(yīng)該是:[[1,2,3],[4,5,6]]
同時(shí)計(jì)算機(jī)的存儲(chǔ)下標(biāo)都是從0開始計(jì)算的。
????????代碼如下:
????????代碼輸出結(jié)果如下所示:
????????需要注意:
???????(1)獲取二維數(shù)組中的某行,如第2行數(shù)據(jù)[4,5,6,7],采用方法是:c[1][:];
???????(2)獲取二維數(shù)組中的某列,如第2列數(shù)據(jù)[[3] [6] [9]],c[:,np.newaxis, 2]。因?yàn)橥ǔT跀?shù)據(jù)可視化中采用獲取某列數(shù)據(jù)作為x或y坐標(biāo),同時(shí)多維數(shù)據(jù)也可以采用PCA降低成兩維數(shù)據(jù),再進(jìn)行顯示。
三. Pandas數(shù)據(jù)分析包
????????Pandas是面板數(shù)據(jù)(Panel Data)的簡寫。它是Python最強(qiáng)大的數(shù)據(jù)分析和探索工具,因金融數(shù)據(jù)分析工具而開發(fā),支持類似SQL的數(shù)據(jù)增刪改查,支持時(shí)間序列分析,靈活處理缺失數(shù)據(jù)。
????????注意:首先聲明改包功能非常強(qiáng)大,我只是學(xué)習(xí)了它的非常小的一部分,后面隨著學(xué)習(xí)深入會(huì)寫更多它的用法,同時(shí)建議讀者自行學(xué)習(xí),不喜勿噴。
????????約定俗成的導(dǎo)入慣例:
????????from pandas import Series, DataFrame
????????import pandas as pd
1.常見用法:讀寫文件
?這里讀文件最常用的是兩種方法:
#寫入excel文件:
df.to_excel('foo.xlsx', sheet_name='Sheet1')
#從excel文件中讀取:
pd.read_excel('foo.xlsx', 'Sheet1', index_col=None, na_values=['NA'])
#寫入csv文件:
df.to_csv('foo.csv')
#從csv文件中讀取:
pd.read_csv('foo.csv')
#寫入HDF5存儲(chǔ):
df.to_hdf('foo.h5','df')
#從HDF5存儲(chǔ)中讀取:
pd.read_hdf('foo.h5','df')
????????下面通過一個(gè)具體的案例來講解該包,這里讀取的數(shù)據(jù)是張良均的《Python數(shù)據(jù)分析與挖掘?qū)崙?zhàn)》的第六章的電力用戶數(shù)據(jù)集,missing_data.xls文件。內(nèi)容如下,共3列數(shù)據(jù),分別是用戶A、用戶B、用戶C,共21行,對(duì)應(yīng)21天的用電量,其中包含缺失值。
?部分Excel文件數(shù)據(jù)截圖如下所示:
具體代碼如下所示:
輸出結(jié)果如下所示:
????????其中data.describe()輸出數(shù)據(jù)的基本信息統(tǒng)計(jì),其方法參考前面的圖,包括count計(jì)數(shù)、std、max等函數(shù)。同時(shí)因?yàn)镋xcel表格中存在空值,故Python顯示為NaN(Not a Number)表示空。
2.Series
????????Series是一維標(biāo)記數(shù)組,可以存儲(chǔ)任意數(shù)據(jù)類型,如整型、字符串、浮點(diǎn)型和Python對(duì)象等,軸標(biāo)一般指索引。
????????Series、Numpy中的一維array 、Python基本數(shù)據(jù)結(jié)構(gòu)List區(qū)別:List中的元素可以是不同的數(shù)據(jù)類型,而Array和Series中則只允許存儲(chǔ)相同的數(shù)據(jù)類型,這樣可以更有效的使用內(nèi)存,提高運(yùn)算效率。
from pandas import Series, DataFrame#通過傳遞一個(gè)list對(duì)象來創(chuàng)建Series,默認(rèn)創(chuàng)建整型索引;
a = Series([4, 7, -5, 3])
print u'創(chuàng)建Series:'
print a#創(chuàng)建一個(gè)帶有索引來確定每一個(gè)數(shù)據(jù)點(diǎn)的Series ;
b = Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
print u'創(chuàng)建帶有索引的Series:'
print b#如果你有一些數(shù)據(jù)在一個(gè)Python字典中,你可以通過傳遞字典來創(chuàng)建一個(gè)Series;
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
c = Series(sdata)
print u'通過傳遞字典創(chuàng)建Series:'
print c
states = ['California', 'Ohio', 'Oregon', 'Texas']
d = Series(sdata, index=states)
print u'California沒有字典為空:'
print d
?輸出如下所示:
Series的一個(gè)重要功能是在算術(shù)運(yùn)算中它會(huì)自動(dòng)對(duì)齊不同索引的數(shù)據(jù)。
3.DataFrame ?????
????????DataFrame是二維標(biāo)記數(shù)據(jù)結(jié)構(gòu),列可以是不同的數(shù)據(jù)類型。它是最常用的pandas對(duì)象,像Series一樣可以接收多種輸入:lists、dicts、series和DataFrame等。初始化對(duì)象時(shí),除了數(shù)據(jù)還可以傳index和columns這兩個(gè)參數(shù)。
????????注意:
????????(1) 在pandas中用函數(shù) isnull 和 notnull 來檢測數(shù)據(jù)丟失:pd.isnull(a)、pd.notnull(b)。
????????Series也提供了這些函數(shù)的實(shí)例方法:a.isnull()。
????????(2)?Pandas提供了大量的方法能夠輕松的對(duì)Series,DataFrame和Panel對(duì)象進(jìn)行各種符合各種邏輯關(guān)系的合并操作。如:Concat、Merge (類似于SQL類型的合并)、Append (將一行連接到一個(gè)DataFrame上)。
????????(3)?DataFrame中常常會(huì)出現(xiàn)重復(fù)行,DataFrame的duplicated方法返回一個(gè)布爾型Series,表示各行是否是重復(fù)行;還有一個(gè)drop_duplicated方法,它返回一個(gè)移除了重復(fù)行的DataFrame。
????????總之,Pandas是非常強(qiáng)大的一個(gè)數(shù)據(jù)分析包,很多功能都需要我自己去慢慢摸索。
四. Matplotlib畫圖包
????????Matplotlib是一個(gè)Python的圖形框架,類似于MATLAB和R語言。它是python最著名的繪圖庫,它提供了一整套和matlab相似的命令A(yù)PI,十分適合交互式地進(jìn)行制圖。而且也可以方便地將它作為繪圖控件,嵌入GUI應(yīng)用程序中。
????????補(bǔ)充兩張圖,原自《Python數(shù)據(jù)分析與挖掘?qū)崙?zhàn)》,對(duì)大家繪圖很有幫助。
???????最常用的畫圖函數(shù)是plot,同時(shí)常用的設(shè)置樣式方法見下圖。
????????這里主要使用前面第三部分Pandas讀取的電力數(shù)據(jù)繪制圖形,主要是柱狀圖和餅圖。
1.繪制柱狀圖
# -*- coding: utf-8 -*-
"""
Created on Mon Nov 14 04:06:01 2016
@author: yxz15
"""#導(dǎo)入數(shù)據(jù)集
import pandas as pd
data = pd.read_excel("missing_data.xls", header=None)?
mm = data.sum()
print u'計(jì)算用電量總數(shù):'
print mm#繪制圖形
import numpy as np
import matplotlib.pyplot as plt
#中文字體顯示
plt.rc('font', family='SimHei', size=13)
N = 3
#3個(gè)用戶 0 1 2
ind = np.arange(N) ?# the x locations for the groups?
print ind
#設(shè)置寬度
width = 0.35 ? ? ? ?
x = [u'用戶A', u'用戶B', u'用戶C']
#繪圖
plt.bar(ind, mm, width, color='r', label='sum num')
plt.xlabel(u"用戶名")
plt.ylabel(u"總耗電量")
plt.title(u'電力竊漏電用戶自動(dòng)識(shí)別--總耗電量')
plt.legend()
#設(shè)置底部名稱
plt.xticks(ind+width/2, x, rotation=40) #旋轉(zhuǎn)40度
plt.show()
輸出如下所示:
2.繪制餅圖
import matplotlib.pyplot as pltfracs = [45, 30, 25] ? ? ? ? ? ? #每一塊占得比例,總和為100 n = mm[0]+mm[1]+mm[2] a = (mm[0]*1.0*100/n) b = (mm[1]*1.0*100/n) c = (mm[2]*1.0*100/n) print a, b, c, n fracs = [a, b, c]explode=(0, 0, 0.08) ? ? ? ? ? ? #離開整體的距離,看效果 labels = 'A', 'B', 'C' ? ? ? ? ? #對(duì)應(yīng)每一塊的標(biāo)志plt.pie(fracs, explode=explode, labels=labels,autopct='%1.1f%%', shadow=True, startangle=90, colors = ("g", "r", "y"))# startangle是開始的角度,默認(rèn)為0,從這里開始按逆時(shí)針方向依次展開plt.title('Raining Hogs and Dogs') ? #標(biāo)題plt.show()
輸出如下所示:
?3.柱狀圖及比例顯示
import matplotlib.pyplot as plt import numpy as np plt.rc('font', family='SimHei', size=13)num = np.array([13325, 9403, 9227, 8651]) ratio = np.array([0.75, 0.76, 0.72, 0.75]) men = num * ratio women = num * (1-ratio) x = [u'聊天',u'支付',u'團(tuán)購\n優(yōu)惠券',u'在線視頻']width = 0.5 idx = np.arange(len(x)) plt.bar(idx, men, width, color='red', label=u'男性用戶') plt.bar(idx, women, width, bottom=men, color='yellow', label=u'女性用戶') plt.xlabel(u'應(yīng)用類別') plt.ylabel(u'男女分布') plt.xticks(idx+width/2, x, rotation=40) plt.legend() plt.show()
????????輸出如下所示
????????當(dāng)然該包可以繪制更多的圖形,希望讀者自己去學(xué)習(xí)。比如線性回歸:
? ?
????????matplotlib.pyplot是用來畫圖的方法,matplotlib是可視化包。
????????import matplotlib.pyplot as plt
????????繪制散點(diǎn)圖(scatter),橫軸為x,獲取的第1列數(shù)據(jù);縱軸為y,獲取的第2列數(shù)據(jù);c=y_pred對(duì)聚類的預(yù)測結(jié)果畫出散點(diǎn)圖,marker='o'說明用點(diǎn)表示圖形。
????????plt.scatter(x, y, c=y_pred, marker='o')?
????????表示圖形的標(biāo)題為Kmeans-heightweight Data。
????????plt.title("Kmeans-Basketball Data")
????????表示圖形x軸的標(biāo)題。
????????plt.xlabel("assists_per_minute")
????????表示圖形y軸的標(biāo)題。
????????plt.ylabel("points_per_minute")?
????????設(shè)置右上角圖例。
????????plt.legend(["Rank"])?
????????表示顯示圖形。
????????plt.show()
?————————————————?
版權(quán)聲明:本文為CSDN博主「Eastmount」的原創(chuàng)文章,遵循CC 4.0 by-sa版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/eastmount/article/details/53144633
總結(jié)
以上是生活随笔為你收集整理的Python常用扩展包的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 投稿选刊方面
- 下一篇: python中的with