【成功入坑-利用Python进行数据分析·第2版】第一章:准备工作(Preliminaries)

【成功入坑-利用Python进行数据分析·第2版】第一章:准备工作(Preliminaries)_第1张图片
开始之前说点课题话,不得不说我非常喜欢老外设计书的封面,非常有意思,你有没有觉得呢。下面的内容都是我看原版外文到谷歌翻译里面翻译出来的,我的英文非常垃圾,哈哈哈哈,我也想看懂,但是实力不允许。

《利用Python进行数据分析·第2版》这本书对于学习数据分析入门级别非常合适,每一章节都讲的非常好,层层关联,浅到深,各种吸引,主要的章节有:

第1章 准备工作
第2章 Python语法基础,IPython和Jupyter Notebooks
第3章 Python的数据结构、函数和文件
第4章 NumPy基础:数组和矢量计算
第5章 pandas入门
第6章 数据加载、存储与文件格式
第7章 数据清洗和准备
第8章 数据规整:聚合、合并和重塑
第9章 绘图和可视化
第10章 数据聚合与分组运算
第11章 时间序列
第12章 pandas高级应用
第13章 Python建模库介绍
第14章 数据分析案例
附录A NumPy高级应用
附录B 更多关于IPython的内容

本书英文版可以到这里下载:http://www.allitebooks.org/

1.1 这本书是关于什么的

这本书关注的是Python中操作、处理、清理和处理数据的具体细节。我的目标是为Python编程语言及其面向数据的库生态系统和工具提供一个指南,帮助您成为一名有效的数据分析师。虽然该书的标题是“数据分析”,但重点是Python编程、库和工具,而不是数据分析方法。这是数据分析所需的Python编程。

什么样的数据

当书中出现“数据”时,究竟指的是什么呢?主要指的是结构化数据(structured data),这个故意含糊其辞的术语代指了所有通用格式的数据,例如:

  • 表格型数据,其中各列可能是不同的类型(字符串、数值、日期等)。比如保存在关系型数据库中或以制表符/逗号为分隔符的文本文件中的那些数据。
  • 多维数组(矩阵)。
  • 通过关键列(对于SQL用户而言,就是主键和外键)相互联系的多个表。
  • 间隔平均或不平均的时间序列。

这绝不是一个完整的列表。大部分数据集都能被转化为更加适合分析和建模的结构化形式,虽然有时这并不是很明显。如果不行的话,也可以将数据集的特征提取为某种结构化形式。例如,一组新闻文章可以被处理为一张词频表,而这张词频表就可以用于情感分析。

大部分电子表格软件(比如Microsoft Excel,它可能是世界上使用最广泛的数据分析工具了)的用户不会对此类数据感到陌生。

1.2 为什么要使用Python进行数据分析

对于许多人来说,Python编程语言具有很强的吸引力。自1991年首次亮相以来,Python已经成为最受欢迎的解释编程语言之一,还有Perl,Ruby和其他语言。 Python和Ruby自2005年左右开始变得特别流行,用于使用他们众多的Web框架(如Rails(Ruby)和Django(Python))构建网站。这些语言通常称为脚本语言,因为它们可用于快速编写小程序或脚本以自动执行其他任务。我不喜欢“脚本语言”这个术语,因为它带有一个不能用于构建严谨的软件。在解释型语言中,出于各种历史和文化原因,Python开发了一个庞大而活跃的科学计算和数据分析社区。在过去的十年中,Python已经从最前沿或“风险自然”的科学计算语言转变为学术界和工业界数据科学,机器学习和通用软件开发的最重要语言之一。

对于数据分析和交互式计算以及数据可视化,Python将不可避免地与其他广泛使用的开源和商业编程语言和工具进行比较,例如R,MATLAB,SAS,Stata等。近年来,Python对库(例如pandas和scikit-learn)的改进支持使其成为数据分析任务的流行选择。结合Python在通用软件工程方面的整体实力,它是构建数据应用程序的主要语言的绝佳选择。

Python作为胶水语言

Python成为成功的科学计算工具的部分原因是,它能够轻松地集成C、C++以及Fortran代码。大部分现代计算环境都利用了一些Fortran和C库来实现线性代数、优选、积分、快速傅里叶变换以及其他诸如此类的算法。许多企业和国家实验室也利用Python来“粘合”那些已经用了多年的遗留软件系统。

