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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,941评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,397评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,345评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,851评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,868评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,688评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,414评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,319评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,775评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,945评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,096评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,789评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,437评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,993评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,107评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,308评论 3 372
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,037评论 2 355

推荐阅读更多精彩内容