数据分析工具:科学计算库

学习手札的内容来源于 《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

  1. 四种基础数据结构
    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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容