大多数软件都是由两部分代码组成的:少量需要占用大部分执行时间的代码,以及大量不经常执行的“胶水代码”。大部分情况下,胶水代码的执行时间是微不足道的。开发人员的精力几乎都是花在优化计算瓶颈上面,有时更是直接转用更低级的语言(比如C)。

解决“两种语言”问题

在许多组织中,使用更专业的计算语言(如SAS或R)来研究,原型化和测试新想法是很常见的,然后将这些想法移植到更大的生产系统中,例如Java,C#或C ++。 人们越来越发现,Python不仅适用于研究和原型设计,而且适用于构建生产系统。 当一个人足够时,为什么还要保留两个开发环境? 我相信越来越多的公司将沿着这条道路前进,因为让研究人员和软件工程师使用同一套编程工具通常会带来显着的组织效益。

为什么不选Python

虽然Python非常适合构建分析应用以及通用系统,但它对不少应用场景适用性较差。

由于Python是一种解释型编程语言,因此大部分Python代码都要比用编译型语言(比如Java和C++)编写的代码运行慢得多。由于程序员的时间通常都比CPU时间值钱,因此许多人也愿意对此做一些取舍。但是,在那些延迟要求非常小或高资源利用率的应用中(例如高频交易系统),耗费时间使用诸如C++这样更低级、更低生产率的语言进行编程也是值得的。

对于高并发、多线程的应用程序而言(尤其是拥有许多计算密集型线程的应用程序),Python并不是一种理想的编程语言。这是因为Python有一个叫做全局解释器锁(Global Interpreter Lock,GIL)的组件,这是一种防止解释器同时执行多条Python字节码指令的机制。有关“为什么会存在GIL”的技术性原因超出了本书的范围。虽然很多大数据处理应用程序为了能在较短的时间内完成数据集的处理工作都需要运行在计算机集群上,但是仍然有一些情况需要用单进程多线程系统来解决。

这并不是说Python不能执行真正的多线程并行代码。例如,Python的C插件使用原生的C或C++的多线程,可以并行运行而不被GIL影响,只要它们不频繁地与Python对象交互。

1.3基本Python库

对于那些不太熟悉Python数据生态系统和本书中使用的库的人,我将简要介绍其中的一些。

NumPy

NumPy是Numerical Python的缩写,长期以来一直是Python中数值计算的基石。它提供了涉及Python中数值数据的大多数科学应用所需的数据结构,算法和库粘合剂。 NumPy包含以下内容:

  • 快速高效的多维数组对象ndarray
  • 用于使用数组或数学运算执行逐元素计算的函数数组之间的cal操作
  • 用于读取和写入基于阵列的数据集到磁盘的工具
  • 线性代数运算,傅里叶变换和随机数生成
  • 成熟的C API,支持Python扩展和本机C或C++代码,以访问NumPy的数据结构和计算设施

除了NumPy为Python添加的快速数组处理功能之外,它在数据分析中的主要用途之一是作为数据在数据库和库之间传递的容器。对于数值数据,NumPy数组比其他内置Python数据结构更有效地存储和操作数据。此外,用较低级语言(如C或Fortran)编写的库可以对存储在NumPy数组中的数据进行操作,而无需将数据复制到其他一些内存表示中。因此,许多用于Python的数值计算工具要么将NumPy数组假设为主要数据结构,要么将目标与NumPy无缝互操作。

pandas

pandas提供高级数据结构和功能,旨在使结构化或表格式数据快速,简单和富有表现力。自2010年推出以来,它帮助Python成为一个功能强大且高效的数据分析环境。本书中将使用的pandas中的主要对象是DataFrame,一个带有行标签和列标签的表格,面向列的数据结构,以及一个标记为一维标签的数组对象。

pandas将NumPy的高性能阵列计算思想与电子表格和关系数据库(如SQL)的灵活数据处理功能相结合。它提供了复杂的索引功能,可以轻松地重塑,切片和切块,执行聚合以及选择数据子集。由于数据处理,准备和清理是数据分析中的一项重要技能,因此pandas是本书的主要关注点之一。

