从零开始用Python3做数据分析

2018-05-18 人邮异步社区

点击关注 异步图书,置顶公众号

每天与你分享 IT好书 技术干货 职场知识

参与文末话题讨论,每日赠送异步图书

——异步小编

欢迎来到Python数据分析的世界!如今,Python已成为数据分析和数据科学事实上的标准语言和标准平台之一。我们将为读者展示一张思维导图,图1-1中将给出Python生态系统为数据分析师和数据科学家提供的各种程序库。NumPy、SciPy、Pandas和Matplotlib库共同构成了Python数据分析的基础,当前它们已经成为SciPy Stack 1.0的组成部分。在本文中,我们不仅会学习如何安装SciPy Stack 1.0和Jupyter Notebook,还将编写一些简单的数据分析代码,为后面的学习做好热身。

下面是Python生态系统为数据分析师和数据科学家提供的常用程序库。

●NumPy:这是一个通用程序库,不仅支持常用的数值数组,同时提供了用于高效处理这些数组的函数。

●SciPy:这是Python的科学计算库,对NumPy的功能进行了大量扩充,同时也有部分功能是重合的。Numpy和SciPy曾经共享基础代码,后来分道扬镳了。

●Pandas:这是一个用于数据处理的程序库,不仅提供了丰富的数据结构,同时为处理数据表和时间序列提供了相应的函数。

●Matplotlib:这是一个2D绘图库,在绘制图形和图像方面提供了良好的支持。当前,Matplotlib已经并入SciPy中并支持NumPy。

●IPython:这个库为Python提供了强大的交互式Shell,也为Jupyter提供了内核,同时还支持交互式数据可视化功能。我们将在本文稍后介绍IPython shell。

●Jupyter Notebook:它提供了一个基于Web的交互式shell,可以创建和共享支持可实时代码和可视化的文档。Jupyter Notebook通过IPython提供的内核支持多个版本的Python。本文稍后将会为读者进一步介绍Jupyter Notebook。 

对于本文而言,当需要安装软件时,我们会在恰当的时机给出相应的安装说明。在安装软件的过程中遇到困难或者不能断定最佳方案时,读者可以参考图1-1,这里提供了寻找解决问题所需辅助信息的指南。

 

图1-1

本文将涉及以下主题。

●安装Python 3

●将IPython用作shell

●阅读手册页

●Jupyter Notebook

●NumPy数组

●一个简单的应用

●何处寻找帮助和参考资料

●列出Python库中的模块

●利用matplotlib可视化数据 


 1.1 安装Python 3


本文所用软件都是基于Python 3的,所以必须首先安装Python 3。不过,对于某些操作系统而言,Python 3是默认安装的。Python具有多种实现,其中包括具有商业版权的实现和发行版。在本文中,我们只关注标准Python实现,因为它与NumPy完全兼容。

提示:

读者可以从https://www.python.org/download/页面下载Python 3.5.x。在这个网站上,我们可以找到为Windows和Mac OS X系统开发的安装程序,以及为Linux、UNIX和Mac OS X系统提供的源码包。我们可以从https://docs.python.org/3/using/index.html上找到在各种操作系统上安装和使用Python的相关说明。

本文需要安装的软件,在Windows、各种Linux发行版本和Mac OS X系统上都有相应的二进制安装程序。当然,如果读者愿意,也可以使用相应的源代码发行包。对于Python,要求其版本为3.5.x或更高。Python 2.7版本的支持与维护工作已经从2015年延续至2020年,之后,我们不得不迁移到Python 3。

1.1.1 安装数据分析程序库

下面开始介绍如何在Windows、Linux和Mac OS X上安装和设置NumPy、SciPy、Pandas、Matplotlib、IPython和Jupyter Notebook。下面来详细了解一下这个过程。在本文中,我们将使用pip3来安装这些库。因为从3.4版本起,pip3已经默认包含在Python的安装程序中了。

1.1.2 Linux平台或Mac OS X平台

为了安装这些基础的程序库,可以运行以下命令。

1$ pip3 install numpy scipy pandas matplotlib jupyter notebook

如果当前登录的账户没有足够权限,则需要在上面的命令行前面添加sudo。

1.1.3 Windows平台

在撰写本文时,我们在Windows 10虚拟机上安装了以下软件,作为安装这些程序库的先决条件。

●Python 3.6。

●Microsoft Visual C++ Build Tools 2015。

下载并安装适用于Windows平台的、预编译好的NumPy和SciPy二进制文件。

●我们下载了numpy-1.12.0 + mkl-cp36-cp36m-win_amd64.whl和scipy-0.18.1-cp36- cp36m-win_amd64.whl。

●下载完成后,执行命令pip3 install Downloads umpy-1.12.0 + mkl-cp36-cp36m-win_amd64.whl和pip3 install Downloads\scipy-0.18.1-cp36-cp36m-win_amd64.whl。 

