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 对象的时候并没有为数据附上指定的索引,系统会自动创建一个0
到n-1
(n 为数据长度)的整数型索引。而每一个 Series 的对象,都有一个 values 和 index 属性,表示数组的值和索引:
通常我们希望在创建 Series 对象的时候给他指定我们需要的索引值:
这样我们不仅可以按系统指定的索引值进行访问 Series 对象内部具体的数值,同时也可以通过我们自己定义的索引值进行访问:
注:而上面的u
是指 Unicode
当然除此之外,如果数据被存放在一个 Python 字典中,我们也可以直接通过这个字典来创建 Series:
如果只传入一个字典,则结果 Series 中的索引就是原字典的键(有序排列):
在本例中,sdata 中和 states 索引相匹配的那三个值会被找出并放在相应的位置上,而因为deloren
和prettytable
所对应的 sdata 值找不到,所以其结果为 NaN,代表着 not a number,即“非数字”。在 pandas 中,它用来表示缺失数据。
pandas 的 isnull 和 notnull 函数可用于检测缺失数据,同时在 Series 也有类似的实例方法:
Series 能在算术运算中自动对齐不同的索引,例如:
Series 的对象除了拥有values
和index
属性外,还有一个name
属性,我们可以把它简单的理解表头,同时index
也有一个 name
属性,我们可以把它简单理解为索引的名称。
当然,Series 的索引可以通过赋值的方式进行修改:
2、DataFrame
DataFrame 是一个表格型的数据结构,它既有行索引又有列索引。构建 DataFrame 的办法有很多,最常有的一种是直接传入一个由等长列表或 NumPy 数组组成的字典:
DataFrame 实例在创建过程中,前面会自动加上行索引,最上面是列索引,我们可以通过columns
和index
这两个属性对实例进行操作。比如我们已经指定了列序列,我们可以按照我们需要的顺序对列序列进行排列:
同样,我们在自己定义列的时候,如果传入的列在数据中找不到,就会产生缺失数据:
我们可以调用列或行索引来查看 DataFrame 实例的值,不过行索引要加上字段ix
:
列可以通过赋值的方式进行修改:
我们如果通过 Series 为 DataFrame 列赋值,就会精确匹配到 DataFrame 得索引,空缺位置填上缺失值。
我们也可以用关键字del
来删除列:
用嵌套字典(字典的字典)来创建 DataFrame 对象也是一种常见的方式:
总结和扩展一下吧,下面构造 DataFrame 的方法,上面没有提到的同学们可以自己尝试一下:
类型 | 说明 |
---|---|
二维 ndarray | 数据矩阵,还可以传入行标和列标 |
由数组、列表或元组组成的字典 | 每个序列会变成 DataFrame 的一列。所有序列的长度必须相同 |
NumPy 的结构化/记录数组 | 类似于 “由数组组成的字典” |
由 Series 组成的字典 | 每个 Series 会成为一列。如果没有显式指定索引,则各 Series 的索引会被合并成结果的行索引 |
由字典组成的字典 | 各内层字典会成一列。键会被合并成结果的行索引 |
字典或 Series 的列表 | 各项将会成为 DataFrame 的一行。字典键或 Series 索引的并集将会成为 DataFrame 的列标 |
由列表或元组组成的列表 | 类似二维 ndarray |
另一个 DataFrame | 该 DataFrame 的索引将会被沿用,除非显示指定其他索引 |
NumPy 的 MaskedArray | 类似于二维 ndarray 的情况,只是掩码值在结果 DataFrame 会变成 NA/缺失值 |
同样的 DataFrame 的 index 和 columns 都有 name 属性:
DataFrame 的 values 属性会以二维 ndarray 的形式返回:
在 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 则会计算按列名配对的相关系数:
好了,还有许多统计与汇总的东西没有讲到,在我们后面的代码中木木会讲我们没有讲到的方法或者形式给大家介绍。还有数据分析是需要有线性代数、概率统计等多方面的数学知识,mumu 不会再花时间讲解这些数学知识,所以有不懂的同学一定要下来抓紧时间复习哦。
四、处理缺失数据
在数据分析中,我们大部分时间得到的数据都可能有缺失的情况,那么对于缺失的数据我们应该怎么样处理呢?pandas 使用浮点值 NaN(Not a Number) 表示浮点和非浮点数组中的缺失数据。它只是一个便于被检测出来的标记而已:
下面给出一些 NA 处理方法:
方法 | 说明 |
---|---|
dropna | 根据各标签的值中是否存在缺失数据,对轴标签进行过滤,可通过阈值调节对缺失值的容忍度 |
fillna | 用指定值或插值方法(如 ffill(用前面的值填充后面) 或 bfill(用后面的值填充前面)填充缺失数据 |
isnull | 返回一个含有布尔值的对象,这些布尔值表示哪些值是缺失值/NA,该对象的类型与源类型一样 |
notnull | isnull 的否定式 |
接下来,我们还是看看代码吧。
mumu在写示例的过程中用过reset
,清除过所有的对象和库,所以要重新导入,同学们知道就行了。
而对于 DataFrame 对象,事情就有点复杂了。我们可能希望丢弃全 NA
或含有NA
的行或列。dropna
默认丢弃任何含有缺失值的行:
传入 how='all'
将只丢弃全为 NA 的那些行:
在上面我们想要丢弃列,只需传入 axis=1即可(行为0),有时候我们只需留下一部分数据观察数据,可以用 thresh 参数:
有时候我们不想直接就滤除数据,而是想通过其他方式来填补这些缺失值。下面我主要在代码中说明:
fillna 函数的参数说明:
参数 | 说明 |
---|---|
value | 用于填充缺失值的标量值或字典对象 |
method | 插值方式。如果函数调用时未指定其他参数的话,默认为 'ffill' |
axis | 待填充的轴,默认为0 |
inpalce | 修改调用者对象而不产生副本 |
limit | (对于行)向前和向后填充可以填充的最大数量 |
五、层次化索引
层次化索引是 pandas 的一项重要功能,它是我们能在一个轴上拥有多个(两个以上)索引级别。简单点来说,它是我们能用低维度来处理高维度数据。
例子一看就懂:
六、作业
同学们学了这么多 pandas 的基本功能介绍,希望同学们能够在下来好好复习一遍。此外学习数据分析需要一定的数学基础,也希望同学们能对线性代数和统计学好好复习一下,以备后面的需要。
Python 数据分析(一) 本实验将学习 pandas 基础,数据加载、存储与文件格式,数据规整化,绘图和可视化的知识的更多相关文章
- 利用python进行数据分析之数据加载存储与文件格式
在开始学习之前,我们需要安装pandas模块.由于我安装的python的版本是2.7,故我们在https://pypi.python.org/pypi/pandas/0.16.2/#downloads ...
- 【EF学习笔记08】----------加载关联表的数据 显式加载
显式加载 讲解之前,先来看一下我们的数据库结构:班级表 学生表 加载从表集合类型 //显示加载 Console.WriteLine("=========查询集合===========&quo ...
- 【EF学习笔记07】----------加载关联表的数据 贪婪加载
讲解之前,先来看一下我们的数据库结构:班级表 学生表 贪婪加载 //贪婪加载 using (var db = new Entities()) { var classes = db.Classes.Wh ...
- 【EF学习笔记06】----------加载关联表的数据 延迟加载
讲解之前,先来看一下我们的数据库结构:班级表 学生表 延迟加载 //延迟加载 using (var db = new Entities()) { //查询班级 var classes = (from ...
- Python数据分析与挖掘所需的Pandas常用知识
Python数据分析与挖掘所需的Pandas常用知识 前言Pandas基于两种数据类型:series与dataframe.一个series是一个一维的数据类型,其中每一个元素都有一个标签.series ...
- 《利用python进行数据分析》读书笔记--第六章 数据加载、存储与文件格式
http://www.cnblogs.com/batteryhp/p/5021858.html 输入输出一般分为下面几类:读取文本文件和其他更高效的磁盘存储格式,加载数据库中的数据.利用Web API ...
- python数据分析笔记——数据加载与整理]
[ python数据分析笔记——数据加载与整理] https://mp.weixin.qq.com/s?__biz=MjM5MDM3Nzg0NA==&mid=2651588899&id ...
- Python之pandas数据加载、存储
Python之pandas数据加载.存储 0. 输入与输出大致可分为三类: 0.1 读取文本文件和其他更好效的磁盘存储格式 2.2 使用数据库中的数据 0.3 利用Web API操作网络资源 1. 读 ...
- arcgis python 使用光标和内存中的要素类将数据加载到要素集 学习:http://zhihu.esrichina.com.cn/article/634
学习:http://zhihu.esrichina.com.cn/article/634使用光标和内存中的要素类将数据加载到要素集 import arcpy arcpy.env.overwriteOu ...
随机推荐
- 在mac本上折腾android 开发环境
众所周知的原因,google的很多网站在国内无法访问,苦逼了一堆天朝程序员,下是在mac本上折腾android 开发环境的过程: 一.先下载android sdk for mac 给二个靠谱的网址: ...
- support STL Viewer with WordPress On SAE
由于SAE不支持本地代码目录写入, 我把WordPress的uploads路径改到了Storage中, 使用Domain来存放非代码资源. 这导致STL Viewer插件无法正常使用. 解决方法: 把 ...
- YIi配置debug工具、yii配置gii工具
$config['bootstrap'][] = 'debug';$config['modules']['debug'] = [ 'class'=>'yii\debug\Module', 'al ...
- [LeetCode]题解(python):066-Plus One
题目来源: https://leetcode.com/problems/plus-one/ 题意分析: 给定一个数组,将数加一,返回新的数组.比如[9,9],返回[1,0,0]. 题目思路: 这道题目 ...
- KMP算法与一个经典概率问题
考虑一个事件,它有两种概率均等的结果.比如掷硬币,出现正面和反面的机会是相等的.现在我们希望知道,如果我不断抛掷硬币,需要多长时间才能得到一个特定的序列. 序列一:反面.正面.反面序列二:反面.正面. ...
- linux中grep的用法
http://www.9usb.net/200902/linux-grep.html http://blog.51yip.com/linux/1008.html http://blog.csdn.ne ...
- Niagara技术文档汇总
Niagara技术文档汇总http://wenku.baidu.com/view/ccdd4e2c3169a4517723a38f.html Niagara讲解要点http://wenku.baidu ...
- Strategic Game(匈牙利算法,最小点覆盖数)
Strategic Game Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- ADS2008 安装方法详解及文件下载
一.我的安装的过程及方法 正常安装的方法: 1.- Install the program. 2.- Copy "license.lic" into "C:\ADS200 ...
- Windows Time服务无法启动 错误5拒绝访问
接着上次写的文章 XP和Win7设置系统自动同步系统时间方法 本文就把故障出现的过程和解决方法一共写下来,希望大家可以看到本文在解决此项服务的思路.大家以后出现类似的问题和问题可以一样使用此类方法解决 ...