Python 数据分析(一) 本实验将学习 pandas 基础,数据加载、存储与文件格式,数据规整化,绘图和可视化的知识

第1节
pandas 回顾
第2节
读写文本格式的数据
第3节
使用 HTML 和 Web API
第4节
使用数据库
第5节
合并数据集
第6节
重塑和轴向旋转
第7节
数据转换
第8节
字符串操作
第9节
绘图和可视化

pandas 回顾


一、实验简介

  学习数据分析的课程,需要同学们掌握好 Python 的语言基础,和对 Numpy 与 Matplotlib 等基本库有一些了解。同学们可以参考学习实验楼的 Python 语言基础教程与 Python 科学计算的课程。

  pandas 是后面我们学习数据分析的首选库,它含有高级数据结构和操作工具,可以使我们的数据分析工作变得更快更简单。

  pandas 兼具 NumPy 的数组计算功能、电子表格和关系数据库灵活的数据处理功能,同时它还提供了更复杂精细的索引功能。对于金融行业的用户,pandas 提供了大量适用于金融数据的高性能时间序列功能和工具。

  在这里我们先对 pandas 和 NumPy 引入做一个约定,这也是 mumu 的一个编辑习惯。

In [1]: import pandas as pd
In [2]: import numpy as np

  因此,只要同学们在代码中看到 pd,就要知道这是 pandas,看见 np 就是指 numpy。mumu 用的是 Ipython,前面的In []Out []是系统自带的,代表着输入输出,我们不需要进行输入。具体内容可以参考 Python 的基础教程以及 Python 的科学计算

二、pandas 数据结构介绍

  要使用 pandas,我们首先就得熟悉它的两个主要数据结构:Series 和 DataFrame。

我们导入 pandas 库里的这两个数据结构:

In [2]: from pandas import Series,DataFrame
1、Series

  Series 是一种类似于一维数组的对象,它是由一组数据以及与之相关的数据标签(即索引)组成。

创建 Series 对象

  在上面我们可以看到我们可以仅由一组数据便可以创建简单的 Series 对象。Series 的字符串表现形式为:索引在左边,值在右边。我们在创建 Series 对象的时候并没有为数据附上指定的索引,系统会自动创建一个0n-1(n 为数据长度)的整数型索引。而每一个 Series 的对象,都有一个 values 和 index 属性,表示数组的值和索引:

Series 对象的 values 和 index 属性

  通常我们希望在创建 Series 对象的时候给他指定我们需要的索引值:

创建 Series 对象时指定索引值

   这样我们不仅可以按系统指定的索引值进行访问 Series 对象内部具体的数值,同时也可以通过我们自己定义的索引值进行访问:

通过索引值访问 Series 对象的值

此处输入图片的描述

注:而上面的u是指 Unicode

  当然除此之外,如果数据被存放在一个 Python 字典中,我们也可以直接通过这个字典来创建 Series:

通过字典来创建 Series 对象

  如果只传入一个字典,则结果 Series 中的索引就是原字典的键(有序排列):

此处输入图片的描述

  在本例中,sdata 中和 states 索引相匹配的那三个值会被找出并放在相应的位置上,而因为delorenprettytable所对应的 sdata 值找不到,所以其结果为 NaN,代表着 not a number,即“非数字”。在 pandas 中,它用来表示缺失数据。

  pandas 的 isnull 和 notnull 函数可用于检测缺失数据,同时在 Series 也有类似的实例方法:

pandas 的 isnull()方法

pandas 的 notnull()方法

Series 实例 isnull()方法

Series 实例 notnull()方法

  Series 能在算术运算中自动对齐不同的索引,例如:

Series 算术运算索引对齐

Series 的对象除了拥有valuesindex属性外,还有一个name属性,我们可以把它简单的理解表头,同时index也有一个 name属性,我们可以把它简单理解为索引的名称。

Series 实例和索引的 name 属性

当然,Series 的索引可以通过赋值的方式进行修改:

Series 的 index 修改

2、DataFrame

  DataFrame 是一个表格型的数据结构,它既有行索引又有列索引。构建 DataFrame 的办法有很多,最常有的一种是直接传入一个由等长列表或 NumPy 数组组成的字典:

