numpy是數(shù)據(jù)分析中最基礎(chǔ)的分析庫,而numpy中最重要的部分是ndarray;ndarry就是N維數(shù)組對象,該對象是一個快速而靈活的大數(shù)據(jù)集容器。ndarry是一個通用的同構(gòu)數(shù)據(jù)多維容器,所有元素必須是相同類型的arr1 = np.array([6, 7.5, 8, 0, 1]);arr2 = np.array([[1, 2, 3, 4], [5, 6, 7, 8]]);arr1和arr2都是ndarray對象。
1numpy庫
1.1利用數(shù)組進(jìn)行數(shù)據(jù)處理
np.meshgrid函數(shù)接受兩個一維數(shù)組,并產(chǎn)?生兩個二維矩陣(對應(yīng)于兩個數(shù)組中所有的(x,y)
points = np.arange(-5, 5, 0.01)
xs, ys = np.meshgrid(points, points)
z = np.sqrt(xs ** 2 + ys ** 2)
points = np.arange(-5, 5, 0.01) 表示生成從-5到5,步長為0.01的1000個數(shù)。
上面xs將把points按行重復(fù)1000遍(即每行內(nèi)容相同);ys將把points按列重復(fù)1000遍(即每列內(nèi)容相同);np.sqrt(xs ** 2 + ys ** 2)表示對兩個數(shù)平方在開方。
二維數(shù)組的可視化
%matplotlib#把matplotlib放入后臺運行
import matplotlib.pyplot as plt
plt.imshow(z, cmap=plt.cm.gray); plt.colorbar() ; 數(shù)組 ,顏色
plt.title("Image plot of $\sqrt{x^2 + y^2}$ for a grid of values") # 設(shè)置標(biāo)題
plt.show()
1.2將條件邏輯表述為數(shù)組運算
xarr = np.array([1.1, 1.2, 1.3, 1.4, 1.5])
yarr = np.array([2.1, 2.2, 2.3, 2.4, 2.5])
cond = np.array([True, False, True, True, False])
result = np.where(cond, xarr, yarr)
上面表示當(dāng)cond中的值為True時,選取xarr的值,否則從yarr中選取
np.where(arr > 0, 2, -2) 將arr中大于0的換為2,不大于0的變?yōu)?2
np.where(arr > 0, 2, arr) 將arr中大于0的換為2,不大于0的不變
1.3數(shù)學(xué)和統(tǒng)計方法
可以通過數(shù)組上的一組數(shù)學(xué)函數(shù)對整個數(shù)組或某個軸向的數(shù)據(jù)進(jìn)行統(tǒng)計算。sum(求和)、mean(求平均值)以 及標(biāo)準(zhǔn)差std等聚合計算(aggregation,通常叫做約簡(reduction))
arr.mean(1)是“計算行的平均值”,arr.sum(0)是“計算每列的和”
arr.cumsum(axis=0) 計算每列累加的和;arr.cumprod(axis=1) 計算每行累積的和
bools = np.array([False, False, True, False])
bools.any()
bools.all()
any用于測試數(shù)組中是否存在一個或多個True,而all則檢查數(shù)組中所有值是否都是True, 這兩個方法也能用于非布爾型數(shù)組,所有非0元素將會被當(dāng)做True。
1.4排序
arr = np.random.randn(6)
arr.sort()
arr.sort(1) # 對行進(jìn)行升序排序
np.sort(arr,0) # 對arr進(jìn)行按列排序
arr.sort() 對arr進(jìn)行升序排序,會修改arr;就地排序會修改數(shù)組。
np.sort(arr,0)對arr進(jìn)行按列排序,不會修改arr;返回的是數(shù)組的已排序副本
1.5數(shù)組的唯一化
ints = np.array([3, 3, 3, 2, 2, 1, 1])
np.unique(ints)
np.unique(names) 找出數(shù)組中的唯一值并返回已排序的結(jié)果
1.6檢查一個數(shù)組中的值是否在另一個數(shù)組中
函數(shù)np.in1d用于測試一個數(shù)組中的值是否在另一個數(shù)組中,返回一個布爾型數(shù)組
values = np.array([6, 0, 0, 3, 2, 5, 6])
np.in1d(values, [2, 3, 6]) #[ True, False, False, True, True, False, True]
intersect1d(x,y)計算x和y中的公共元素,返回有序結(jié)果;union1d(x,y)計算x和y的并集,返回有序結(jié)果;setdiff1d(x,y)集合的差,即元素在x中,不在y中;
1.7數(shù)組的文件輸入輸出
np.save和np.load是讀寫磁盤數(shù)組數(shù)據(jù)的兩個主要函數(shù)。默認(rèn)情況下,數(shù)組是以未壓縮的原始二進(jìn)制格式保存在擴(kuò)展名為.npy的文件中的
arr = np.arange(10)
np.save('some_array', arr) # 保存arr為some_array文件
np.load('some_array.npy') # 打開文件
通過np.savez可以將多個數(shù)組保存到一個未壓縮文件中
np.savez('array_archive.npz', a=arr, b=arr)
arch = np.load('array_archive.npz')
arch['b']
將數(shù)據(jù)壓縮,可以使用numpy.savez_compressed
np.savez_compressed('arrays_compressed.npz', a=arr, b=arr)
1.8線性代數(shù)
矩陣乘法的dot函數(shù)
x = np.array([[1., 2., 3.], [4., 5., 6.]])
y = np.array([[6., 23.], [-1, 7], [8, 9]])
x.dot(y) #[[ 28., 64.],[ 67., 181.]]
一個二維數(shù)組跟一個大小合適的一維數(shù)組的矩陣點積運算之后將會得到一個一維數(shù)組。
@符也可以用作中綴運算符,進(jìn)行矩陣乘法
x @ np.ones(3) #[ 6., 15.]
1.9偽隨機(jī)數(shù)生成
用normal來得到一個標(biāo)準(zhǔn)正態(tài)分布的4×4樣本數(shù)組
samples = np.random.normal(size=(4, 4))
Python內(nèi)置的random模塊則只能一次生成一個樣本值。從下面的測試結(jié)果中可以看出,如果需要產(chǎn)生大量樣本值,numpy.random快了了不止一個數(shù)量級。
numpy.random的數(shù)據(jù)生成函數(shù)使用了全局的隨機(jī)種子。要避免全局狀態(tài),你可以使用numpy.random.RandomState,創(chuàng)建一個與其它隔離的隨機(jī)數(shù)生成器。
rng = np.random.RandomState(1234)
rng.randn(10)
部分numpy.random函數(shù)說明
seed 確定隨機(jī)數(shù)生成器的種子;rand 產(chǎn)生均勻分布的樣本值;從給定的上下范圍內(nèi)隨機(jī)選取整數(shù);randn產(chǎn)生標(biāo)準(zhǔn)正態(tài)分布的樣本值;binomial產(chǎn)生二項分布的樣本值;normal產(chǎn)生正態(tài)分布的樣本值;uniform產(chǎn)生在[0,1]中均勻分布的樣本值。
用np.random模塊一次性隨機(jī)產(chǎn)生1000個“擲硬幣”結(jié)果(即兩個數(shù)中任選一個),將其分別設(shè)置為1或-1,然后計算累計和。
nsteps = 1000
draws = np.random.randint(0, 2, size=nsteps)
steps = np.where(draws > 0, 1, -1)
walk = steps.cumsum()
walk.min()
walk.max()
2pandas的使用
pandas是專門為處理表格和混雜數(shù)據(jù)設(shè)計的,而NumPy更適合處理統(tǒng)一的數(shù)值數(shù)組數(shù)據(jù)。pandas擁有兩個主要數(shù)據(jù)結(jié)構(gòu):Series和DataFrame
Series是一種類似于一維數(shù)組的對象,它由一組數(shù)據(jù)(各種NumPy數(shù)據(jù)類型)以及
一組與之相關(guān)的數(shù)據(jù)標(biāo)簽(即索引)組成
import pandas as pd
obj = pd.Series([4, 7, -5, 3])
創(chuàng)建Series時不設(shè)置index索引,默認(rèn)從0開始步長為1;用于對各個數(shù)據(jù)點進(jìn)行標(biāo)記;也可以對其進(jìn)行設(shè)置索引
obj2 = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
obj2.index
obj2.values
obj2['a'] # 獲取索引為a的值
obj2[['c', 'a', 'd']] # 一次索引多個值
obj2[obj2 > 0] # 篩選出大于0的值
obj2 * 2 # 將值各乘2
'b' in obj2 # 查看索引b是否在obj2中
通過字典創(chuàng)建series及利用索引改變順序
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
obj3 = pd.Series(sdata)
states = ['California', 'Ohio', 'Oregon', 'Texas']
pd.Series(sdata, index=states) # 將重新排序的索引傳入改變數(shù)據(jù)順序
NaN(即“非數(shù)字”(not a number),在pandas中,它用于表示缺失或NA值)
pandas的isnull和notnull函數(shù)可用于檢測缺失數(shù)據(jù)
pd.isnull(obj4) # 查看是否有數(shù)據(jù)為NAN(缺失)
pd.notnull(obj4) # 查看是否沒有數(shù)據(jù)為NAN
Series最重要的一個功能是,它會根據(jù)運算的索引標(biāo)簽自動對齊數(shù)據(jù)
2.1series的name屬性
Series對象本身及其索引都有一個name屬性
obj4.name = 'population' # 給obj4命名為name(顯示時在最后顯示name為population)
obj4.index.name = 'state' #給索引賦name為state(索引的最上面)
Series的索引可以通過賦值的方式就地修改
obj.index = ['Bob', 'Steve', 'Jeff', 'Ryan'] # 給obj的索引重新賦值
2.2DataFrame使用
DataFrame是一個表格型的數(shù)據(jù)結(jié)構(gòu),它含有一組有序的列,每列可以是不同的值類型(數(shù)值、字符串、布爾值等),DataFrame既有行索引也有列索引。
建DataFrame, 傳入一個由等長列表或NumPy數(shù)組組成的字典
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002, 2003],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
frame = pd.DataFrame(data) # 新建一個6行3列的數(shù)據(jù)
frame.head()
特別大的DataFrame,head方法會自動選取前五行;如果指定了了列序列,則DataFrame的列就會按照指定順序進(jìn)行排列。
pd.DataFrame(data, columns=['year', 'state', 'pop'])
frame2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'],
index=['one', 'two', 'three', 'four', 'five', 'six'])
frame2.columns # 取columns中的列名
上面表示新建一個行名為index中的參數(shù),列名為columns中的參數(shù)的數(shù)組
將DataFrame的某列獲取出來成為一個Series
frame2['state']
行也可以通過位置或名稱的方式獲取為一個單獨series
frame2.loc['three']
給”debt”列賦上一個標(biāo)量值或一組值
frame2['debt'] = 16.5
frame2['debt'] = np.arange(6)
如果賦值的是一個Series,就會精確匹配DataFrame的索引,所有的空位都將被填上缺失值
val = pd.Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])
frame2['debt'] = val
為不存在的列賦值會創(chuàng)建出一個新列。關(guān)鍵字del用于刪除列。
frame2['eastern'] = frame2.state == 'Ohio' # 為ohio的賦值為true
del frame2['eastern'] # 刪除列
如果嵌套字典傳給DataFrame,pandas就會被解釋為:外層字典的鍵作為列,內(nèi)層鍵則作為行索引。
pop = {'Nevada': {2001: 2.4, 2002: 2.9},
'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}
frame3 = pd.DataFrame(pop) # 沒有值的就為NaN
2.3對DataFrame進(jìn)行轉(zhuǎn)置
對DataFrame進(jìn)行轉(zhuǎn)置(交換行列)使用T進(jìn)行轉(zhuǎn)置;設(shè)置了DataFrame的index和columns的name屬性,則這些信息也會被顯示出來(被轉(zhuǎn)置)
frame3.T
frame3.index.name = 'year'; frame3.columns.name = 'state'
values屬性也會以二維ndarray的形式返回DataFrame中的數(shù)據(jù)
frame3.values # array([[ nan, 1.5], [ 2.4, 1.7], [ 2.9, 3.6]])
如果DataFrame各列的數(shù)據(jù)類型不同,則值數(shù)組的dtype就會選用能兼容所有列的數(shù)據(jù)類型: