學(xué)習(xí)手札的內(nèi)容來源于 《Python 數(shù)據(jù)爬取與實戰(zhàn)手冊》——郭卡 戴亮
其中操作環(huán)境都是 Windows 系統(tǒng)赎线,我在 Linux 環(huán)境浪汪,難以驗證所記手段的可操作性
提要
- Numpy 庫的使用 - 單一類型數(shù)據(jù)處理
- Pandas 庫的 DataFrame 結(jié)構(gòu) - 復(fù)雜類型數(shù)據(jù)處理
- Scikit-learn 庫斜友,數(shù)據(jù)建模的基本過程
單一類型數(shù)據(jù)處理 - Numpy 庫
import numpy as np
1. ndarray
數(shù)組
1.1 數(shù)組類型
ndarray
數(shù)組的所有元素類型可通過 np.typeDict.values()
查得。
1.2 生成數(shù)組
(1) 生成等差數(shù)列 np.arrange()
, np.linspace()
(2) 生成 n 維數(shù)組 np.zeros()
, np.ones()
, np.full()
.
(3) 數(shù)組變形 a.reshape()
1.3 數(shù)組切片
(1) 一維數(shù)組切片語法與 python 序列基本相同
(2) 多維數(shù)組(以二維為例)以下語法:
連續(xù)切片: a[2, 2:4]
不連續(xù)切片:a[ [2,3,4]
, [1,3,4] ]
倒序切片: a[2:4, :: -1]
條件篩選切片:a[a<21]
1.4 數(shù)組運算
拼接、分解贮匕、轉(zhuǎn)置勺良、行列式(方陣)绰播、求逆矩陣(方陣)、點乘
2. Numpy 常用函數(shù)
2.1 均值尚困、方差
求和 np.sum()
求均值 np.mean()
求方差 np.var()
標(biāo)準(zhǔn)差 np.std()
最值 np.max()
, np.min()
中位數(shù) np.median()
統(tǒng)計百分位數(shù) np.percentile()
2.2 隨機數(shù)(與 Python 內(nèi)置庫 random 用法類似)
2.3 數(shù)據(jù)處理
去重 np.unique()
直方圖統(tǒng)計 np.histogram()
相關(guān)系數(shù) np.corrcoef()
遍歷 np.piecewise()
, np.select()
, 都是對滿足條件的元素應(yīng)用某種修改蠢箩,還有 np.where()
,返回符合條件的元素的下標(biāo)事甜。
多項式擬合 np.polyfit()
2.3 動態(tài)數(shù)組
使用 Python 內(nèi)建類型 array
實現(xiàn)動態(tài)數(shù)組 a[]谬泌,再用 np.frombuffer()
創(chuàng)建一個與 a[] 共享內(nèi)存的 ndarray
。
3. 性能優(yōu)化
3.1 Numpy 語句優(yōu)化
a = np.zeros(10000)
b = a * 2 # 隱式拷貝
a *= 2 #就地操作
# 就地操作要比拷貝操作性能高得多逻谦。
3.2 用 numexpr 優(yōu)化 Numpy 速度
import numpy as np
import numexpr as ne
a = np.linspace(1, 100, 10000)
b = a.reshape(100, 100)
c = a.reshape(100, 100)
timeit ne.evaluate("sin(b) + cos(c)")
10000 loops, best of 3: 126 us per loop
timeit np.sin(b)+np.cos(c)
10000 loops, best of 3: 371 us per loop
復(fù)雜類型數(shù)據(jù)處理 - Pandas 庫
Pandas 在 Numpy 的基礎(chǔ)上開發(fā)掌实,適用于處理大量復(fù)雜數(shù)據(jù)。
import pandas as pd
-
四種基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)
Series邦马、Time-Series贱鼻、DataFrame、Panel
- Series 同時具有一維數(shù)組和字典的性質(zhì)
a = pd.Series( [7, 8, 9, 10], ['a', 'b', 'c', 'd'] )
>>> a[1]
8
>>> a['a']
7
- Time-Series 就是使用時間戳作為索引的 Series滋将,具備 Series 的所有功能
>>> datas = ['2017-06-20', '2017-06-21', '2017-06-22', '2017-06-23', ... ]
>>> ts = pd.Series(np.arrange(1, 7, 1), index = pd.to_datetime(dates))
>> ts
2017-06-20 1
2017-06-21 2
2017-06-22 3
2017-06-23 4
... ...
從 Time-Series 中讀取元素不需嚴(yán)格的時間格式邻悬,只需傳入能被轉(zhuǎn)成時間格式的參數(shù)即可。
>>> ts['2017/06/20']
1
>>> ts['2017 06 20']
1
- DataFrame 是 Pandas 中最常用的數(shù)據(jù)結(jié)構(gòu)随闽,可看成是多個有相同索引的 Series 的組合
>>> df = pd.DataFrame(np.arrange(1, 13 ,1).reshape(4,3),
... index=['a', 'b', 'c', 'd'], columns=['A', 'B', 'C'])
>>> df
A B C
a 1 2 3
b 4 5 6
c 7 8 9
d 10 11 12
>>> df1 = pd.DataFrame( {'A': [1, 4, 7, 10], 'B': [2, 5, 8, 11], 'C':[3, 6, 9, 12]},
... index = ['a', 'b', 'c', 'd'])
>> df1
A B C
a 1 2 3
b 4 5 6
c 7 8 9
d 10 11 12
DataFrame 增拘悦、刪、查橱脸、改 操作:
獲取列名與索引
df.columns
,df.index
讀取元素df.['xxx'][1]
,df.get_value(1, 'xxx')
,df.at[1, 'xxx']
,df.iat[1,6]
,df.loc[1, 'xxx']
,df.iloc[1,6]
讀取一行或一列df['xxx']
,df[6]
刪除列del df['xxx']
刪除行df = df.drop([1, 4])
刪除第 1础米、4 行
插入列df['newIndex'] = np.arrange(1, 11, 1)
插入行df.loc[MAXROW +1] = np.arrange(1, 8, 1)
改變列順序 將已有的索引按想要的順序排列給df.columns
賦值即可df.columns = ['zzz', ..., 'bbb', 'aaa']
修改數(shù)據(jù)類型df['xxx'] = df['xxx'].astype(np.float)
篩選數(shù)據(jù)
>>> df['xxx'][ df['a'] > 2 & df['b'] < 5]
統(tǒng)計函數(shù)
由于 Pandas 是基于 Numpy 開發(fā)的,大部分 Numpy 統(tǒng)計函數(shù)都可用添诉,如sum() mean() median() count()
等等屁桑。
-
Panel
Series 是一維,DataFrame 是二維栏赴,Panel 就是三維蘑斧。
Panel 的創(chuàng)建
(1) 由三維數(shù)組直接創(chuàng)建 p = pd.Panel([[[9, 2], [4, 6]], [[3, 8], [7, 5]]])
(2) 由 DataFrame 數(shù)組創(chuàng)建,如下
>>> n = pd.DataFrame({0:[1,4], 1:[2,5], 3:[3,6] })
>>> n
0 1 2
0 1 2 3
1 4 5 6
>>> j = pd.Panel('a': n, 'b': n) #在 DataFrame 的基礎(chǔ)山加了一個維度
2. Pandas 使用技巧
Pandas 對 Python 中影響計算速度的操作均進行了優(yōu)化,在數(shù)據(jù)處理過程中盡量使用 Pandas 方法竖瘾,可以十分有效地提升數(shù)據(jù)處理速度(尤其在大數(shù)據(jù)量時沟突,性能提升甚至可達(dá)十倍以上)。
- 快速逐行遍歷
df.iterrows()
for x in df.iterrows() ...
- 批量數(shù)據(jù)處理
df.apply()
df1 = df['B'].apply(lambda x: x/2) # 處理 'B' 列
df1 = df.apply(lambda row: row['A'] + row['B'], axis=1) # 按行處理捕传,注意 axis 參數(shù)
df1 = df.apply(lambda x: x**2) #全體遍歷處理
#上面的 lambda 表達(dá)式也可以替換成函數(shù)
- 處理缺失數(shù)據(jù)
>>> a
A B
0 1 2
1 3 4
2 5 6
>>> a=a.where(a > 3)
A B
0 NaN NaN
1 NaN 4.0
2 5.0 6.0
# 出現(xiàn) NaN 之后數(shù)值類型變成了 float惠拭。
可以直接去除 NaN: a=a.dropna()
,或者填充新值: a=a.fillna({'A': 1, 'B': 2})
Python 機器學(xué)習(xí)庫 Scikit-learn
未上手庸论,容后再續(xù)
End