构建 DataFrame 对象

  DataFrame 实例在创建过程中,前面会自动加上行索引,最上面是列索引,我们可以通过columnsindex这两个属性对实例进行操作。比如我们已经指定了列序列,我们可以按照我们需要的顺序对列序列进行排列:

重排列索引

  同样,我们在自己定义列的时候,如果传入的列在数据中找不到,就会产生缺失数据:

创建 DataFrame 时产生缺失数据

  我们可以调用列或行索引来查看 DataFrame 实例的值,不过行索引要加上字段ix

DataFrame 列索引

DataFrame 行索引

  列可以通过赋值的方式进行修改:

给 DataFrame 列赋值

通过 Series 给 DataFrame 列赋值

  我们如果通过 Series 为 DataFrame 列赋值,就会精确匹配到 DataFrame 得索引,空缺位置填上缺失值。

  我们也可以用关键字del来删除列:

此处输入图片的描述

  用嵌套字典(字典的字典)来创建 DataFrame 对象也是一种常见的方式:

通过嵌套字典来创建 DataFrame

总结和扩展一下吧,下面构造 DataFrame 的方法,上面没有提到的同学们可以自己尝试一下:

类型说明
二维 ndarray 数据矩阵,还可以传入行标和列标
由数组、列表或元组组成的字典 每个序列会变成 DataFrame 的一列。所有序列的长度必须相同
NumPy 的结构化/记录数组 类似于 “由数组组成的字典”
由 Series 组成的字典 每个 Series 会成为一列。如果没有显式指定索引,则各 Series 的索引会被合并成结果的行索引
由字典组成的字典 各内层字典会成一列。键会被合并成结果的行索引
字典或 Series 的列表 各项将会成为 DataFrame 的一行。字典键或 Series 索引的并集将会成为 DataFrame 的列标
由列表或元组组成的列表 类似二维 ndarray
另一个 DataFrame 该 DataFrame 的索引将会被沿用,除非显示指定其他索引
NumPy 的 MaskedArray 类似于二维 ndarray 的情况,只是掩码值在结果 DataFrame 会变成 NA/缺失值

  同样的 DataFrame 的 index 和 columns 都有 name 属性:

index 和 columns 的 name 属性

DataFrame 的 values 属性会以二维 ndarray 的形式返回:

DataFrame 的 values 属性

在 DataFrame 中选取和重排的方式有许多,在这里为大家列一下:

类型说明
obj[val] 选取 DataFrame 的单个列或一组列。在一些特殊情况下会比较便利:布尔型数组(过滤行)、切片(行切片)、布尔型 DataFrame(根据条件设置值)
obj.ix[val] 选取 DataFrame 的单个行或一组行
obj.ix[:,val] 选取单个列或列子集
obj.ix[val1,val2] 同时选取行和列
reindex方法 将一个或多个轴匹配到新索引
xs 方法 根据标签选取单行或单列,并返回一个 Series
icol、irow 方法 根据整数位置选取单列或单行,并返回一个 Series
get_value、set_value 方法 根据行标签和列标签选取单个值

三、汇总和计算描述

  pandas 对象拥有一组常用的数学和统计方法。他们大部分属于约简和汇总统计,用于从 Series 中提取单个值或从 DataFrame 的行或列中提取一个 Series。

  我们先来看看有哪些描述统计相关的方法:

方法说明
count 非 NA 值的数量
describe 针对 Series 或各 DataFrame 列计算汇总统计
min、max 计算最小值和最大值
argmin、argmax 计算能够获取到最小值和最大值的索引位置(整数)
idxmin、idxmax 计算能够获取到最小值和最大值的索引值
quantile 计算样本的分位数(0到1)
sum 值的总和
mean 值的平均数
median 值的算术中位数(50%分位数)
mad 根据平均值计算平均绝对离差
var 样本值的方差
std 样本值的标准差
skew 样本值的偏度(三阶矩)
kurt 样本值的峰度(四阶矩)
cumsum 样本值的累计和
cummin、cummax 样本值的累计最大值和累计最小值
cumprod 样本值的累计积
diff 计算一阶差分(对时间序列很有用)
pct_change 计算百分数变化

