利用python进行数据分析
第五章 pandas 入门
Series和Dataframe虽然不能解决所有问题,但它们为大多数应用提供了可靠易用的基础
Series
-
Series 是一维的带有索引的数组(Numpy的array的数据类型)
-
与Numpy不一样的是我们可以通过索引的方式获取一个值或一组值
-
可以用numpy数组运算(如用布尔类型数组进行过滤,标量乘法,函数应用)都会保留索引和值的连接
-
可以把Series看成一个定长有序的字典,因为他的索引到值是唯一映射,可以把它应用到可以使用字典的函数中
-
在Series算数运算的时候会自动对齐不同索引的数据
-
创建
- Series字符串的表现形式是:索引在左边,值在右边
由于我们所有设置索引所以会自动生成一个0到n-1长度为n的序列.我们可以通过index和values属性获取键的索引对象和值数组形式 - 如果数据存在一个python类型的字典中可以之间用来创建Series
- 如果定义了索引,再用字典创建是会根据索引进行创建如果字典中没有索引对应的键则会写NaN,顺序也是索引的顺序
- 如果只传入一个字典键会成为索引,而值对应相应的索引
- Series字符串的表现形式是:索引在左边,值在右边
-
属性
- index 显示索引可以通过赋值的方式修改
- values 显示值
- type 显示值的数据类型
- name 该属性和Datafram 有着密切的关系
Dataframe
-
可以看做有多个Series组成的字典,Series.name成为了Dataframe的列索引,构成了Dataframe每一列的数据类型可以不一样.Dataframe是一个表格类的数据结构,其实Dataframe中对行或列的操作基本上是平衡的,
-
创建
- 最常见的就是用等长的列表或numpy组组成的字典,直接传入Dataframe的对象中,会自动加上索引
- 如果指定了列序列,就会按照指定的序列排序,如果有值找不到就会报错
- 使用嵌套字典,外层的键会成为列名,内层就是行索引
- 用嵌套字典时如果指定了索引就替换内层的键.,
-
使用
- 可以通过字典标记的法式获取列的Series,索引和原Dataframe一样
- 也可以通过用属性点列名的方式进行
- 如果用Series进行赋值,会通过索引进行匹配,如果没有对应的就会用缺失值代替
- 删除列可以用del 删除索引出来的Seies对象,因为不是复制出来的副本,就会反映在原始数据中
- 可以使用转置交换行和列
- Dataframe的name,index,columns分别是表名,索引,字段
- vlaues会返回nadarray的二维数据
- dtype会返回一个兼容的数据类型
-
索引INdex
-
在创建Series和Dataframe是会创建一个负责管理轴标签和其他元数据的对象,将使用到的数组或其他序列,转换成一个index
-
index对象是用户不可更改的,不可更改的的属性让index对象在多个数据结构中安全共享
-
index的功能是类似一个有固定大小的集合,和python集合不同的是,可以有重复元素
-
重新索引
- 使用reindex 重新创建一个索引,数据会符合新的索引的描述,如果某个索引不存在就会用缺失值填充,在重新索引是可以加一个参数method=‘ffill’)可以达到用前向值填充,用columns参数更改列索引
- 用drop丢弃指定轴上的对象,使用axis参数指定轴.直接对原数据进行修改
- axis =0 对行操作,axis=1时对列操作
-
索引,选取和过滤
- 利用标签的切片运算包含尾段
- 利用切片进行赋值
- 利用一个值或一个序列,索引一行或多行
- 利用布尔序列来索引,长度必须和要进行索引的行相等
- 用[]可以传递单一的元素和列表,就可以选择列
- loc 使用轴标签
- iloc使用整数索引
- 可以用来切片
-
-
使用add 可以对缺失值进行填充
- add
- sub
- div
- floordiv
- mul
- pow
-
以r字母开头的都是原函数的参数翻转
函数
-
add加
-
sub减
-
div 除
-
floordiv整除
-
mul 乘
-
pow 幂
-
abs 绝对值
-
apply 将函数应用到个列和行形成的一维数组,结果会形成一个Series 使用原数据的索引,axis 表示在沿那个轴
-
applymap 可以应用到元素级的函数,因为Series.map一样的
-
mean 平均值
-
sort_index对索引进行排序,ascending表示升降序,可以对单行或多行进行排序
-
sort_values,对值进行排序,by 指定对那个列进行排序,在排序中会把NAN排到最后
-
is_unique,判断是不是唯一
-
sum 和
-
cum__累积的什么
-
describe是一次性产生多个数据的总汇
-
计算两个Series重叠,非Nan,按索引对齐值的相关系数用 corr ,协方差用cov
- 相关系数和协方差
-
使用unique获取唯一值
-
value_counts计算值的频率
-
isin判断集合的成员资格
第六章 数据的加载,存储与文件格式
6.1读写文本格式的数据
-
pandas有一些将表格类型的Dataframe对象,可以从本地文件中读取
-
read_csv 从文件,URL和文件类型对象中加载数据.默认分隔符是逗号
-
sep 用什么分隔符
- \t \n \s+
-
name 是cloumns
-
index_col 索引
-
skiprows,跳过那几行
-
!cat 执行读取文件
-
na_values 可以用来表示读取到那几个字符是缺失值,用Nan填充
-
nrows,指定读取几行,避免读取整个文件
-
-
read_table,默认分隔符是’\t’制表符
-
read_fwf ,指定宽度
-
read_clipboard 读取粘贴板的数据,将网页转换成数据
-
read_excel 读取execl表
-
read_hdf 读取hdf5 文件
- 大规模科学数组
-
read_html
-
read_json
-
read_msgpack 二进制转码
-
read_pickle 读取python plckle格式的数据
-
read_sql 读取数据库
-
read_stata 读取stata文件格式
-
read_feather 读取feather二进制文件格式
- 内存
-
有哪些技术
- 索引:将一个或多个列当做返回的DataFrame处理,以及是否从文件、用户获取列名。
- 类型推断和数据转换:包括用户定义值的转换、和自定义的缺失值标记列表等。
- 日期解析:包括组合功能,比如将分散在多个列中的日期时间信息组合成结果中的单个列。
- 迭代:支持对大文件进行逐块迭代。
- 不规整数据问题:跳过一些行、页脚、注释或其他一些不重要的东西(比如由成千上万个逗号隔开的数值数据)。
-
将数据写入文件格式
第七章 数据清洗和准备
加载,清洗,转换,以及重塑
处理缺失数据
-
在pandas中默认忽略缺失值的描述统计
-
缺失值被称之为哨兵值,可以方便的被检测出类,pandas是用浮点值NaN(NOt a number)表示缺失值
-
在我们对数据进行清洗时,最好进行对缺失值进行分析,用来判断采集的问题或缺失值对可能导致偏差
-
dropna 根据标签中是否有缺失值,对数据进行过滤
- thresh 对缺失数据的容忍度
-
fillna 对缺失数据进行填充
- 用一个标量进行填充
- 使用字典进行填充,对应的列进行填充
- method ='ffill’前向填充
-
isnull 返回一个布尔值对象
-
notnull 对isnull的否定
移除重复值
- 用duplicated() 返回一个布尔类Series ,表示十分出现的过的重复行
- dropduplicates 删除重复行保留第一个出现的
利用函数或映射进行数据转换
-
使用Series.str字符串方法,基本上python的所有字符串方法后用
- lower 转小写
-
Series.map 应用函数进行替换,会把Series的一维值带入函数中,元素级
-
Series.replace,传入字典或两个对应的列表
重命名轴索引
- index的修改可以用列的方法
- rename创建新的副本的修改
离散化和面元划分
- 为了分析的方便,连续数值一般被离散化,或面元(bin)
- 如果需要将数据离散到一个区间中就可以用cut
qcut 是根据分位数进行划分
检测和过滤异常值
- 使用Dataframe中的索引方法进行检测和过滤异常值
排列和随机采样
- 排列 np.random.permutation可以产生一个表示新顺序的整数数组
- 可以用基于iloc或take函数使用数组进行取值,如果数组是随机的就可以做到随机取样
- Dataframe的sample方法可以取样
计算指标/哑变量
- 通常用于统计建模或机器学习的转换方式:将分变量转换成哑变量或指标矩阵,就是独热编码,产生
- Dataframe_get_dummies 函数可以实现,把Series转换成指标矩阵
字符串操作
- 用Series.str 对Series的值进行字符串操作
- split 分隔
- strip 去除空白符
- index/fine/in发现子串
- count 计算子串的次数
- replace 替换
- contains 查看是否含有某个子串
第八章 数据规整:聚合,合并,重塑
层次化索引
-
层次化索引,是让一个轴上拥有多个索引级别,可以让我们从低维度的形式上处理高纬度的数据
-
可以使用部分索引来选取子集的操作更简单
-
有时我们可以从内层进行筛选
-
可以用unstack进行单轴降维,stack是逆运算
-
有了层次索引可以方便的进行分组
-
重排与分级排序
- swaplevel 交换两个级别的编号和名称,并返回交换好的新对象
- sort_index(level=1)对级别是一的索引进行排序
-
根据级别汇总统计
- 每个Dataframe和Series的对象的聚合函数都有两个参数axis 指定沿那个轴,level指定那个级别
-
使用Dataframe的列进行索引
- 索引和列互化
- 使用set_index 设置索引用一个,或多个列的列表,drop=Flase 设置不删除
- reset_index 将索引转到列中
合并数据集
-
merge可以根据一个或多个列值进行匹配行连接
- objs 表示插入的列表或字典,必须参数
- axis 指明连接的轴向,默认为零
-
concat 可以沿一个轴将多个对象进行堆叠在一起
-
jion默认是左连接
-
索引上的合并
- left_index=True,right_index=Ture 两个索引合并 说明连接用的是左边的索引
- 多层次合并,因为索引合并默认是多建合并,必须用列表的形式指定合并是连接的列
-
轴向连接
- 连接(concatenation)
绑定(binding)
堆叠(stacking) - numpy.concatenation可以轴向连接numpy
- 在使用concat 可以使用keys创建多次索引索引
- join 连接方式,inner内连接,(交集)outer外连接(并集
- keys 用于生产连接轴上的层次化索引
- levels指定层级化
- 不保留连接轴上的索引
- 连接(concatenation)
-
合并重叠数据
- 在合并时有可能索引重叠的部分,我们可以使用np.where就是if_else
- where(条件,满足条件的数据,不满足的数据)最后得到两个数据的选择数据
- data.combine_first(data1) 取data1的值去填充对应data的空值
重塑和轴向旋转
-
重塑层次化索引
- stack 将数据的列转向行
- unstack 将数据的行转向列
- 默认操作的是最内层的,可以通过分层的级别或名称即可对其对应的级别进行操作
- 在旋转的时候可能找不到数据就会用NaN填充
- 用逆操作就可以删除NaN
- 当对一个级别进行操作时,结果都是变成最低的级别
-
将’长格式’旋转为’宽格式’
- 多个时间序列通常是以所谓的’长格式’或堆叠格式’存储在数据库和scv文件中.
- 关系型数据库(如MySQL)中的数据经常都是这样存储的,因为固定架构(即列名和数据类型)有一个好处:随着表中数据的添加,item列中的值的种类能够增加。在前面的例子中,date和item通常就是主键(用关系型数据库的说法),不仅提供了关系完整性,而且提供了更为简单的查询支持。有的情况下,使用这样的数据会很麻烦,你可能会更喜欢DataFrame,不同的item值分别形成一列,date列中的时间戳则用作索引。DataFrame的pivot方法完全可以
-
将宽格式旋转为长格式
- 旋转DataFrame的逆运算是pandas.melt。它不是将一列转换到多个新的DataFrame,而是合并多个列成为一个,产生一个比输入长的DataFrame
- key列可能是分组指标,其它的列是数据值。当使用pandas.melt,我们必须指明哪些列是分组指标。下面使用key作为唯一的分组指标
- 使用pivot,可以重塑回原来的样子
- 就是把多个列变成一个Series
第九章 绘图和可视化
信息可视化(也叫绘图)夹杂在数据处理,清洗,和分析等是数据分析的重要工作之一,也是探索的一部分
帮我们找出异常的数据,对数据相关性的探索,得出模型的idea
做一个数据交互的也是工作之一
matplotlib API 入门
-
%matplotlib notebook
%matplotlib inline
是在使用matplotlib库时的辅助魔法命令 -
matplotlib的示例库和文档是我们学习高级用法的最好的方式
-
FIgure(画板)和Subplot(画布)
- 图像都在Figure的对象中,我们可以用plt.figure创建一个新的Figure
- 用figsize设置画板的大小的和横纵比
- Figure只是画板,画图需要画布Subplot
- add_subplot,subplots可以用用元组的形式创建一个或多个subplot
- bin线的宽度,
- color颜色
- alpha 透明度
-
调整subplot周围的间距
- 利用Figure对象的subplot_adjust方法可以调整图像之间的间距
- subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)
-
颜色,标记和线型
- 参数linestyle是对线型进行设置
- 参数colr是对颜色进行设置
- marker是对节点的形状进行设置
- label是图例,用plt.legend函数启动
-
刻度和标签还有图例
- 使用matplotlib.pyplot是一个面向对象的原生的matplotlib的接口
- pyplot含有对图像的交互,有xlim,xticks,xticklabels对图标的范围,刻度,图例进行控制
- 调用时不带参数就会返回当前的参数
-
设置标题,轴标签,刻度以及刻度标签
- 要改变x轴的刻度矩,最简单的就是set_index,set_xticklables.
- rotation 选项设定x刻度标签的倾斜的角度
- set_xlable为x轴设置名字
- set_title设置一个标题
- 可以用字典key为设置的对象,values为设置的参数set(**dict)
-
添加图例
- 图例是标注图元素的一种重要工具
-
注解以及在subplot上绘图
- 除标准的绘图类型,你可能还希望绘制一些子集的注解,可能是文本、箭头或其他图形等。注解和文字可以通过text、arrow和annotate函数进行添加。text可以将文本绘制在图表的指定坐标(x,y),还可以加上一些自定义格式
- 要添加图形需要创建一个块对象,把对象用add_patch添加带subplot中
-
将图表保存到文件中
- 使用savefig
-
matplotlib配置
- matplotlib自带一些配色方案,以及为生成出版质量的图片而设定的默认配置信息。幸运的是,几乎所有默认行为都能通过一组全局参数进行自定义,它们可以管理图像大小、subplot边距、配色方案、字体大小、网格类型等。一种Python编程方式配置系统的方法是使用rc方法。例如,要将全局的图像默认大小设置为10×10
使用pandas和seaborn绘图
-
matplotlib实际上是一种比较低级的工具。要绘制一张图表,你组装一些基本组件就行:数据展示(即图表类型:线型图、柱状图、盒形图、散布图、等值线图等)、图例、标题、刻度标签以及其他注解型信息
-
线型图
- plt.plot() df.plot.line()
-
柱状
- bar barh
-
直方图和密度图
- hist 直方图
- density 密度图
- sns.distplot 同时画出直方图和连续额密度估计图
-
散点图或点图
- 点图或散布图是观察两个一维数据序列之间的关系的有效手段。
- sns.regplot 散点图加回归线
- sns.pairplot 散点矩阵
第十章 数据聚合与分组运算
对数据集进行分组并对各组应用一个函数(无论是聚合还是转换),通常是数据分析工作中的重要环节。在将数据集加载、融合、准备好之后,通常就是计算分组统计或生成透视表。pandas提供了一个灵活高效的gruopby功能,它使你能以一种自然的方式对数据集进行切片、切块、摘要等操作。
关系型数据库和SQL(Structured Query Language,结构化查询语言)能够如此流行的原因之一就是其能够方便地对数据进行连接、过滤、转换和聚合。但是,像SQL这样的查询语言所能执行的分组运算的种类很有限。在本章中你将会看到,由于Python和pandas强大的表达能力,我们可以执行复杂得多的分组运算(利用任何可以接受pandas对象或NumPy数组的函数)
可以学到
- 使用一个键或多个键把pandas对象进行分割
- 计算分组和概述统计,统计描述,或自定方法
- 应用组内转换或运算,进行规格化,线性回归,取子集
- 计算透视表和交叉表
- 进行分位数或分组统计分析
GroupBy机制
-
首先对数据进行拆分-应用-合并
-
Hadley Wickham(许多热门R语言包的作者)创造了一个用于表示分组运算的术语"split-apply-combine"(拆分-应用-合并)。第一个阶段,pandas对象(无论是Series、DataFrame还是其他的)中的数据会根据你所提供的一个或多个键被拆分(split)为多组。拆分操作是在对象的特定轴上执行的。例如,DataFrame可以在其行(axis=0)或列(axis=1)上进行分组。然后,将一个函数应用(apply)到各个分组并产生一个新值。最后,所有这些函数的执行结果会被合并(combine)到最终的结果对象中。结果对象的形式一般取决于数据上所执行的操作
-
列表或数组,其长度与待分组的轴一样。
-
表示DataFrame某个列名的值。
-
字典或Series,给出待分组轴上的值与分组名之间的对应关系。
-
函数,用于处理轴索引或索引中的各个标签。
-
当用groupby时先不会执行,只会生成一个对象包含关于分组的一些信息.,可以用多个列进行分组,顺序不一样,分组也会不一样.分组后就像一个多层索引一样
-
用size(0可以获取分组的信息,每个组有多少个成员
-
分组进行迭代
- 分组后会产生一个二元元组(分别是分组名,和成员数据块组成,对于多重键分组名就是有键名组成的元组.
- groupby默认是在axis=0上进行分组的,通过设置也可以在其他任何轴上进行分组。拿上面例子中的df来说,我们可以根据dtype对列进行分组
-
选取一列或列的子集
- 在分完组后可以用索引的方式选取部分数据进行聚合,如果传入的是一个标量值返回的是一个以分组的Dataframe或以分组的Series
- 使用python的函数,任何作为分组键的函数都会在索引上被掉用一次,返回值成为分组名称
- 将函数跟数组,字典列表混合使用,都会被转为数组
-
根据索引级别分组
- 层次化索引方便是可以根据轴索引进行聚合
- 要根据级别分组,需要传入level关键字传递级别号
数据聚合
-
聚合就是把任何数组数据转换为标量值的数据的过程
-
如果要使用自定义函数要将其传入aggregate或agg方法
-
面向列的多函数应用
- 你已经看到,对Series或DataFrame列的聚合运算其实就是使用aggregate(使用自定义函数)或调用诸如mean、std之类的方法
- 如果传入一组函数或函数名,得到的列就会以函数名命名
- agg 可以传入键值对键时列名,值是聚合函数,可以是对象,也可以是内置函数的名的字符串
-
以没有行索引的形式返回数据 as_index =False传入groupby
-
使用apply:一般性的’拆分-应用-分解’
- apply会将待处理的对象拆分成多个片段,将各个片段分别应用带函数中
- 如果想想要传入其他参数,只需要再apply中的使用关键字传参.关键字是函数中的
-
禁止分组键 group_keys=Flase就会禁止groupby分组
-
分位数和桶分析
- 可以使用cut qcut把数据按块切割
- 如果这个和groupby和cut qcut结合就可以轻松的实现桶(bucket)或分位数(quantile)分析
-
用特定分组的值填充缺失数据
- 对于数据清洗我们通常缺失值我们会用pandas.dropna将其过滤,或希望用固定的值进行填充,或用数据本身的衍生值进行填充
- 我们可以用apply,用自定义函数进行填充
-
随机采样和排列
-
分组加权平均数,和相关系数
透视表和交叉表
-
pivot_table
- 透视表(pivot table)是各种电子表格程序和其他数据分析软件中一种常见的数据汇总工具。它根据一个或多个键对数据进行聚合,并根据行和列上的分组键将数据分配到各个矩形区域中。
-
crosstab用于计算分组频率的特殊透视表
第十一章 时间序列
时间序列
- 在很多领域时间类型的数据结构都是很重要的,通过观察得出的一段时间序列,这段数据可能有这某个固定的周期或频率,主要取决于应用场景
- 时间戳:特定的时刻
- 固定的时期
- 时间间隔
- 实验或过程时间,每个时间都是对特定时间的度量
日期和时间数据类型以及工具
- datetime是以毫秒的形式存储日期和时间,timedelta表示两个对象之间的时间差
- 子主题 2
第十二章 pandas高级应用
分类数据
- 背景目的
- 使用unqiue去重
- value_counts 对值进行计算频率
- take 可以提取一个列表的对应值
- 子主题 5