安装上述软件后,为了安装其余的基础程序库,可以运行以下命令。

1$ pip3 install pandas matplotlib jupyter

小技巧

使用这些命令安装Jupyter时,要先安装所有必需的软件包,如Notebook和IPython。


 1.2 将IPython用作shell


我们知道,科学家、数据分析师和工程师经常需要进行实验,而IPython正是为实验而生的。对于IPython提供的交互式环境,明眼人一看就知道它与MATLAB、Mathematica和Maple非常接近。

下面是IPython shell的一些特性。

●Tab补全功能(Tab completion),可以帮助查找命令

●历史记录机制

●行内编辑

●利用%run调用外部Python脚本

●访问系统命令

●访问Python的调试工具和分析工具

下面给出IPython shell的使用方法。

●启动会话:要想使用IPython启动会话,需要在命令行中输入以下指令。 

1  $ ipython3
2  Python3.5.2(default, Sep282016,18:08:09)
3  Type"copyright","credits"or"license"formore information.
4  IPython5.1.0-- An enhanced Interactive Python.
5  ?         -> IntroductionandoverviewofIPython's features.
6  %quickref -> Quick reference.
7  Help      -> Python'
s own help system.
8  object?   -> Details about'object', use'object??'forextra
9               details.
10  In [1]: quit()


小技巧

退出IPython shell时,可以使用quit()函数或者Ctrl+D组合键。

●保存会话:有时我们可能想要恢复之前做过的实验。对于IPython来说,这很容易,只要保存了会话,就可以供将来继续使用,具体命令如下。 

1In [1]: %logstart
2  Activating auto-logging. Current sessionstateplus future
3  input saved:
4  Filename : ipython_log.py
5  Mode : rotate
6  Output logging : False
7  Raw inputlog: False
8  Timestamping : False State : active

使用下列命令可以关闭记录功能。

1 In[9]: %logoff
2 SwitchingloggingOFF

●执行系统的shell命令:在默认情况下,IPython允许通过在命令前面追加“!”号来执行系统的shell命令。举例来说,我们输入下面的命令将会得到当前日期。 

1 In[1]: !date

事实上,任何前置了“!”号的命令行都将发送给系统的shell来处理。此外,可以通过如下方法来存储命令的输出结果。

1 In[2]: thedate = !date
2  In [3]: thedate

●显示历史上用过的命令:可以利用%hist命令来显示之前用过的命令,例子如下。 

1  In [1]: a =2+2
2  In [2]: a
3  Out[2]:4
4  In [3]: %hist
5  a =2+2
6  a
7  %hist

这在命令行接口(Command Line Interface,CLI)环境中是一种非常普遍的功能。此外,我们还可以用-g开关在历史命令中进行搜索,例子如下。

1In [5]: %hist -g a = 2
21: a = 2 + 2

在上面的过程中,我们使用了一些所谓的魔力函数(magic functions),这些函数均以“%”开头。当魔力函数单独用于一行时,就可以省略前缀“%”。


 1.3 学习手册页


当使用IPython导入相应的程序库后,可以通过help命令打开NumPy函数的手册页——即使不知道该函数的确切名称。我们可以先输入几个字符,然后利用Tab键就可以自动补全剩下的字符。下面以arange()函数为例,说明如何查阅与其有关的资料。

这里给出两种翻阅相关信息的方法。

调用help函数:输入help命令(并输入函数名中的前几个字符,再按Tab键。这时将出现一个函数列表(见图1-2),我们可以通过方向键从函数名列表中进行选择,然后按Enter键进行确认),最后按Enter键盘,结束help函数的调用。

通过问号进行查询:另一种方法是在函数名后面加上问号,当然,前提条件是我们已经知道函数名,好处是不必输入help命令,例子如下。

 

图1-2

1 In[3]:numpy.arange?

Tab补全功能依赖于readline,所以务必确保先前已经安装了该软件。如果没有安装,可以使用pip完成安装,具体命令如下。

1$ pip3 installreadline

利用问号,我们可以从文档字符串(docstrings)中获取所需信息。


 1.4 Jupyter Notebook


upyter Notebook以前被称为IPython Notebooks,它提供了一种以特殊格式创建和共享具有文本、图表和Python代码的网页的工具。

很多时候,notebook都是用于演示Python软件,或者用作一款教学工具。我们可以单纯使用Python代码或者通过特殊的notebook格式来导入和导出notebook。另外,notebook既可以在本机上跑,也可以放到专用的notebook服务器上在线使用。某些云计算解决方案(如Wakari和PiCloud)还支持在云中运行notebook。云计算的主题将在第11章中加以介绍。

为了使用Jupyter Notebook启动一个会话,读者可以使用如下命令。