作为一个背景,我在2008年初期间在定量投资管理公司AQR Capital Management任职期间开始建立pandas。当时,我有一套独特的要求,我所掌握的任何单一工具都无法很好地解决这些要求:

  • 带有标记轴的数据结构支持自动或显式数据对齐,可防止因数据未对齐而导致的常见错误,并处理来自不同来源的不同索引数据
  • 集成的时间序列功能
  • 相同的数据结构处理时间序列数据和非时间序列数据
  • 保留元数据的算术运算和减少
  • 灵活处理丢失的数据
  • 流行数据库中的合并和其他关系操作(例如,基于SQL)

我希望能够在一个地方完成所有这些工作,最好是用一种非常适合通用软件开发的语言。 Python是一种很好的候选语言,但当时并没有一套集成的数据结构和工具来提供这种功能。由于最初是为解决财务和业务分析问题而构建的,因此pandas具有特别深入的时间序列功能和工具,非常适合处理业务流程生成的时间索引数据。

对于用于统计计算的R语言的用户,DataFrame名称将是熟悉的,因为该对象以类似的R data.frame对象命名。与Python不同,data frames是内置于R编程语言及其标准库中。因此,pandas中的许多功能通常是R核心实现的一部分或由附加软件包提供。

pandas名称本身源自面板数据(panel data)多维结构化数据集的计量经济学术语,以及Python data analysis(Python数据分析)。

matplotlib

matplotlib是最流行的Python库,用于生成绘图和其他二维数据可视化。 它最初由John D. Hunter创建,现在由一大群开发人员维护。 它非常适合创建出版物上用的图表。虽然Python程序员可以使用其他可视化库,但matplotlib是最广泛使用的,因此通常与生态系统的其他部分很好地集成。我认为这是一个安全的选择,作为默认的可视化工具。

IPython和Jupyter

IPython项目于2001年开始,作为FernandoPérez的侧面项目,旨在建立一个更好的交互式Python解释器。在随后的16年中,它已成为现代Python数据堆栈中最重要的工具之一。虽然它本身不提供任何计算或数据分析工具,但IPython是从头开始设计的,旨在最大限度地提高交互式计算和软件开发的效率。它鼓励执行 - 探索工作流,而不是许多其他编程语言的典型编辑 - 编译 - 运行工作流。它还可以轻松访问操作系统的shell和文件系统。由于大部分数据分析编码涉及探索,试验和错误以及迭代,因此IPython可以帮助您更快地完成工作。

2014年,Fernando和IPython团队宣布了Jupyter项目,这是一项旨在设计与语言无关的交互式计算工具的更广泛计划。 IPython网络笔记本成为了Jupyter笔记本,现在支持40多种编程语言。 IPython系统现在可以用作内核(一种编程语言模式),用于将Python与Jupyter一起使用。

IPython本身已经成为更广泛的Jupyter开源项目的一个组件,它为交互式和探索性计算提供了高效的环境。它最古老,最简单的“模式”是一个增强的Python shell,旨在加速Python代码的编写,测试和调试。您还可以通过Jupyter Notebook使用IPython系统,这是一个基于Web的交互式代码“notebook”,支持许多编程语言。 IPython shell和Jupyter笔记本对数据探索和可视化特别有用。

Jupyter笔记本系统还允许您使用Markdown和HTML创作内容,为您提供使用代码和文本创建丰富文档的方法。其他编程语言也为Jupyter实现了内核,使您能够在Jupyter中使用Python以外的语言。

就我个人而言,IPython通常涉及我的大部分Python工作,包括运行,调试和测试代码。

在随附的书籍资料中,您将找到包含每章所有代码示例的Jupyter笔记本。

SciPy

SciPy是一组解决科学计算中许多不同标准问题域的软件包。 以下是包含的示例:

  • scipy.integrate:数值积分例程和微分方程求解器。
  • scipy.linalg:扩展了由numpy.linalg提供的线性代数例程和矩阵分解功能。
  • scipy.optimize:函数优化器(最小化器)以及根查找算法。
  • scipy.signal:信号处理工具。
  • scipy.sparse:稀疏矩阵和稀疏线性系统求解器。
  • scipy.special:SPECFUN(这是一个实现了许多常用数学函数(如伽玛函数)的Fortran库)的包装器。
  • scipy.stats:标准连续和离散概率分布(如密度函数、采样器、连续分布函数等)、各种统计检验方法,以及更好的描述统计法。

