从零开始手把手教你用Python 3做数据分析?

欢迎来到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,这里提供了寻找解决问题所需辅助信息的指南。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ksHeUBvk-1579577560888)(/api/storage/getbykey/original?key=1804a20b9b8638dc60f8)]

图1-1

本章将涉及以下主题。

  • 安装Python 3
  • 将IPython用作shell
  • 阅读手册页
  • Jupyter Notebook
  • NumPy数组
  • 一个简单的应用
  • 何处寻找帮助和参考资料
  • 列出Python库中的模块
  • 利用matplotlib可视化数据

1.1 安装Python 3

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WeJA2kCm-1579577560890)(/api/storage/getbykey/original?key=1804f8abab8e0510b2a3)] 提示

读者可以从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平台

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

$ 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\numpy-1.12.0 + mkl-cp36-cp36m-win_amd64.whl和pip3 install Downloads\scipy-0.18.1-cp36-cp36m-win_amd64.whl。

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

$ 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启动会话,需要在命令行中输入以下指令。
   $ ipython3
   Python 3.5.2 (default, Sep 28 2016, 18:08:09)
   Type "copyright", "credits" or "license" for more information.

   IPython 5.1.0 -- An enhanced Interactive Python.
   ?         -> Introduction and overview of IPython's features.
   %quickref -> Quick reference.
   Help      -> Python's own help system.
   object?   -> Details about 'object', use 'object??' for extra
                details.

   In [1]: quit()

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

  • 保存会话:有时我们可能想要恢复之前做过的实验。对于IPython来说,这很容易,只要保存了会话,就可以供将来继续使用,具体命令如下。
   In [1]: %logstart
   Activating auto-logging. Current session state plus future
   input saved:
   Filename : ipython_log.py
   Mode : rotate
   Output logging : False
   Raw input log : False
   Timestamping : False State : active

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

   In [9]: %logoff
   Switching logging OFF
  • 执行系统的shell命令:在默认情况下,IPython允许通过在命令前面追加“!”号来执行系统的shell命令。举例来说,我们输入下面的命令将会得到当前日期。
   In [1]: !date

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

   In [2]: thedate = !date
   In [3]: thedate
  • 显示历史上用过的命令:可以利用%hist命令来显示之前用过的命令,例子如下。
   In [1]: a = 2 + 2
   In [2]: a
   Out[2]: 4
   In [3]: %hist
   a = 2 + 2
   a
   %hist

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

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

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

1.3 学习手册页

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

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

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MncQABlL-1579577560895)(/api/storage/getbykey/original?key=180414664e2daff1ddf4)]

图1-2

   In [3]: numpy.arange?

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

   $ pip3 install readline

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

1.4 Jupyter Notebook

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

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

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

$ 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来解决向量加法问题。

def pythonsum(n):
   a = list(range(n))
   b = list(range(n))
   c = []

   for i in range(len(a)):
       a[i] = i ** 2
       b[i] = i ** 3
       c.append(a[i] + b[i])

   return c

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

def numpysum(n):
  a = numpy.arange(n) ** 2
  b = numpy.arange(n) ** 3
  c = a + b
  return c

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

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

#!/usr/bin/env/python

import sys
from datetime import datetime
import numpy as np

"""
This program demonstrates vector addition the Python way.
Run the following from the command line:

  python vectorsum.py n

Here, n is an integer that specifies the size of the vectors.

The first vector to be added contains the squares of 0 up to n.
The second vector contains the cubes of 0 up to n.
The program prints the last 2 elements of the sum and the elapsed time:
"""

def numpysum(n):
   a = np.arange(n) ** 2
   b = np.arange(n) ** 3
   c = a + b

   return c

def pythonsum(n):
   a = list(range(n))
   b = list(range(n))
   c = []

   for i in range(len(a)):
       a[i] = i ** 2
       b[i] = i ** 3
       c.append(a[i] + b[i])

   return c

size = int(sys.argv[1])

start = datetime.now()
c = pythonsum(size)
delta = datetime.now() - start
print("The last 2 elements of the sum", c[-2:])
print("PythonSum elapsed time in microseconds", delta.microseconds)

start = datetime.now()
c = numpysum(size)
delta = datetime.now() - start
print("The last 2 elements of the sum", c[-2:])
print("NumPySum elapsed time in microseconds", delta.microseconds)

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

$ python3 vectorsum.py 1000
The last 2 elements of the sum [995007996, 998001000]
PythonSum elapsed time in microseconds 976
The last 2 elements of the sum [995007996 998001000]
NumPySum elapsed time in microseconds 87
$ python3 vectorsum.py 2000
The last 2 elements of the sum [7980015996, 7992002000]
PythonSum elapsed time in microseconds 1623
The last 2 elements of the sum [7980015996 7992002000]
NumPySum elapsed time in microseconds 143
$ python3 vectorsum.py 4000
The last 2 elements of the sum [63920031996, 63968004000]
PythonSum elapsed time in microseconds 3417
The last 2 elements of the sum [63920031996 63968004000]
NumPySum elapsed time in microseconds 237

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

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

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

表1-1

软件包 描述
NumPySciPy NumPy和SciPy的主要文档网站是http://docs.scipy.org/doc/。通过该网站,您可以浏览NumPy和SciPy程序库的用户指南和参考指南,以及一些相关教程
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/

流行的软件开发论坛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库中的模块的代码。现在,读者不用担心这些代码的含义,只要尝试运行一下它们就行了。您可以修改其中的代码以查看其他库中的模块。

1.9 通过Matplotlib实现数据的可视化

我们将在后面的章节中详细介绍数据的可视化问题。现在,我们先来加载两个样本数据集并生成一些简单的图形。首先,我们使用以下命令将sklearn库安装到要提供加载数据的地方。

$ pip3 install scikit-learn

接下来,使用以下命令导入数据集。

from sklearn.datasets import load_iris
from sklearn.datasets import load_boston

然后,导入Matplotlib绘图模块。

from matplotlib import pyplot as plt
%matplotlib inline

加载iris数据集,显示数据集的相关描述,同时将第1列(萼片长度)作为x坐标值,将第2列(萼片宽度)作为y坐标值。

iris = load_iris()
print(iris.DESCR)
data=iris.data
plt.plot(data[:,0],data[:,1],".")

这时,将生成如图1-3所示的图形。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-92Mr8wQ6-1579577560895)(/api/storage/getbykey/original?key=18042d949b9929fa0e4b)]

图1-3

加载波士顿数据集,显示数据集的相关描述,同时将第3列(非零售业务的比例)作为x坐标值,将第5列(一氧化氮浓度)做为y坐标值,图上的每个点用“+”号表示。

boston = load_boston()
print(boston.DESCR)
data=boston.data
plt.plot(data[:,2],data[:,4],"+")

最终得到的图形如图1-4所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cDQiHB9O-1579577560896)(/api/storage/getbykey/original?key=1804d2f655c3f092cf87)]

图1-4

1.10 小结

本章安装了以后要用到的NumPy、SciPy、Pandas、Matplotlib、IPython和Jupyter Notebook等程序库,并通过一个向量加法程序,体验了NumPy带来的卓越性能。此外,我们还探讨了有关的文档和在线资源。同时,我们还尝试通过运行代码来查找库中的模块,并加载了一些样本数据集,还使用Matplotlib绘制一些简单的图形。

第2章将揭晓与NumPy有关的内容,以探索数组和数据类型等基本概念。

发布了496 篇原创文章 · 获赞 280 · 访问量 87万+

猜你喜欢

转载自blog.csdn.net/epubit17/article/details/104060303