由于具有简单易用、第三方库丰富等优点,Python已成为当前智能计算领域中一种非常流行的编程语言。本书的读者应具备Python程序设计的基础知识,因此本书不会再系统介绍Python编程的基础知识,而是在简单介绍Anaconda环境的安装配置及Jupyter Notebook的使用后,从求解2.1节所述问题的角度给出程序实例,帮助读者回顾Python编程的基础知识。
1.Anaconda环境的安装配置
Anaconda是一个用于科学计算的Python/R发行版,支持Linux、Windows、MacOS系统。它提供了包管理与环境管理的功能,可以方便地解决多版本Python并存、切换以及各种第三方包安装问题。使用Anaconda可以一次性地获得几百种用于科学和工程计算相关任务的Python编程库,避免安装各种Python包的麻烦。读者可以从Anaconda官网的个人版安装包下载页面(https://www.anaconda.com/products/individual)下载各平台的安装包,如图2-1所示。这里只给出Windows系统上的Python安装说明。读者可以根据自己的操作系统版本选择下载Python 3.X的32位安装包或64位安装包。下载完成后,运行安装包,按照安装向导设置安装路径,即可完成安装。
图2-1 Anaconda官网的个人版安装包下载页面
Anaconda安装完成后,会在“开始”菜单中出现几个新应用:
● Anaconda Navigator:用于管理工具包和环境的图形用户界面,其中提供了Jupyter Notebook、Spyder等编程环境的启动按钮,如图2-2所示。
● Anaconda Prompt:用于管理工具包和环境的命令行界面。
● Jupyter Notebook:基于Web的交互式编程环境,可以方便地编辑并运行Python程序,用于展示数据分析的过程。本书中的全部示例程序都基于Jupyter Notebook运行并展示其运行结果。
● Spyder:基于客户端的Python程序集成开发环境。在Jupyter Notebook中进行程序调试需要使用pdb命令,使用起来很不方便。如果读者需要通过调试解决程序中的逻辑错误,则建议使用Spyder或PyCharm等客户端开发环境,利用界面操作即可完成调试并方便地查看各种变量的状态。
图2-2 Anaconda Navigator界面
1)请读者在自己的计算机上完成Anaconda的安装。
2)请读者在Anaconda Navigator中完成scikit-learn和matplotlib工具包的安装。
这里只给出第2个上机操作的具体步骤:
● 单击图2-2左侧列表中的“Environments”,即可看到图2-3所示的工具包和环境管理界面。
● 在中间的操作视图中选择已有环境或创建(Create)新环境后(目前选择了base(root)),即可在右侧视图中看到当前环境中已安装的工具包。
● 将右侧视图左上方列表框中的Installed改为All,直接在列表中选择要安装的工具包,或在上方搜索框中输入要安装的工具包名称,进行工具包筛选后再选择要安装的工具包。
● 选择要安装的工具包前面的复选框,再单击右下方的Apply按钮即可开始安装。由于已经安装了matplotlib,因此这里选择mpld3作为安装示例。
图2-3 Anaconda Navigator的工具包和环境管理界面
1)也可以在Anaconda Prompt下使用pip命令完成相应工具包的安装(推荐使用该方法),如:
使用国内镜像可以减少安装包的获取时间,如下面命令使用了douban镜像:
2)Anaconda Prompt的启动方法如下:在图2-3的中间视图中选择某一环境后,单击环境名称后面的箭头,在出现的弹出菜单中选择Open Terminal,也可以直接在系统的“开始”菜单中找到Anaconda Prompt并运行。
2.Jupyter Notebook的使用
Jupyter Notebook是基于浏览器的开发环境,可以用于便捷地编辑和运行Python程序。启动Jupyter Notebook的方法如下:
● 在图2-2中单击Jupyter Notebook图标下方的Launch来启动Jupyter Notebook服务,并自动启动系统默认浏览器来显示Jupyter Notebook开发界面。
Jupyter Notebook操作演示
● 在系统的“开始”菜单中找到并运行Jupyter Notebook(推荐使用该方法),出现如图2-4所示的界面(读者的计算机启动后是黑底白字,此处为了显示清楚,所以更改为白底黑字),并自动启动系统默认浏览器来显示Jupyter Notebook的开发界面,如图2-5所示。
图2-4 Jupyter Notebook的启动界面
图2-5 Jupyter Notebook的开发界面
如果启动Jupyter Notebook后未自动启动系统的默认浏览器并显示Jupyter Notebook开发界面,则可根据Jupyter Notebook启动界面中的提示,将网址复制并粘贴到浏览器的地址栏中,访问该网址即可显示开发界面。
下面通过上机操作来演示在Jupyter Notebook中编辑并运行Python程序的方法。
1)请读者在自己的计算机上启动Jupyter Notebook,新建一个以自己的姓名命名的文件夹。
2)进入新建文件夹,新建一个名为Chap2的Python 3代码。
3)在第一个代码框中输入print(' 大家好!'),运行程序并查看运行结果。
上机操作1的操作步骤如下:
1)按前面介绍的方法启动Jupyter Notebook,显示如图2-5所示的Jupyter Notebook开发界面。
2)选择右上方的New,在出现的快捷菜单中选择Folder,此时会新建一个名字为“Untitled Folder”的文件夹。
3)单击该文件夹前面的复选框,在左上方出现Rename按钮,单击该按钮后在弹出对话框中输入新的文件夹名称并单击“重命名”按钮即可,如图2-6所示。
图2-6 文件夹重命名
上机操作2的操作步骤为:
1)单击新创建的文件夹名称,进入文件夹。
2)选择右上方的New,在出现的快捷菜单中选择Python 3,弹出一个新的页面,其名称默认为Untitled。
3)单击页面上方Jupyter图标右侧的Untitled,即可弹出重命名对话框,修改代码名称为Chap2并单击“重命名”按钮即可,如图2-7所示。
图2-7 Python 3代码重命名
上机操作3的操作步骤为:
1)在第一个代码框中输入代码:
2)单击上方工具栏中的“运行”按钮(或直接按键盘上的<Shift+Enter>组合键),即可看到运行结果,如图2-8所示。
图2-8 在Jupyter Notebook中输入代码并运行
本节结合缺失值统计和缺失值填充问题,给出若干程序示例,帮助读者复习Python编程的基础知识。关于代码的具体含义可参考程序中的注释。
1.数据的输入
在做具体运算前,需要先输入运算数,代码2-1给出了待进行数据缺失值统计和缺失值填充的数据输入程序示例。首先输入数据条数,然后每行输入三个数据项,使用-9999表示缺失值。
代码2-1 数据输入程序示例
运行程序后,根据提示依次输入数据:
程序运行结束后,可得到下面的结果:
2.函数和类
在数学领域,证明一个定理时通常要借助已有的公理和定理。我们在使用这些已有的公理和定理时,并不需要考虑它们的证明过程,只要清楚它们所表述的含义即可。通过证明得到一个新的定理后,该定理又可以直接应用于其他定理的证明过程中,而不需考虑其本身的证明过程。可见,通过知识体的封装,我们可以在忽略知识证明细节的情况下,直接应用已有知识解决问题。这种方式有效地实现了已有知识的快速复用,从而推动了学科的发展。
程序设计领域也是如此。在利用计算机求解问题时,通常也要先设计和实现若干功能封装体,将这些封装体组合应用,即可得到问题的解。功能封装体不仅可以在一个问题的求解过程中应用,而且可以应用在多个问题的求解过程中。这样的功能封装体具有一次实现、多次重复应用的优点,有效提高了问题求解的效率,这就是程序设计领域中的复用。作为一种面向对象的程序设计语言,Python中的功能封装体以函数和类两种形式实现。例如,对于数据的缺失值统计及缺失值填充,我们可以实现一个数据分析类,在数据类中通过属性成员保存各条数据、通过方法成员(即类中的函数)实现数据的操作和运算。代码2-2给出了代码2-1的类封装形式的实现方法。
代码2-2 代码2-1的类封装形式的实现方法
运行程序后,根据提示依次输入数据:
程序运行结束后,可得到下面的结果:
3.数据的缺失值统计和缺失值填充
对代码2-2中的MyDA类,可以添加missingvalue_stat和missingvalue_fill_mean方法,实现数据的缺失值统计和缺失值填充,如代码2-3所示。
代码2-3 数据缺失值统计和缺失值填充程序示例
运行程序后,根据提示依次输入数据:
程序运行结束后,可得到下面的结果:
除了可以通过定义类和函数实现新的功能封装体外,还可以直接使用Python的内置模块和第三方工具包提供的功能。下面通过一些程序实例展示time、random这两个内置模块和Pandas第三方工具包的应用。
1.利用time模块统计计算时间
在利用计算机求解问题时,我们通常会关心各步骤所消耗的计算时间,此时可以使用Python内置的time模块来实现统计计算时间的功能,如代码2-4所示。
代码2-4 利用time模块计算缺失值统计和缺失值填充的时间
运行程序后,根据提示依次输入数据:
程序运行结束后,可得到下面的结果:
由于运行环境不同,每次运行程序后,输出的数据缺失值统计时间和数据缺失值填充时间并不固定。
2.利用random模块生成大量测试数据
在分析计算所消耗时间时,通常需要统计不同规模的数据情况下的计算时间。单纯依靠人工输入测试数据,难以支撑大规模测试的需求。为了查看大规模数据缺失值统计和数据缺失值填充所消耗的时间,我们引入random模块来自动生成测试数据。另外,为了使测试结果更加稳定,我们重复10次实验,如代码2-5所示。
代码2-5 利用random模块生成缺失值统计和缺失值填充的测试数据
程序运行结束后,可得到下面的结果:
1)与代码2-4相同,由于运行环境不同,每次运行程序后,输出的数据缺失值统计时间和数据缺失值填充时间并不固定。
2)第44~46行代码中,random.randint(m,n)函数的作用是生成[m,n]范围内的随机整数。
3.利用Pandas工具包实现数据缺失值统计和数据缺失值填充
对于一些常用功能,Python的内置模块或第三方工具包通常已提供函数或类,可以直接使用,而且这些Python的内置模块或第三方工具包在实现相应功能时通常会做优化,直接调用这些已有的函数或类会比我们重新实现相应功能具有更高的计算效率。因此,我们在使用Python进行问题求解时,通常先根据要实现的功能选择相应的Python内置模块或第三方工具包直接使用;当已有的工具无法提供需要的功能,或者性能无法满足要求时,我们再考虑自己去实现相应的功能模块。代码2-6对自己实现的计算方法与利用Pandas工具包实现的计算方法进行了计算效率的对比分析。
代码2-6 利用Pandas工具包提升缺失值统计和缺失值填充的计算效率
程序运行结束后,可得到下面的结果:
与代码2-4相同,由于运行环境不同,每次运行程序后,输出的缺失值统计时间和缺失值填充时间并不固定。但从输出结果中可以看到,利用Pandas工具包提供的DataFrame类对象实现缺失值统计和缺失值填充,其效率明显高于自己实现的方法。
拓展学习:Python常用的第三方库及主要功能模块。