前言
使用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,
image本文是对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
十二、 导入和保存数据
1、 写入csv文件:
image
2、 从csv文件中读取:
image
l HDF5,参考:HDFStores
1、 写入HDF5存储:
image
2、 从HDF5存储中读取:
image
1、 写入excel文件:
image
2、 从excel文件中读取:
image
小结:ndarray是Numpy最重要的一个类,这篇文章中总结了其部分常用函数,以便查找。!
网友评论