接下来给同学们列一下简约方法的常用选项:

选项说明
axis 简约的轴。DataFrame 的行用0,列用1
skipna 排除缺失值,默认值为 True
level 如果轴是层次化索引的(即 MultiIndex),则根据 level 分组约简

接下来我通过运用上面的一些方法来分析一下 Yahoo!Finance 上一些公司的股票价格和成交量(实验楼的环境是没有网的,下面的实例同学们如果有条件可以在自己的电脑上实验):

相关系数与协方差

(后面还有很多,就截了这么一点数据数据是2010年1月1号到2014年12月31号的股票交易信息,同学们可以自己输代码查看,可能会缓冲比较久的时间,不用着急)

股票成交量

  有了这些数据我们就可以进行处理和分析了。    股票价格的百分数变化

  Series 的 correct 方法用于计算两个 Series 中重叠的、非 NA 值的、按索引对齐的值的相关系数。与此类似,cov 用于计算协方差:

相关性和协方差

  利用DataFrame 的 corrwith 方法,可以计算其列或行跟另一个 Series 或 DataFrame 之间的相关系数。传入一个 Series 将会返回一个相关系数值 Series;传入一个 DataFrame 则会计算按列名配对的相关系数:

corrwith 方法

  好了,还有许多统计与汇总的东西没有讲到,在我们后面的代码中木木会讲我们没有讲到的方法或者形式给大家介绍。还有数据分析是需要有线性代数、概率统计等多方面的数学知识,mumu 不会再花时间讲解这些数学知识,所以有不懂的同学一定要下来抓紧时间复习哦。

四、处理缺失数据

  在数据分析中,我们大部分时间得到的数据都可能有缺失的情况,那么对于缺失的数据我们应该怎么样处理呢?pandas 使用浮点值 NaN(Not a Number) 表示浮点和非浮点数组中的缺失数据。它只是一个便于被检测出来的标记而已:

缺失数据

  下面给出一些 NA 处理方法:

方法说明
dropna 根据各标签的值中是否存在缺失数据,对轴标签进行过滤,可通过阈值调节对缺失值的容忍度
fillna 用指定值或插值方法(如 ffill(用前面的值填充后面) 或 bfill(用后面的值填充前面)填充缺失数据
isnull 返回一个含有布尔值的对象,这些布尔值表示哪些值是缺失值/NA,该对象的类型与源类型一样
notnull isnull 的否定式

  接下来,我们还是看看代码吧。

dropna

  mumu在写示例的过程中用过reset,清除过所有的对象和库,所以要重新导入,同学们知道就行了。

  而对于 DataFrame 对象,事情就有点复杂了。我们可能希望丢弃全 NA或含有NA的行或列。dropna默认丢弃任何含有缺失值的行:

DataFrame 上的 dropna

传入 how='all'将只丢弃全为 NA 的那些行:

how = 'all'

  在上面我们想要丢弃列,只需传入 axis=1即可(行为0),有时候我们只需留下一部分数据观察数据,可以用 thresh 参数:

thresh

  有时候我们不想直接就滤除数据,而是想通过其他方式来填补这些缺失值。下面我主要在代码中说明:

fillna    reindex

fillna 函数的参数说明:

参数说明
value 用于填充缺失值的标量值或字典对象
method 插值方式。如果函数调用时未指定其他参数的话,默认为 'ffill'
axis 待填充的轴,默认为0
inpalce 修改调用者对象而不产生副本
limit (对于行)向前和向后填充可以填充的最大数量

五、层次化索引

  层次化索引是 pandas 的一项重要功能,它是我们能在一个轴上拥有多个(两个以上)索引级别。简单点来说,它是我们能用低维度来处理高维度数据。

例子一看就懂:

层次索引

层次化索引转为 DataFrame

此处输入图片的描述

六、作业

  同学们学了这么多 pandas 的基本功能介绍,希望同学们能够在下来好好复习一遍。此外学习数据分析需要一定的数学基础,也希望同学们能对线性代数和统计学好好复习一下,以备后面的需要。

原文地址:https://www.cnblogs.com/timssd/p/5429177.html