1$ jupyter-notebook

这时将启动notebook服务器并打开一个网页,显示该命令所在文件夹的内容。然后,你可以在Python 3中选择New | Python 3菜单项来启动一个新的notebook。

你也可以打开本文的代码包中提供的ch-01.ipynb。ch-01是一个notebook文件,其中存放了本文中简单应用程序的代码。


 1.5 NumPy数组


安装好NumPy后,就可以来看NumPy数组了。与Python中的列表相比,进行数值运算时NumPy数组的效率要高得多。事实上,NumPy数组是针对某些对象进行了大量的优化工作。

完成相同的运算时,与Python代码相比,NumPy代码用到的显式循环语句明显要少,因为NumPy是基于向量化的运算。还记得高等数学中标量和向量的概念吗?例如,数字2是一个标量,计算2+2时,进行的是标量加法运算。通过一组标量,我们可以构建出一个向量。用Python编程的术语来说,我们得到了一个一维数组。当然,这个概念可以扩展至更高的维度。实际上,针对两个数组的诸如加法之类的运算,可以将其转化为一组标量运算。使用纯Python时,为了完成该操作,可以使用循环语句遍历第一个数组中的每个元素,并与第二个数组中对应的元素相加。然而,在数学家眼里,这种方法过于繁琐。数学上,可以将这两个向量的加法视为单一操作。实际上,NumPy数组也可以这么做,而且它用低级C例程针对某些操作进行了优化处理,使得这些基本运算效率大为提高。关于NumPy数组将在第2章中详细介绍。


 1.6 一个简单的应用


假设要对向量a和b进行求和。注意,这里“向量”的含义是数学意义上的,即一个一维数组。在第4章中,将遇到一种表示矩阵的特殊NumPy数组。向量a存放的是整数0~n−1的2次幂。如果n等于3,那么a保存的是0、1或4。向量b存放的是整数0~n的3次幂,所以如果n等于3,那么向量b等于0、1或者8。如果使用普通的Python代码,该怎么做呢?

在我们想出了一个解决方案后,可以拿来与等价的NumPy方案进行比较。

下面的函数没有借助NumPy,而是使用纯Python来解决向量加法问题。

1def pythonsum(n):
2  a = list(range(n))
3  b = list(range(n))
4  c = []
5 fori inrange(len(a)):
6      a[i] = i **2
7      b[i] = i **3
8      c.append(a[i] + b[i])
9 returnc

下面是利用NumPy解决向量加法问题的函数。

1defnumpysum(n):
2 a = numpy.arange(n) **2
3 b = numpy.arange(n) **3
4 c = a + b
5 returnc

注意,numpysum()无需使用for语句。此外,我们使用了来自NumPy的arange()函数,它替我们创建了一个含有整数0~n的NumPy数组。这里的arange()函数也是从NumPy导入的,所以它加上了前缀numpy。

现在到了真正有趣的地方。我们在前面讲过,NumPy在进行数组运算时,速度是相当快的。可是到底有多快呢?下面的程序代码将为我们展示numpysum()和pythonsum()这两个函数的实耗时间,这里以μs(微秒)为单位。同时,它还会显示向量sum最后面的两个元素值。下面来看使用Python和NumPy能否得到相同的答案。

1#!/usr/bin/env/python
2importsys
3fromdatetimeimportdatetime
4importnumpyasnp
5"""
6This program demonstrates vector addition the Python way.
7Run the following from the command line:
8 python vectorsum.py n
9Here, n is an integer that specifies the size of the vectors.
10The first vector to be added contains the squares of 0 up to n.
11The second vector contains the cubes of 0 up to n.
12The program prints the last 2 elements of the sum and the elapsed time:
13"""

14defnumpysum(n):
15  a = np.arange(n) **2
16  b = np.arange(n) **3
17  c = a + b
18 returnc
19defpythonsum(n):
20  a = list(range(n))
21  b = list(range(n))
22  c = []
23 foriinrange(len(a)):
24      a[i] = i **2
25      b[i] = i **3
26      c.append(a[i] + b[i])
27 returnc
28size = int(sys.argv[1])
29start = datetime.now()
30c = pythonsum(size)
31delta = datetime.now() - start
32print("The last 2 elements of the sum", c[-2:])
33print("PythonSum elapsed time in microseconds", delta.microseconds)
34start = datetime.now()
35c = numpysum(size)
36delta = datetime.now() - start
37print("The last 2 elements of the sum", c[-2:])
38print("NumPySum elapsed time in microseconds", delta.microseconds)

对于1000个、2000个和4000个向量元素,程序的结果如下。

