zcabcd 2019-06-28
本篇内容为整理《利用Python进行数据分析》,博主使用代码为 Python3,部分内容和书本有出入。
利用 Python 进行科学计算的实用指南。本书重点介绍了用于高效解决各种数据分析问题的 Python 语言和库,没有阐述如何利用 Python 实现具体的分析方法。
NumPy
NumPy (Numerical Python)是 Python 科学计算的基础包。
pandas
pandas 提供了使我们能够快速便捷地处理结构化数据的大量数据结构和函数。
结构化数据 (structured data),例如:
· 多维数据(矩阵)
· 表格行数据,其中各列可能是不同的类型(字符串、数值、日期等)。
· 通过关键列相互联系的多个表(关键列:对于 SQL 用户而言,即主键和外键)。
· 间隔平均或不平均的时间序列。matplotlib
matplotlib 是最流行的用于绘制数据图表的 Python 库。
SciPy
SciPy 是一组专门解决科学计算中各种标准问题域的包的集合。
NUmPy (Numerical Python)——高性能科学计算和数据分析的基础包。
你可以用这种数组对整块数据执行一些数学运算,其语法跟标量元素之间的运算一样。创建并操作多维数组:
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiZeUkEvAIVIr3Kyb7EBXVNOChHAu1Kj6iSWHCF5N0GIyFssWE08KSLsz0VowFr5fv8.jpg)
ndarray对象中所有元素必须是相同类型的,每个数组都有一个shape和dtype。
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAibpXlnb6PPlQwQXjfq6YMAayG20-wz1Z205SalYKbJYvkJ_oRWfaNCbKgXKXc7L-t0.jpg)
创建数组最简单的办法就是使用 array 函数,它接受一切序列型对象(包括其它数组),然后产生一个新的NumPy数组(含有原来的数据)。
np.array会尝试为新建的这个数组推断出一个较为合适的数据类型,这个数据类型保存在一个特殊的dtype对象中。
zeros 和 ones 也分别可以创建指定大小的全 0 或全 1 数组,empty 可以创建一个没有任何具体值的数组(它返回的都是一些未初始化的垃圾值):
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiYUHfRFf6_GEoqmMaSEeNo3XZWFwFwSdMFagoAaO8IgPUtvUgdBl9l8Al0-ql9ODnM.jpg)
arange是 Python 内置函数range的数组版,np.arange返回间隔均匀的一些值。
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAibWfjkubQSgJ_hl-FS_dupgCOs0PlqxsyToX9OUuC6-bFZl3B11EwdllJk3ToINYtI.jpg)
dtype(数据类型)是一个特殊的对象,它含有 ndarray 将一块内存解释为特定数据类型所需的信息。
需要知道你所处理的数据的大致类型是浮点数、复数、整数、布尔值、字符串,还是普通的 python 对象。当你需要控制数据在内存和磁盘中的存储方式时,就得了解如何控制存储类型。
可通过ndarray的astype方法显示地转换其dtype:
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAibNCKcP4Q3UuQHiBwTzCNnSUJnXaAVu9Xd1r_poIn8VZiCkVbgNtQXb8BK6EyLQtAg.jpg)
若将浮点数转换成整数,则小数部分将会被截断。
若某字符串数组表示的全是数字,可用astype将其转换为数值形式:
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiaNbQ1dJI5QJH4rAh2LagZ8L1f0MQCitFiPoit8P24KiuAHU4lN7wvq2tvD2EfFH08.jpg)
这里没写 np.float64 只写了 float,但是NumPy会将 Python 类型映射到等价的dtype上。
数组的dtype的另一个用法:
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAibVJxbN6y6MPQvdTqEIlW89mUjWiupF1Z1r4kFYE74ahywLFr0r8FfhWm91J5OagKI.jpg)
int_array变成了和calibers一样的浮点型数组
用简洁类型的代码表示dtype:
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiZUtI1uKhvWDRI8OrNf1zBAvOVLfnLQWY7D7lhklHGagX4-Zu642y56cmEUuSyDM4U.jpg)
u4(unit32):无符号的 32 位(4个字节)整型。
调用astype无论如何都会创建出一个新的数组(原始数据的一份拷贝)。
浮点数只能表示近似的分数值,在复杂计算中可能会积累一些浮点错误,因此比较操作只在一定小数位以内有效。
数组:可对数据执行批量运算(不用编写循环即可)。这通常叫做矢量化(vectorization)。
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiYkS4tGev-x4gs_yrDSZpMo8WTzn-X4mf00Gm59ywmChC4HaggfszBJXhrCH1eZNzY.jpg)
数据不会被复制,任何修改都直接改了原数组。
如果仅是要一份副本,则用 .copy()。
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiZLNusQ-nEkpVQy6DrZ2riGgwzor3G0TIOKWJToCRHIAAwsVJRQbXFaeLHvxLoqKEg.jpg)
对二维数组单个元素的索引:
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiaylWcTgqdjjpBrC19h0nCeqqymtHmzf7PuxaO9kr3NeUlTssCAKbltCl3ys87UR8c.jpg)
这两种方式等价。
若arr2d[2],则输出的是一维数组[7,8,9]。
2*2*3的数组(2组2行3列):
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAibCOy9am5cq01XgNFKtAYluXi2lBKZss70KJkfRok4tkVxP5hJkrwiTIwps8uuxF44.jpg)
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiZiCLbYEecj274iUMH2zuyZjpOIv4kyarcNz4m4V-wY3MIDr_yC-87sq1hf4j-cFHo.jpg)
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiam-8xGueoWb6KUVKo85cssJhXLQLazCPE8m7idvHAh-AlqW_5eqEOlhxWkK8ZBLOU.jpg)
需要先引入:
from numpy.random import randn
或将代码改成
data = np.random.randn(7, 4)
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiYdy9mdNTM9zntSBlFXIRrbFj4-RFCcEM_ZN4Gk3o7gMzqdkFdp7RoQFVWm_qPeI-4.jpg)
布尔型数组的长度必须跟被索引的轴长度一致。每个名字对应 data 数组一行。
对条件进行否定的两种方式:
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAia3oqwoKUcSwkVRM2Kec4vyXFwbMQAcmwz5qiHdlHljuDbKHpVvaTSeiCwWOMZgCF4.jpg)
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAianx1chKMrOCeJZavZkjo468XwQ9ZTBFHwYTomS1c6RqU50el-rq36I0GmxCYxz-Y0.jpg)
组合应用多个布尔条件,可使用&、|等布尔算术运算符:
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiaSnWHzQ7VpglqWqIWBddzyc8h9s4CIuXVYj3nZ-k5jwwpq7hIETNGG4nZLE-14OVw.jpg)
通过布尔型索引选取数组中的数组,将总是创建数据的副本,即使返回一模一样的数组也是一样。
通过布尔型数组设置值:
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAibN0R_u6SCa32yfVD2IbhBEZmZXX7W8g1khjvEl6zgMigKIVprjlaAqkwJDlFZ5kuY.jpg)
通过一维布尔数组设置整行或列的值:
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiYj-8xUn-taV0rbcPisO_WLNh0pp9t-rSH7EGzX1I3SOqvKVSR2LRbZWwN299MQKbw.jpg)
指利用整数数组进行索引。
np.empty((8,4)) Return a new array of given shape and type, without initializing entries.
for i in range(8):
arr[i] = i
Return an object that produces a sequence of integers from start (inclusive)
to stop (exclusive) by step.![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiaVwU-vJS7nTt3nYgyh8S9qyxCU7YYm71-a3HEtyrUmc1sZ6InYdhjal3kh0tkPRSA.jpg)
为了以特定顺序选取行的子集,只需传入一个用于指定顺序的整数列表或 ndarray,使用负数索引会从末尾开始选取行(最后一行是 -1)。
一次传入多个索引组,返回一个一维数组:
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiZ6fMu-5R2YfZ7ZmcJdsTv6-OsBup4XL92XjcWCMpEN6UwdR9_KdpTS1DDDUPDDcU0.jpg)
取整列的两种方法,相当于给列排了顺序:
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiYGTkloWvZoRilDNp0VmpAzPVMkwaOy6fUzeiSaZyepR9TJCjMi28kuxcdewRee5uY.jpg)
花式索引跟切片不一样,总是将数据复制到新数组中。
转置返回的是源数据的视图,不进行任何复制操作。数组有 transpose 方法,还有一个 T 属性来完成转置:
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiY11nKK_5PkGHUG7DvXwRpBNBe2c2buwYwQ_pp_mK2vTSgVs6H3qC11XGIFk9wFqW8.jpg)
高维数组transpose 要一个轴编号:
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiZpaOo_KPCMipEY-7zHIQHNhFjDoRMvaTGHNp23O4ijO10PmbQBAcG0LZ__87oLkyI.jpg)
arr是 2 组 2 行 4 列的数组,transpose的参数表示shape的形状,对于这个例子来说,即2[0]、2[1]、4[2],transpose(1,0,2)转置后变为2[1]、2[0]、4[2],看起来仍是 2 组 2 行 4 列的形状,但数组内的元素经过转换后索引已经改变,也要遵循(1,0,2)的顺序。如转置前的数组arr[0,1,0]索引值为 4,转置后的数组arr'[1,0,0],索引值才为 4。其它同理。
ndarray 的 swapaxes 方法接受一对轴编号且返回源数据的视图:
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAia3bKDAp3QUfKh_YtcBFR3Il4-QIyzvl-h9W19GFweCPVarFHJeWoP2QDBvsgfg_Ds.jpg)
转置后的数组arr.T为 4[2] 组 2[1] 行 2[0] 列数组,swapaxes(1,2)就是将第二个维度(中括号内数字)和第三个维度交换,即转换为 2 组 4 行 2 列。
通用函数(即 ufunc)是一种对ndarray中的数据执行元素级运算的函数,就是一些简单函数。
用数组表达式代替循环的做法,通常被称为矢量化。NumPy 数组将多种数据处理任务表述为数组表达式。
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiaalEpf2wYAQuEU_1GP6zLFsZeAnyqOWZyxJN-n43-qr1i2H8-ekz-P06t-KSyFOBs.jpg)
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiYaODHA-2kUmvpyXup9r90_T7EVev-CbzM_TpBfelRS2mF90Q5dR48fMvHtz8OEQco.jpg)
np.meshgrid函数接受两个一维数组,并产生两个二维矩阵(对应于两个数组中所有的(x, y)对。
np.wherea函数是三元表达式x if condition else y的矢量化版本。
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAibczSMNltJ5Dib5UNIVoauWt-8M2gFs6ObKyp4oV9iSBMZCcSbeK7fJvlU3fPHNL2M.jpg)
np.where的第二个和第三个参数不必是数组,传递给where的数组大小可以不相等,甚至可以是标量值。在数据分析工作中,where通常用于根据另一个数组而产生一个新的数组。
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAib4btx9zWsU78nU-K88jl7ogPhG2VvNb_XK9PMLde2wXO4l1I21ggiMChwblOHXrOI.jpg)
用where表述出更复杂的逻辑:(where的嵌套)
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiZpSurJryORl2tcldqG0V7unO7YE59fd20m4_ZYakqEkDBs8FjoIY8OYqo_HbJrJ_A.jpg)
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiaN1V79ibLWczT-51er-AqmVI5brOT1l6HQIOB32T8Iy5PWP5Bf3sCuHbSTRodQlVI.jpg)
有两个方法any和all。
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAibFNEIUK8U-MCa4bRnHp1N7WKYXp84pi8hKryDAAzxtP2Qb7RF9cFTxj1nrqKKtrzs.jpg)
多维数组可以在任何一个轴向上进行排序,只需将轴编号传给sort:
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAibL2neWq_3x0u20u1u6HzU8Ibw9vf3XB1YL9cX23UV0yRIWnxCtn4roRxTv2zm1p2A.jpg)
顶级方法np.sort返回的数组已排序的副本,就地排序则会修改数组。
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiZ4lTht9qf-meWmDqp24NCNDaajSfg9U1my-nuaRmDyjPFaCfKJkztnOZ2n4A0WuL8.jpg)
np.unique找出数组中的唯一值并返回已排序的结果。
![【数据科学系统学习】Python # 数据分析基本操作[一] numpy 【数据科学系统学习】Python # 数据分析基本操作[一] numpy](https://cdn.ancii.com/article/image/v1/Qj/zb/RO/ORzjbQVFJasX5aR2DaTg2_Zx5KSH75KdTtVIpx5BAiYoQZj70oWhh0zCKN00mAsz7ESTl6z5k_4c0SfruP6JHds9mOYWI2CA23vgdfpuK4E.jpg)
np.in1d用于测试一个数组的值在另一个数组的情况。
numpy.random模块多了用于高效生产多种概率分布的样本值的函数(用来生成大量样本值)。
不足之处,欢迎指正。