NumPy和SciPy结合使用,便形成了一个相当完备和成熟的计算平台,可以处理多种传统的科学计算问题。

scikit-learn

自该项目于2010年开始实施以来,scikit-learn已成为Python程序员的首要通用机器学习工具包。 在短短七年时间里,它已经拥有来自世界各地的1,500多名贡献者。 它包括以下模型的子模块:

  • 分类:SVM、近邻、随机森林、逻辑回归等等。
  • 回归:Lasso、岭回归等等。
  • 聚类:k-均值、谱聚类等等。
  • 降维:PCA、特征选择、矩阵分解等等。
  • 选型:网格搜索、交叉验证、度量。
  • 预处理:特征提取、标准化。

与pandas、statsmodels和IPython一起,scikit-learn对于Python成为高效数据科学编程语言起到了关键作用。虽然本书不会详细讲解scikit-learn,我会简要介绍它的一些模型,以及用其它工具如何使用这些模型。

statsmodels

statsmodels是一个统计分析包,由斯坦福大学统计学教授乔纳森泰勒的作品播种,他实施了许多R编程语言中流行的回归分析模型。 Skipper Seabold和Josef Perktold在2010年正式创建了新的statsmodels项目,从那时起,该项目已经成长为一大批参与用户和贡献者。 Nathaniel Smith开发了Patsy项目,该项目为受R公式系统启发的statsmodel提供了公式或模型规范框架。

与scikit-learn相比,statsmodels包含经典(主要是频率)统计和计量经济学的算法。 这包括以下子模块:

  • 回归模型:线性回归,广义线性模型,健壮线性模型,线性混合效应模型等等。
  • 方差分析(ANOVA)。
  • 时间序列分析:AR,ARMA,ARIMA,VAR和其它模型。
  • 非参数方法: 核密度估计,核回归。
  • 统计模型结果可视化。

statsmodels更侧重于统计推断,为参数提供不确定性估计和p值。 相比之下,scikit-learn更注重预测。

与scikit-learn一样,我将简要介绍statsmodels以及如何将它与NumPy和pandas一起使用。

1.4 安装和设置

由于每个人都将Python用于不同的应用程序,因此没有单一的解决方案来设置Python和所需的附加软件包。许多读者将没有一个完整的Python开发环境适合跟随本书,所以在这里我将详细说明如何在每个操作系统上进行设置。 我推荐使用免费的Anaconda发行版。Anaconda提供Python2.7和3.6两种形式,但这可能会在未来的某些时候发生变化。后面教程使用Python 3.6,建议使用Python 3.6或更高版本。

Windows Install

要在Windows上运行,先下载Anaconda安装包。推荐跟随Anaconda下载页面的Windows安装指导,安装指导在写作本书和读者看到此文的的这段时间内可能发生变化。

现在,来确认设置是否正确。打开命令行窗口(cmd.exe),输入python以打开Python解释器。可以看到类似下面的Anaconda版本的输出:

C:\Users\wesm>python
Python 3.5.2 |Anaconda 4.1.1 (64-bit)| (default, Jul  5 2016, 11:41:13)
[MSC v.1900 64 bit (AMD64)] on win32

要退出shell,按Ctrl-D(Linux或macOS上),Ctrl-Z(Windows上),或输入命令exit(),再按Enter。

MacOS

下载OS X Anaconda安装包,它的名字类似Anaconda3-4.1.0-MacOSX-x86_64.pkg。双击.pkg文件,运行安装包。安装包运行时,会自动将Anaconda执行路径添加到.bash_profile文件,它位于/Users/$USER/.bash_profile。

为了确认成功,在系统shell打开IPython:

$ ipython

要退出shell,按Ctrl-D,或输入命令exit(),再按Enter。

安装或升级Python包

在你阅读本书的时候,你可能想安装另外的不在Anaconda中的Python包。通常,可以用以下命令安装:

conda install package_name

如果这个命令不行,也可以用pip包管理工具:

pip install package_name

你可以用conda update命令升级包:

conda update package_name

pip可以用–upgrade升级:

pip install --upgrade package_name

本书中,你有许多机会尝试这些命令。

注意:当你使用conda和pip二者安装包时,千万不要用pip升级conda的包,这样会导致环境发生问题。当使用Anaconda或Miniconda时,最好首先使用conda进行升级。