1$ python3 vectorsum.py1000
2The last2elementsofthe sum [995007996,998001000]
3PythonSum elapsed timeinmicroseconds976
4The last2elementsofthe sum [995007996998001000]
5NumPySum elapsed timeinmicroseconds87
6$ python3 vectorsum.py2000
7The last2elementsofthe sum [7980015996,7992002000]
8PythonSum elapsed timeinmicroseconds1623
9The last2elementsofthe sum [79800159967992002000]
10NumPySum elapsed timeinmicroseconds143
11$ python3 vectorsum.py4000
12The last2elementsofthe sum [63920031996,63968004000]
13PythonSum elapsed timeinmicroseconds3417
14The last2elementsofthe sum [6392003199663968004000]
15NumPySum elapsed timeinmicroseconds237

显而易见,NumPy的运行速度比等价的常规Python代码要快很多。有一件事情是肯定的:无论是否使用NumPy,计算结果都是相同的。但是结果的显示形式还是有所差别的,numpysum()函数给出的结果不包含逗号。为什么会这样?别忘了,我们处理的不是Python的列表,而是一个NumPy数组。有关NumPy数组的更多内容,将在第2章中详细介绍。


 1.7 从何处寻求帮助和参考资料


表1-1列出了在本文中讨论过的Python数据分析库的文档网站。 

表1-1

软件包

描述

NumPySciPy

NumPySciPy的主要文档网站是http://docs.scipy.org/doc/。通过该网站,您可以浏览NumPySciPy程序库的用户指南和参考指南,以及一些相关教程

Pandas

http://pandas.pydata.org/pandas-docs/stable/

Matplotlib

http://matplotlib.org/contents.html

IPython

http://ipython.readthedocs.io/en/stable/

Jupyter Notebook 

http://jupyter-notebook.readthedocs.io/en/latest/

表1-1

流行的软件开发论坛Stack Overflow上也有数以百计的NumPy、SciPy、Pandas、Matplotlib、IPython和Jupyter Notebook方面的讨论。如果读者对这些内容感兴趣,建议进一步学习。

如果你遇到了比较棘手的问题,或者想要持续关注这些程序库的开发进展,可以订阅相应的讨论邮寄列表。订阅后,每天收到的数量不一的邮件,开发者会积极报告这些库的开发进展并热心回答其中的问题。

对于IRC用户,可以在irc://irc.freenode.net找到一个相关的频道,虽然该频道的名字是#scipy,但是这并不妨碍我们提问NumPy方面的问题,因为SciPy用户一般比较熟悉NumPy,毕竟SciPy是以NumPy为基础的。在这个SciPy频道中,通常有50多位成员保持在线。


 1.8 查看Python库中包含的模块


ch-01.ipynb文件包含用于查看NumPy、SciPy、Pandas和Matplotlib库中的模块的代码。现在,读者不用担心这些代码的含义,只要尝试运行一下它们就行了。您可以修改其中的代码以查看其他库中的模块。


本文摘自《Python数据分析(第2版)》

《Python数据分析(第2版)》

[美]阿曼多·凡丹戈(Armando Fandango) 

点击封面购买纸书

畅销书升级版,基于Python3。

本书教新手用Python语言分析数据,发挥Python在数据可视化方面的优势,引导读者成为数据分析高手。全书从数据检索、清洗、操作、可视化、存储复杂的分析和建模等方面介绍,重点关注开源模块,如NumPy、SciPy、matplotlib、pandas、IPython、Cython、scikit-learn及NLTK。本书还包括数据可视化、信号处理、时间序列分析、数据库、预测分析和机器学习等主题。


 本书目录


(滑动手机查看)

前言      

第1章 Python程序库入门      

第2章 NumPy数组      

第3章 Pandas入门

第4章 统计学与线性代数

第5章 数据的检索、加工与存储

第6章 数据可视化

第7章 信号处理与时间序列

第8章 应用数据库

第9章 分析文本数据和社交媒体

第10章 预测性分析与机器学习

第11章 Python生态系统的外部环境和云计算

第12章 性能优化、性能分析与并发性

附录A 重要概念

附录B 常用函数

今日互动

你对本书的看法?为什么?截止时间5月31日17时,留言+转发本活动到朋友圈,小编将抽奖选出3读者赠送纸书1本和2张e读版80元异步社区代金券,(留言点赞最多的自动获得一张)。

异步图书后台回复“5月新书”进入新书交流群,获得第一手新书信息


推荐阅读

2018年5月新书书单(文末福利)

2018年4月新书书单

异步图书最全Python书单

一份程序员必备的算法书单

第一本Python神经网络编程图书



长按二维码,可以关注我们哟

每天与你分享IT好文。


异步图书”后台回复“关注”,即可免费获得2000门在线视频课程;推荐朋友关注根据提示获取赠书链接,免费得异步e读版图书一本。赶紧来参加哦!



点击阅读原文,购买《Python应用开发实战》

本站所有内容仅供本人订阅使用!RSS + Sitemap