信息可视化(也叫绘图)是数据分析中最重要的工作之一。它可能是探索过程的一部分,例如,帮助我们找出异常值、必要的数据转换、得出有关模型的idea等。另外,做一个可交互的数据可视化也许是工作的最终目标。
Python有许多库进行静态或动态的数据可视化,但我这里重要关注于matplotlib(http://matplotlib.org/)和基于它的库。
matplotlib是一个用于创建出版质量图表的桌面绘图包(主要是2D方面)。该项目是由John Hunter于2002年启动的,其目的是为Python构建一个MATLAB式的绘图接口。matplotlib和IPython社区进行合作,简化了从IPython shell(包括现在的Jupyter notebook)进行交互式绘图。matplotlib支持各种操作系统上许多不同的GUI后端,而且还能将图片导出为各种常见的矢量(vector)和光栅(raster)图:PDF、SVG、JPG、PNG、BMP、GIF等。除了几张,本书中的大部分图都是用它生成的。
随着时间的发展,matplotlib衍生出了多个数据可视化的工具集,它们使用matplo ...
对数据集进行分组并对各组应用一个函数(无论是聚合还是转换),通常是数据分析工作中的重要环节。在将数据集加载、融合、准备好之后,通常就是计算分组统计或生成透视表。pandas提供了一个灵活高效的groupby功能,它使你能以一种自然的方式对数据集进行切片、切块、摘要等操作。
关系型数据库和SQL(Structured Query Language,结构化查询语言)能够如此流行的原因之一就是其能够方便地对数据进行连接、过滤、转换和聚合。但是,像SQL这样的查询语言所能执行的分组运算的种类很有限。在本章中你将会看到,由于Python和pandas强大的表达能力,我们可以执行复杂得多的分组运算(利用任何可以接受pandas对象或NumPy数组的函数)。在本章中,你将会学到:
使用一个或多个键(形式可以是函数、数组或DataFrame列名)分割pandas对象。
计算分组的概述统计,比如数量、平均值或标准差,或是用户定义的函数。
应用组内转换或其他运算,如规格化、线性回归、排名或选取子集等。
计算透视表或交叉表。
执行分位数分析以及其它统计分组分析。
笔记:对时间序列数据的聚合(group ...
前面的章节关注于不同类型的数据规整流程和NumPy、pandas与其它库的特点。随着时间的发展,pandas发展出了更多适合高级用户的功能。本章就要深入学习pandas的高级功能。
12.1 分类数据这一节介绍的是pandas的分类类型。我会向你展示通过使用它,提高性能和内存的使用率。我还会介绍一些在统计和机器学习中使用分类数据的工具。
12.1.1 背景和目的表中的一列通常会有重复的包含不同值的小集合的情况。我们已经学过了unique和value_counts,它们可以从数组提取出不同的值,并分别计算频率:
12345678910111213141516171819202122232425In [10]: import numpy as np; import pandas as pdIn [11]: values = pd.Series(['apple', 'orange', 'apple', ....: 'apple'] * 2)In [12]: values ...
时间序列(time series)数据是一种重要的结构化数据形式,应用于多个领域,包括金融学、经济学、生态学、神经科学、物理学等。在多个时间点观察或测量到的任何事物都可以形成一段时间序列。很多时间序列是固定频率的,也就是说,数据点是根据某种规律定期出现的(比如每15秒、每5分钟、每月出现一次)。时间序列也可以是不定期的,没有固定的时间单位或单位之间的偏移量。时间序列数据的意义取决于具体的应用场景,主要有以下几种:
时间戳(timestamp),特定的时刻。
固定时期(period),如2007年1月或2010年全年。
时间间隔(interval),由起始和结束时间戳表示。时期(period)可以被看做间隔(interval)的特例。
实验或过程时间,每个时间点都是相对于特定起始时间的一个度量。例如,从放入烤箱时起,每秒钟饼干的直径。
本章主要讲解前3种时间序列。许多技术都可用于处理实验型时间序列,其索引可能是一个整数或浮点数(表示从实验开始算起已经过去的时间)。最简单也最常见的时间序列都是用时间戳进行索引的。
提示:pandas也支持基于timedeltas的指数,它可以有效代表 ...
本书中,我已经介绍了Python数据分析的编程基础。因为数据分析师和科学家总是在数据规整和准备上花费大量时间,这本书的重点在于掌握这些功能。
开发模型选用什么库取决于应用本身。许多统计问题可以用简单方法解决,比如普通的最小二乘回归,其它问题可能需要复杂的机器学习方法。幸运的是,Python已经成为了运用这些分析方法的语言之一,因此读完此书,你可以探索许多工具。
本章中,我会回顾一些pandas的特点,在你胶着于pandas数据规整和模型拟合和评分时,它们可能派上用场。然后我会简短介绍两个流行的建模工具,statsmodels和scikit-learn。这二者每个都值得再写一本书,我就不做全面的介绍,而是建议你学习两个项目的线上文档和其它基于Python的数据科学、统计和机器学习的书籍。
13.1 pandas与模型代码的接口模型开发的通常工作流是使用pandas进行数据加载和清洗,然后切换到建模库进行建模。**开发模型的重要一环是机器学习中的“特征工程”。**它可以描述从原始数据集中提取信息的任何数据转换或分析,这些数据集可能在建模中有用。本书中学习的数据聚合和GroupBy工具常用于 ...
本书正文的最后一章,我们来看一些真实世界的数据集。对于每个数据集,我们会用之前介绍的方法,从原始数据中提取有意义的内容。展示的方法适用于其它数据集,也包括你的。本章包含了一些各种各样的案例数据集,可以用来练习。
案例数据集可以在Github仓库找到,见第一章。
14.1 来自Bitly的USA.gov数据2011年,URL缩短服务Bitly跟美国政府网站USA.gov合作,提供了一份从生成.gov或.mil短链接的用户那里收集来的匿名数据。在2011年,除实时数据之外,还可以下载文本文件形式的每小时快照。写作此书时(2017年),这项服务已经关闭,但我们保存一份数据用于本书的案例。
以每小时快照为例,文件中各行的格式为JSON(即JavaScript Object Notation,这是一种常用的Web数据格式)。例如,如果我们只读取某个文件中的第一行,那么所看到的结果应该是下面这样:
12345678910In [5]: path = 'datasets/bitly_usagov/example.txt'In [6]: open(path).readline()O ...
突发奇想,想用Python把数据结构的知识再过一遍,所以就开始从顺序表从头来一遍,Python内置了一些功能,感觉只需要定义方法调用就好了,或者不想这么干的话,直接调用内置的方法咯。
list 是一种元素个数可变的线性表,采用了分离式技术实现的动态顺序表。可以加入和删除元素,并在各种操作中维持已有元素的顺序(即保序)。
1.1 创建顺序表123456# 创建顺序表def CreateSeqList(self): element = input("please enter(input #:end):") while element != '#': self.seqList.append(int(element)) element = input("please enter(input #:end):")
1.2 查找元素123456789# 查找顺序表中某一个元素def FindElement(self): key = int(input("please ente ...
单链表是一种链式的数据结构,链表中的数据用结点表示,保持了数据之间的逻辑关系,但存储空间不一定是按照顺序存储。
链表的基本元素有:
节点:包括数据域和指针域,数据域存放数据,指针域存放指向下一个元素的指针
head:头结点
tail:尾结点
None:链表最后一个结点的指针域为None
Python中没有显式的指针,但是有引用啊,所以我们可以通过定义节点类和引用来实现链表!
链表分为单链表和单循环链表,双向链表和双向循环链表,本篇先讲一下单链表:
2.1 定义节点类节点类中包括节点数据和下一个节点地址,即引用
1234567891011121314# 节点类class Node(object): # 单个节点 初始化 输入一个值data,将值变为一个节点 def __init__(self, data): self.data = data self.next = None # 打印对象中具体的属性值 def __str__(self): # 测试基本功能,输出data return self.dat ...
在这篇附录中,我会深入NumPy库的数组计算。这会包括ndarray更内部的细节,和更高级的数组操作和算法。
本章包括了一些杂乱的章节,不需要仔细研究。
A.1 ndarray对象的内部机理NumPy的ndarray提供了一种将同质数据块(可以是连续或跨越)解释为多维数组对象的方式。正如你之前所看到的那样,数据类型(dtype)决定了数据的解释方式,比如浮点数、整数、布尔值等。
ndarray如此强大的部分原因是所有数组对象都是数据块的一个跨度视图(strided view)。你可能想知道数组视图arr[::2,::-1]不复制任何数据的原因是什么。简单地说,ndarray不只是一块内存和一个dtype,它还有跨度信息,这使得数组能以各种步幅(step size)在内存中移动。更准确地讲,ndarray内部由以下内容组成:
一个指向数据(内存或内存映射文件中的一块数据)的指针。
数据类型或dtype,描述在数组中的固定大小值的格子。
一个表示数组形状(shape)的元组。
一个跨度元组(stride),其中的整数指的是为了前进到当前维度下一个元素需要“跨过”的字节数。
图A-1简单 ...
栈是一种数据结构,只能从一端插入和删除操作,遵循着先进后出原则存储数据。
3.1 栈的初始化1234def __init__(self): self.stack = [] # 栈列表 self.size = 20 # 栈大小 self.top = -1 # 栈顶位置
3.2 元素进栈1234# 元素进栈def push(self, element): self.stack.append(element) self.top += 1
3.3 元素出栈123456# 元素出栈def pop(self): element = self.stack[-1] self.top -= 1 del self.stack[-1] return element
这里可以直接调用pop函数,使用如下:
1self.stack.pop() # 弹出栈顶元素
3.4 获取栈顶元素123# 获取栈顶位置def getTop(self): return self.top
这里也可以直接使用列表,使用如下:
1self.s ...