Python 2 和 Python 3

第一版的Python 3.x出现于2008年。它有一系列的变化,与之前的Python 2.x代码有不兼容的地方。因为从1991年Python出现算起,已经过了17年,Python 3 的出现被视为吸取一些列教训的更优结果。

2012年,因为许多包还没有完全支持Python 3,许多科学和数据分析社区还是在使用Python 2.x。因此,本书第一版使用的是Python 2.7。现在,用户可以在Python 2.x和Python 3.x间自由选择,二者都有良好的支持。

但是,Python 2.x在2020年就会到期(包括重要的安全补丁),因此再用Python 2.7就不是好的选择了。因此,本书使用了Python 3.6,这一广泛使用、支持良好的稳定版本。我们已经称Python 2.x为“遗留版本”,简称Python 3.x为“Python”。我建议你也是如此。

本书基于Python 3.6。你的Python版本也许高于3.6,但是示例代码应该是向前兼容的。一些示例代码可能在Python 2.7上有所不同,或完全不兼容。

1.5 社区和会议

省略

1.6 本书导航

如果之前从未使用过Python,那你可能需要先看看本书的第2章和第3章,我简要介绍了Python的特点,IPython和Jupyter notebooks。这些知识是为本书后面的内容做铺垫。如果你已经掌握Python,可以选择跳过。

接下来,简单地介绍了NumPy的关键特性,附录A中是更高级的NumPy功能。然后,我介绍了pandas,本书剩余的内容全部是使用pandas、NumPy和matplotlib处理数据分析的问题。我已经尽量让全书的结构循序渐进,但偶尔会有章节之间的交叉,有时用到的概念还没有介绍过。

尽管读者各自的工作任务不同,大体可以分为几类:

  • 与外部世界交互:阅读编写多种文件格式和数据存储
  • 数据准备:清洗、修改、结合、标准化、重塑、切片、切割、转换数据,以进行分析
  • 转换数据:对旧的数据集进行数学和统计操作,生成新的数据集(例如,通过各组变量聚类成大的表);
  • 建模和计算:将数据绑定统计模型、机器学习算法、或其他计算工具;
  • 展示:创建交互式和静态的图表可视化和文本总结。

代码示例

本书大部分代码示例的输入形式和输出结果都会按照其在IPython shell或Jupyter notebooks中执行时的样子进行排版:

In [5]: CODE EXAMPLE
Out[5]: OUTPUT

但你看到类似的示例代码,就是让你在in的部分输入代码,按Enter键执行(Jupyter中是按Shift-Enter)。然后就可以在out看到输出。

示例数据

各章的示例数据都存放在GitHub上:http://github.com/pydata/pydata-book。下载这些数据的方法有二:使用git版本控制命令行程序;直接从网站上下载该GitHub库的zip文件。如果遇到了问题,可以到我的个人主页,http://wesmckinney.com/,获取最新的指导。

为了让所有示例都能重现,我已经尽我所能使其包含所有必需的东西,但仍然可能会有一些错误或遗漏。如果出现这种情况的话,请给我发邮件:[email protected]。报告本书错误的最好方法是O’Reilly的errata页面,http://www.bit.ly/pyDataAnalysis_errata。

引入惯例

Python社区已经广泛采取了一些常用模块的命名惯例:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import statsmodels as sm

也就是说,当你看到np.arange时,就应该想到它引用的是NumPy中的arange函数。这样做的原因是:在Python软件开发过程中,不建议直接引入类似NumPy这种大型库的全部内容(from numpy import *)。

行话

由于你可能不太熟悉书中使用的一些有关编程和数据科学方面的常用术语,所以我在这里先给出其简单定义:

数据规整(Munge/Munging/Wrangling)

指的是将非结构化和(或)散乱数据处理为结构化或整洁形式的整个过程。这几个词已经悄悄成为当今数据黑客们的行话了。Munge这个词跟Lunge押韵。

伪码(Pseudocode)

算法或过程的“代码式”描述,而这些代码本身并不是实际有效的源代码。

语法糖(Syntactic sugar)

这是一种编程语法,它并不会带来新的特性,但却能使代码更易读、更易写。

你可能感兴趣的:(python数据分析)