学习手札的内容来源于 《Python 数据爬取与实战手册》——郭卡 戴亮
其中操作环境都是 Windows 系统,我在 Linux 环境,难以验证所记手段的可操作性
提要
- Numpy 库的使用 - 单一类型数据处理
- Pandas 库的 DataFrame 结构 - 复杂类型数据处理
- Scikit-learn 库,数据建模的基本过程
单一类型数据处理 - Numpy 库
import numpy as np
1. ndarray
数组
1.1 数组类型
ndarray
数组的所有元素类型可通过 np.typeDict.values()
查得。
1.2 生成数组
(1) 生成等差数列 np.arrange()
, np.linspace()
(2) 生成 n 维数组 np.zeros()
, np.ones()
, np.full()
.
(3) 数组变形 a.reshape()
1.3 数组切片
(1) 一维数组切片语法与 python 序列基本相同
(2) 多维数组(以二维为例)以下语法:
连续切片: a[2, 2:4]
不连续切片:a[ [2,3,4]
, [1,3,4] ]
倒序切片: a[2:4, :: -1]
条件筛选切片:a[a<21]
1.4 数组运算
拼接、分解、转置、行列式(方阵)、求逆矩阵(方阵)、点乘
2. Numpy 常用函数
2.1 均值、方差
求和 np.sum()
求均值 np.mean()
求方差 np.var()
标准差 np.std()
最值 np.max()
, np.min()
中位数 np.median()
统计百分位数 np.percentile()
2.2 随机数(与 Python 内置库 random 用法类似)
2.3 数据处理
去重 np.unique()
直方图统计 np.histogram()
相关系数 np.corrcoef()
遍历 np.piecewise()
, np.select()
, 都是对满足条件的元素应用某种修改,还有 np.where()
,返回符合条件的元素的下标。
多项式拟合 np.polyfit()
2.3 动态数组
使用 Python 内建类型 array
实现动态数组 a[],再用 np.frombuffer()
创建一个与 a[] 共享内存的 ndarray
。
3. 性能优化
3.1 Numpy 语句优化
a = np.zeros(10000)
b = a * 2 # 隐式拷贝
a *= 2 #就地操作
# 就地操作要比拷贝操作性能高得多。
3.2 用 numexpr 优化 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
复杂类型数据处理 - Pandas 库
Pandas 在 Numpy 的基础上开发,适用于处理大量复杂数据。
import pandas as pd
-
四种基础数据结构
Series、Time-Series、DataFrame、Panel
- Series 同时具有一维数组和字典的性质
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 中读取元素不需严格的时间格式,只需传入能被转成时间格式的参数即可。
>>> ts['2017/06/20']
1
>>> ts['2017 06 20']
1
- DataFrame 是 Pandas 中最常用的数据结构,可看成是多个有相同索引的 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']
修改数据类型df['xxx'] = df['xxx'].astype(np.float)
筛选数据
>>> df['xxx'][ df['a'] > 2 & df['b'] < 5]
统计函数
由于 Pandas 是基于 Numpy 开发的,大部分 Numpy 统计函数都可用,如sum() mean() median() count()
等等。
-
Panel
Series 是一维,DataFrame 是二维,Panel 就是三维。
Panel 的创建
(1) 由三维数组直接创建 p = pd.Panel([[[9, 2], [4, 6]], [[3, 8], [7, 5]]])
(2) 由 DataFrame 数组创建,如下
>>> 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 的基础山加了一个维度
2. Pandas 使用技巧
Pandas 对 Python 中影响计算速度的操作均进行了优化,在数据处理过程中尽量使用 Pandas 方法,可以十分有效地提升数据处理速度(尤其在大数据量时,性能提升甚至可达十倍以上)。
- 快速逐行遍历
df.iterrows()
for x in df.iterrows() ...
- 批量数据处理
df.apply()
df1 = df['B'].apply(lambda x: x/2) # 处理 'B' 列
df1 = df.apply(lambda row: row['A'] + row['B'], axis=1) # 按行处理,注意 axis 参数
df1 = df.apply(lambda x: x**2) #全体遍历处理
#上面的 lambda 表达式也可以替换成函数
- 处理缺失数据
>>> 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
# 出现 NaN 之后数值类型变成了 float。
可以直接去除 NaN: a=a.dropna()
,或者填充新值: a=a.fillna({'A': 1, 'B': 2})
Python 机器学习库 Scikit-learn
未上手,容后再续
End