python高级编程之AI数据分析-基础库
基础库.png
前言
使用python做数据分析已经不是什么新的技术,如上图所示,早已被用于各个行业。特别是最近两年,python的应用范围越来越广,各种培训机构也大力推出了python相关课程,在某些省份已经将python作为初高中必修课程,也被纳入到计算机等级考试中。我们有理由相信,python未来的使用会越来越广,而我个人认为这里最有意思的应该是数据分析。比如,马云就知道浙江女性的胸围最小,新疆男人最浪漫,而这全部是基于对淘宝数据得出的。
这些只是数据分析的一个基础应用场景,数据分析在未来将会大大滴改变生活方式。
数据分析我们该学习什么?要做数据分析,我认为必须学习以下知识:
基于上图中的知识列表,我将编写本系列教程,教程目录如下:
- python高级编程之AI数据分析-基础库
- python高级编程之AI数据分析-语法要点
- python高级编程之AI数据分析-数据导入导出
- python高级编程之AI数据分析-提取和筛选
- python高级编程之AI数据分析-数据处理
- python高级编程之AI数据分析-统计分析
- python高级编程之AI数据分析-可视化
从本篇开始,按照上图中的知识图谱,我们逐个模块讲解。
环境配置
我们使用python进行数据控制、处理、整理、分析,这需要用到大量的第三方库,我们该如何管理这些库?如果在做多个项目时,每个项目的环境要求不一致,这样会不会出现环境上的冲突?Anaconda是做企业级大数据分析,在数据分析、可视化、机器学习方面应用非常广。
-
1Anaconda简述
Anaconda是一个用于科学计算的Python发行版,支持 Linux, Mac, Windows系统,提供了包管理与环境管理的功能,可以很方便地解决多版本python并存、切换以及各种第三方包安装问题。Anaconda利用工具/命令conda来进行package和environment的管理,并且已经包含了Python和相关的配套工具。这里先解释下conda、anaconda这些概念的差别。conda可以理解为一个工具,也是一个可执行命令,其核心功能是包管理与环境管理。包管理与pip的使用类似,环境管理则允许用户方便地安装不同版本的python并可以快速切换。Anaconda则是一个打包的集合,里面预装好了conda、某个版本的python、众多packages、科学计算工具等等,所以也称为Python的一种发行版。其实还有Miniconda,顾名思义,它只包含最基本的内容——python与conda,以及相关的必须依赖项,对于空间要求严格的用户,Miniconda是一种选择。进入下文之前,说明一下conda的设计理念——conda将几乎所有的工具、第三方包都当做package对待,甚至包括python和conda自身!因此,conda打破了包管理与环境管理的约束,能非常方便地安装各种版本python、各种package并方便地切换。 -
2 Anaconda安装
可以从这里下载 Anaconda 的安装程序以及查看安装说明。无论是 Windows、Linux 还是 MAC 的 OSX 系统,都可以找到对应的安装软件。如果你的电脑是64位则尽量选64位版本。至于 Python 的版本是 2.7 还是 3.x,这里推荐你使用 Python3,因为 Python2 终将停止维护。可能目前市面上大多数教程使用的都还是 Python2,这也不用着急,因为在 Anaconda 中可以同时管理两个 Python 版本的环境。
根据提示进行安装,完成后你大概会惊讶地发现电脑中多了好多应用,不用担心,我们一项项来看:
- Anaconda Navigator :用于管理工具包和环境的图形用户界面,后续涉及的众多管理命令也可以在 Navigator 中手工实现。
-
Jupyter notebook :基于web的交互式计算环境,可以编辑易于人们阅读的文档,用于展示数据分析的过程。
-
qtconsole :一个可执行 IPython 的仿终端图形界面程序,相比 Python Shell 界面,qtconsole 可以直接显示代码生成的图形,实现多行代码输入执行,以及内置许多有用的功能和函数。
-
spyder :一个使用Python语言、跨平台的、科学运算集成开发环境。
安装完成后,我们还需要对所有工具包进行升级,以避免可能发生的错误。打开你电脑的终端,在命令行中输入:
conda upgrade --all
在终端询问是否安装如下升级版本时,输入 y。
有的情况下,你可能会遇到找不到 conda 命令的错误提示,这很可能是环境路径设置的问题,需要添加conda环境变量:export PATH=xxx/anaconda/bin:$PATH, 其中xxx替换成anaconda的安装路径。
至此,安装完成,下面让我们看一下如何用 Anaconda 管理工具包和环境。
- 3 Anaconda常用命令
安装一个 package:
conda install package_name
这里 package_name 是需要安装包的名称。你也可以同时安装多个包,比如同时安装numpy 、scipy 和 pandas,则执行如下命令:
conda install numpy scipy pandas
你也可以指定安装的版本,比如安装 1.1 版本的 numpy :
conda install numpy=1.10
移除一个 package:
conda remove package_name
升级 package 版本:
conda update package_name
查看所有的 packages:
conda list
如果你记不清 package 的具体名称,也可以进行模糊查询:
conda search search_term
数据分析基础库
上面已经讲述了Python数据分析的环境管理,接下来讲解数据分析常用的基础库:
- 1.Numpy
numpy是什么?
NumPy 是一个 Python 包。 它代表 “Numeric Python”。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。
numpy能做什么?
使用NumPy,开发人员可以执行以下操作:
a.数组的算数和逻辑运算;
b.傅立叶变换和用于图形操作的例程;
c.与线性代数有关的操作, NumPy 拥有线性代数和随机数生成的内置函数;
d.与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用, 用于替代 MatLab;
NumPy最重要的一个特点就是其N维数组对象(即ndarray),该对象是一个快速而灵活的大数据集容器。你可以利用这种数组对整块数据执行一些数学计算。
ndarray是一个通用的同构数据多维容器,也就是说,其中的所有元素必须是相同类型的。每个数组都有一个shape(一个表示各维度大小的元组)和一个dtype(一个用于说明数组数据类型的对象)。以下是ndarray常用的一些函数,很多数据分析不需要用到这些函数,但此处进行总结,以便查找。
首先,我们看一下ndarray数组中元素的数据类型。
- 数据类型
dtype(数据类型)是一个特殊的对象,它含有ndarray将一块内存解释为特定数据类型所需的信息,它包含基本数据类型和对象型,这也是Numpy强大和灵活的原因之一。
| 类型 | 类型代码 | 说明 |
|---|---|---|
| int8、uint8 | i1、u1 | 有符号和无符号的8位(1个字节)整形 |
| int16、uint16 | i2、u2 | 有符号和无符号的16位(2个字节)整形 |
| int32、uint32 | i4、u4 | 有符号和无符号的32位(4个字节)整形 |
| int64、uint64 | i8、u8 | 有符号和无符号的64位(8个字节)整形 |
| float16 | f2 | 半精度浮点数 |
| float32 | f4或f | 标准的单精度浮点数。与C的float兼容 |
| float64 | f8或d | 标准的双精度浮点数。与C的double和Python的float对象兼容 |
| float128 | f16或g | 扩展精度浮点数 |
| complex64、complex128 | c8、c16 | 分别用两个32位、64位或128位浮点数表示的复数 |
| bool | ? | 存储True和False值的布尔类型 |
| object | O | python的对象类型 |
| string_ | S | 固定长度的字符串类型(每个字符1个字节),S10表示长度为10的字符串 |
| unicode_ | U | 固定长度的unicode类型(字节数由平台决定)。跟字符串的定义方式一样(如U10) |
ndarray常用的函数可以分为几种:
-
创建函数
ndarray创建数据的函数有很多,最常用的是以下几种,可以按照要求直接生成对应的数组:
| 函数 | 说明 | 用法 |
|---|---|---|
| array | 将输入数据(列表、元组、数组等)转换为ndarray。要么推断出dtype,要么显示制定的dtype。 | arr=np.array([1,2,3],dtype=np.float64) |
| asarray | 将输入转换成ndarray,如果输入本身就是一个ndarray就不进行复制 | arr=np.asarray([[1,1],[1,1]]) |
| arange | 类似于内置range,但返回的是一个ndarray而不是列表 | np.arange(3) 相当于 array([1,2,3]) |
| ones | 根据指定的形状和dtype创建一个全1数组,并根据其形状和dtype创建一个全1数组 | arr=np.ones((3,), dtype=int) 输出 array([1,1,1]) |
| ones_like | 以另一个数组为参数,并根据其形状和dtype创建一个全1数组 | 定义x=array([[0, 1],[3, 4]]),y=np.ones_like(x),则y=array([[1,1],[1,1]]) |
| zeros、zeros_like | 同上 | 同上 |
| empty、empty_like | 创建新数组,只分配内存空间但不填充任何值 | 同上 |
| eye | 创建一个正方形N*N单位矩阵(对角线为1,其余0),可以偏移 | x = np.eye(5, k=2, dtype=int)(第一个数字为N,代表正方形的维数。k为偏移量,dtype为类型) |
| identity | 创建一个正方形N*N单位矩阵(对角线为1,其余0),不可偏移 | x = identity(5, dtype=int)(第一个数字为N,代表正方形的维数。dtype为类型) |
- 一元二元函数
ndarray有很多函数,下面列举一些常用的一元(unary)函数和二元(binary)函数,一元函数主要有:
| 函数 | 说明 |
|---|---|
| abs、fabs | 计算整数、浮点数或复数的绝对值。对于非复数值,可以使用更快的fabs |
| sqrt | 计算各元素的平方根。相当于arr**0.5 |
| square | 计算各元素的平方,相当于arr**2 |
| exp | 计算各元素的指数 |
| log、log10、log2、log1p | 分别为自然对数(底数为e)、底数为10的log、底数为2的log、log(1+x) |
| sign | 计算各元素的正负号:1(正数)、0(零)、-1(复数) |
| ceil | 计算各元素的ceiling值,即大于等于该值的最小整数 |
| floor | 计算各元素的floor值,即小于等于该值的最大整数 |
| rint | 把各元素四舍五入到最接近的整数,保留dtype |
| modf | 将数组的小数和整数部分以两个独立的数组形式返回 |
| isnan | 返回一个表示“哪些值是NaN(这不是一个数字)”的布尔型数组 |
| isfinite、isinf | 分别返回一个表示“哪些元素是有穷的(非inf、非NaN)”或“哪些元素是无穷”的布尔型数组 |
| cos、cosh、sin、sinh、tan、tanh | 普通型和双曲型三角函数 |
| arccos、arccosh、arcsin、arcsinh、arctan、arctanh | 反三角函数 |
| logucal_not | 计算各元素not x的真值。相当于-arr |
二元函数主要有:
| 函数 | 说明 | |
|---|---|---|
| add | 将数组中对应的元素相加 | |
| substract | 将第一个数组中减去第二个数组中的元素 | |
| multiply | 数组元素相乘 | |
| divide、floor_divide | 除法或向下圆整除法(丢弃余数) | |
| power | 对于第一个数组中的元素A,根据第二个数组中的相应元素B,计算A的B次方 | |
| maximum、fmax | 元素级的最大值计算、fmax将忽略NaN | |
| minimum、fmin | 元素级的最小值计算、fmin将忽略NaN | |
| mod | 元素级的求模计算(除法的余数) | |
| copysign | 将第二个数组中的值的符号复制给第一个数组中的值 | |
| greate、greate_equal、less、less_equal | 执行元素级的比较运算,最终产生布尔型数组。相当于>、>=、<、<=、==、!= | |
| logical_and、logical_or、logical_xor | 执行元素级的真值逻辑运算。相当于&、 | 、^ |
- 统计函数
| 函数 | 说明 |
|---|---|
| sum | 对数组中全部或某轴向的元素求和。零长度的数组的sum为0 |
| mean | 算数平均数。零长度的数组的mean为NaN |
| std、var | 分别为标准差和方差,自由度可调(默认为n) |
| min、max | 最大值和最小值 |
| argmin、argmax | 分别为最大和最小元素的索引 |
| cumsum | 所有元素的累计和 |
| cumprod | 所有元素的累计积 |
- 运算函数
| 函数 | 说明 |
|---|---|
| unique(x) | 计算x中的唯一元素,并返回有序的结果 |
| intersect1d(x,y) | 计算x和y中的公共元素,并返回有序结果 |
| union1d(x,y) | 计算x和y的并集,并返回有序结果 |
| in1d(x,y) | 得到一个表示“x的元素是否包含于y”的布尔型数组 |
| setdiff1d(x,y) | 集合的差,即元素在x中且不在y中 |
| setxor1d(x,y) | 集合的对称差,即存在于一个数组中但不同时存在于两个数组中的元素 |
- 线性函数(numpy.linalg)
| 函数 | 说明 |
|---|---|
| diag | 以一维数组的形式返回方阵的对角线(或非对角线)元素,或将一维数组转换成为方阵(非对角线元素为0) |
| dot | 矩阵乘法 |
| trace | 计算对角线元素的和 |
| det | 计算矩阵行列式 |
| eig | 计算方阵的本征值和本征向量) |
| inv | 计算方阵的逆) |
| pinv | 计算矩阵的Moore-Penrose伪逆 |
| qr | 计算QR分解 |
| svd | 计算奇异值分解(SVD) |
| solve | 解线性方程组Ax=b,其中A为一个方阵 |
| lstsq | 计算Ax=b的最小二乘解 |
- 随机函数(numpy.random)
| 函数 | 说明 |
|---|---|
| seed | 确定随机数生成器的种子 |
| permutation | 返回一个序列的随机排列和返回一个随机排列的范围 |
| shuffle | 对一个序列就地随机排序 |
| rand | 产生均匀分布的样本值 |
| randint | 从给定的上下限范围内随机选取整数 |
| randn | 产生正态分布(平均值为0,标准差为1)的样本值,类似于MATLAB接口 |
| binomial | 产生二项分布的样本值 |
| normal | 产生正态(高斯)分布的样本值 |
| beta | 产生Beta分布的样本值 |
| chisquare | 产生卡方分布的样本值 |
| gamma | 产生Gamma分布的样本值 |
| uniform | 产生在[0,1)中均匀分布的样本值 |
- 2.pandas
以下内容摘自十分钟搞定pandas,
本文是对pandas官方网站上《10 Minutes to pandas》的一个简单的翻译,原文在这里。这篇文章是对pandas的一个简单的介绍,详细的介绍请参考:Cookbook 。习惯上,我们会按下面格式引入所需要的包:
image 一、 创建对象
可以通过 Data Structure Intro Setion 来查看有关该节内容的详细信息。
1、可以通过传递一个list对象来创建一个Series,pandas会默认创建整型索引:
image
2、通过传递一个numpy array,时间索引以及列标签来创建一个DataFrame:
image
3、通过传递一个能够被转换成类似序列结构的字典对象来创建一个DataFrame:
image
4、查看不同列的数据类型:
image
5、如果你使用的是IPython,使用Tab自动补全功能会自动识别所有的属性以及自定义的列,下图中是所有能够被自动识别的属性的一个子集:
image 二、 查看数据
详情请参阅:Basics Section
1、 查看frame中头部和尾部的行:
image
2、 显示索引、列和底层的numpy数据:
image
3、 describe()函数对于数据的快速统计汇总:
image
4、 对数据的转置:
image
5、 按轴进行排序
image
6、 按值进行排序
image 三、 选择
虽然标准的Python/Numpy的选择和设置表达式都能够直接派上用场,但是作为工程使用的代码,我们推荐使用经过优化的pandas数据访问方式: .at, .iat, .loc, .iloc 和 .ix详情请参阅Indexing and Selecing Data 和 MultiIndex / Advanced Indexing。
1、 选择一个单独的列,这将会返回一个Series,等同于df.A:
image
2、 通过[]进行选择,这将会对行进行切片
image
1、 使用标签来获取一个交叉的区域
image
2、 通过标签来在多个轴上进行选择
image
3、 标签切片
image
4、 对于返回的对象进行维度缩减
image
5、 获取一个标量
image
6、 快速访问一个标量(与上一个方法等价)
image
1、 通过传递数值进行位置选择(选择的是行)
image
2、 通过数值进行切片,与numpy/python中的情况类似
image
3、 通过指定一个位置的列表,与numpy/python中的情况类似
image
4、 对行进行切片
image
5、 对列进行切片
image
6、 获取特定的值
image
1、 使用一个单独列的值来选择数据:
image
2、 使用where操作来选择数据:
image
3、 使用isin()方法来过滤:
image
l 设置
1、 设置一个新的列:
image
2、 通过标签设置新的值:
image
3、 通过位置设置新的值:
image
4、 通过一个numpy数组设置一组新值:
image
上述操作结果如下:
image
5、 通过where操作来设置新的值:
image
四、 缺失值处理
在pandas中,使用np.nan来代替缺失值,这些值将默认不会包含在计算中,详情请参阅:Missing Data Section。
1、 reindex()方法可以对指定轴上的索引进行改变/增加/删除操作,这将返回原始数据的一个拷贝:
image
2、 去掉包含缺失值的行:
image
3、 对缺失值进行填充:
image
4、 对数据进行布尔填充:
image
五、 相关操作
详情请参与 Basic Section On Binary Ops
l 统计(相关操作通常情况下不包括缺失值)
1、 执行描述性统计:
image
2、 在其他轴上进行相同的操作:
image
3、 对于拥有不同维度,需要对齐的对象进行操作。Pandas会自动的沿着指定的维度进行广播:
image
l Apply
1、 对数据应用函数:
image
l 直方图
具体请参照:Histogramming and Discretization
image
l 字符串方法
Series对象在其str属性中配备了一组字符串处理方法,可以很容易的应用到数组中的每个元素,如下段代码所示。更多详情请参考:Vectorized String Methods.
image
六、 合并
Pandas提供了大量的方法能够轻松的对Series,DataFrame和Panel对象进行各种符合各种逻辑关系的合并操作。具体请参阅:Merging section
l Concat
image
l Join 类似于SQL类型的合并,具体请参阅:Database style joining
image
l Append 将一行连接到一个DataFrame上,具体请参阅Appending:
image
七、 分组
对于”group by”操作,我们通常是指以下一个或多个操作步骤:
l (Splitting)按照一些规则将数据分为不同的组;
l (Applying)对于每组数据分别执行一个函数;
l (Combining)将结果组合到一个数据结构中;
详情请参阅:Grouping section
image
1、 分组并对每个分组执行sum函数:
image
2、 通过多个列进行分组形成一个层次索引,然后执行函数:
image
八、 Reshaping
详情请参阅 Hierarchical Indexing 和 Reshaping。
l Stack
image
image
image
l 数据透视表,详情请参阅:Pivot Tables.
image
可以从这个数据中轻松的生成数据透视表:
image
九、 时间序列
Pandas在对频率转换进行重新采样时拥有简单、强大且高效的功能(如将按秒采样的数据转换为按5分钟为单位进行采样的数据)。这种操作在金融领域非常常见。具体参考:Time Series section。
image
1、 时区表示:
image
2、 时区转换:
image
3、 时间跨度转换:
image
4、 时期和时间戳之间的转换使得可以使用一些方便的算术函数。
image
十、 Categorical
从0.15版本开始,pandas可以在DataFrame中支持Categorical类型的数据,详细 介绍参看:categorical introduction和API documentation。
image
1、 将原始的grade转换为Categorical数据类型:
image
2、 将Categorical类型数据重命名为更有意义的名称:
image
3、 对类别进行重新排序,增加缺失的类别:
image
4、 排序是按照Categorical的顺序进行的而不是按照字典顺序进行:
image
5、 对Categorical列进行排序时存在空的类别:
image
十一、 画图
image
对于DataFrame来说,plot是一种将所有列及其标签进行绘制的简便方法:
image
image
十二、 导入和保存数据
1、 写入csv文件:
image
2、 从csv文件中读取:
image
l HDF5,参考:HDFStores
1、 写入HDF5存储:
image
2、 从HDF5存储中读取:
image
1、 写入excel文件:
image
2、 从excel文件中读取:
image
小结:ndarray是Numpy最重要的一个类,这篇文章中总结了其部分常用函数,以便查找。!
image
一、 创建对象
image
image
image
image
image
二、 查看数据
image
image
image
image
image
image
三、 选择
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image