NumPy 和 Pandas 数据分析实用指南:1~6 全!(上)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: NumPy 和 Pandas 数据分析实用指南:1~6 全

原文:Hands-On Data Analysis with NumPy and pandas

协议:CC BY-NC-SA 4.0

译者:飞龙

一、配置 Python 数据分析环境

在本章中,我们将介绍以下主题:

  • 安装 Anaconda
  • 探索 Jupyter 笔记本
  • 探索 Jupyter 的替代品
  • 管理 Anaconda 包
  • 配置数据库

在本章中,我们将讨论如何安装和管理 Anaconda。 Anaconda 是一个包,我们将在本书的以下各章中使用。

什么是 Anaconda?

在本节中,我们将讨论什么是 Anaconda 以及为什么使用它。 我们将提供一个链接,以显示从其赞助商 Continuum Analytics 的网站下载 Anaconda 的位置,并讨论如何安装 Anaconda。 Anaconda 是 Python 和 R 编程语言的开源发行版。

在本书中,我们将专注于 Anaconda 专门用于 Python 的部分。 Anaconda 帮助我们将这些语言用于数据分析应用,包括大规模数据处理,预测分析以及科学和统计计算。 Continuum Analytics 为 Anaconda 提供企业支持,包括可帮助团队协作并提高其系统性能的版本,并提供一种部署使用 Anaconda 开发的模型的方法。 因此,Anaconda 出现在企业环境中,有抱负的分析师应该熟悉它的用法。 Anaconda 附带了本书中使用的许多包,包括 Jupyter,NumPy,pandas 以及其他许多数据分析中常用的包。 仅此一项就可以解释其受欢迎程度。

Anaconda 的安装包括现成的数据分析所需的大部分内容。 Conda 包管理器还可用于下载和安装新包。

为什么要使用 Anaconda? Anaconda 专门为数据分析打包了 Python。 Anaconda 安装中包含了您项目中最重要的包。 除了 Anaconda 提供的一些性能提升,和 Continuum Analytics 对该包的企业支持之外,对于它的流行也不应感到惊讶。

安装 Anaconda

您可以从 Continuum Analytics 网站免费下载 Anaconda。 下载主页面在这里; 否则,很容易找到。 确保选择适合您系统的安装程序。 显然,选择适合您的操作系统的安装程序,但也要注意 Anaconda 具有 32 位和 64 位版本。 64 位版本为 64 位系统提供最佳性能。

Python 社区正处于从 Python 2.7 到 Python 3.6 的缓慢过渡中,这不是完全向后兼容的。 如果您需要使用 Python 2.7,可能是由于遗留代码或尚未更新为与 Python 3.6 兼容的包,请选择 Anaconda 的 Python 2.7 版本。 否则,我们将使用 Python 3.6。

以下屏幕截图来自 Anaconda 网站,分析人员可从该网站下载 Anaconda:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-caS2nj30-1681367023138)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/afb01afe-769c-4084-8aa3-98d8a13b528f.png)]

Anaconda website

如您所见,我们可以选择适用于操作系统(包括 Windows,macOS 和 Linux),处理器和 Python 版本的 Anaconda 安装。 导航到正确的操作系统和处理器,然后在 Python 2.7 和 Python 3.6 之间进行选择。

在这里,我们将使用 Python 3.6。 在 Windows 和 macOS 上进行安装最终等同于使用安装向导,该安装向导通常会为您的系统选择最佳选项,尽管它确实允许某些选项根据您的首选项而有所不同。

Linux 安装必须通过命令行完成,但是对于那些熟悉 Linux 安装的人来说,它应该不会太复杂。 最终,这相当于运行 Bash 脚本。 在本书中,我们将使用 Windows。

探索 Jupyter 笔记本

在本节中,我们将探索 Jupyter 笔记本,这是我们将使用 Python 进行数据分析的主要工具。 我们将看到什么是 Jupyter 笔记本,还将讨论 Markdown,这是我们在 Jupyter 笔记本中用于创建格式化文本的工具。 在 Jupyter 笔记本中,有两种类型的块。 有一些可执行的 Python 代码块,然后是带格式的,人类可读的文本块。

用户执行 Python 代码块,然后将结果直接插入文档中。 除非以同样的方式运行,否则代码块可以以任何顺序重新运行,而不必影响以后的块。 由于 Jupyter 笔记本基于 IPython,因此有一些附加功能,例如魔术命令。

Anaconda 随附 Jupyter 笔记本。 Jupyter 笔记本允许纯文本与代码混合。 可以使用称为 Markdown 的语言格式化纯文本。 它以纯文本格式完成。 我们也可以插入段落。 以下示例是您在 Markdown 中看到的一些常见语法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W10DzIIk-1681367023139)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/91c48200-98ac-44dd-9708-3497a787c687.png)]

以下屏幕截图显示了 Jupyter 笔记本:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-atwwqUD5-1681367023139)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/569e8dbc-0948-41f4-a911-f06b533ed491.png)]

如您所见,它用尽了网络浏览器,例如 Chrome 或 Firefox,在这种情况下为 Chrome。 当我们开始 Jupyter 笔记本时,我们在文件浏览器中。 我们在一个新创建的目录Untitled Folder中。 在 Jupyter 笔记本中,有用于创建新笔记本,文本文件和文件夹的选项。 如前面的屏幕截图所示,当前没有保存笔记本。 我们将需要一个 Python 笔记本,可以通过在以下屏幕快照中显示的“新建”下拉菜单中选择 Python 选项来创建它。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p33vW2Cw-1681367023140)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/c622867b-9917-4cf6-8873-652cb09681be.png)]

笔记本启动后,我们从一个代码块开始。 我们可以将此代码块更改为 Markdown 块,现在可以开始输入文本了。

例如,我们可以输入标题。 我们还可以输入纯文本以及粗体和斜体,如下面的屏幕快照所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TDBcd82q-1681367023140)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/a0e37ac9-6c29-41a6-800a-d54997940fa6.png)]

如您所见,在渲染结束时会有一些提示,但是实际上我们可以通过单击运行单元按钮来查看渲染。 如果要更改此设置,可以双击同一单元格。 现在我们回到纯文本编辑。 在这里我们添加单型,然后再次单击运行单元,如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m9yzKGK2-1681367023141)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/4e012685-36bb-4577-a304-52fc784de693.png)]

在按下Enter时,随后将立即创建一个新单元格。 该单元格是一个 Python 单元格,我们可以在其中输入 Python 代码。 例如,我们可以创建一个变量。 我们多次打印Hello, world!,如以下屏幕截图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MJ7BVP1X-1681367023141)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/949ce51b-9437-41be-9dba-83546b92383d.png)]

要查看执行单元时会发生什么,我们只需单击运行单元; 同样,当我们按Enter时,将创建一个新的单元块。 让我们将此单元格块标记为 Markdown 块。 如果要插入其他单元格,可以按下面的插入单元格。 在第一个单元格中,我们将输入一些代码,在第二个单元格中,我们可以输入依赖于第一个单元格中的代码的代码。 注意当我们尝试在第一个单元格中执行代码之前在第二个单元格中执行代码时会发生什么。 将产生一个错误,如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jqbAfKxG-1681367023141)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/6aafed53-74eb-4362-b24f-4ad744e05df5.png)]

投诉变量trigger尚未定义。 为了使第二个单元正常工作,我们需要运行第一个单元。 然后,当我们运行第二个单元格时,我们将获得预期的输出。 现在假设我们要更改此单元格中的代码。 比方说,我们有trigger = True而不是trigger = False。 第二个单元将不知道该更改。 如果再次运行此单元格,则会得到相同的输出。 因此,我们将需要首先运行此单元格,从而影响更改。 然后我们可以运行第二个单元并获得预期的输出。

后台发生了什么? 发生的事情是有一个内核,它基本上是一个正在运行的 Python 会话,它跟踪我们所有的变量以及到目前为止发生的所有事情。 如果单击内核,则可以看到重新启动内核的选项。 这将基本上重新启动我们的 Python 会话。 我们最初警告说,通过重新启动内核,所有变量都将丢失。

重新启动内核后,似乎没有任何更改,但是如果我们运行第二个单元,则将产生错误,因为变量trigger不存在。 我们将需要首先运行上一个单元,以便该单元正常工作。 相反,如果我们不仅要重启内核,还要重启内核并重新运行所有单元,则需要单击“重启并运行全部”。 重新启动内核后,将重新运行所有单元块。 它可能看起来好像没有发生任何事情,但是我们已经从第一个开始,运行它,运行第二个单元格,然后运行第三个单元格,如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OQHxPkEU-1681367023142)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/2565c2e6-345d-4b1e-a1c2-7d3f5c795ea6.png)]

我们也可以导入库。 例如,我们可以从 Matplotlib 导入模块。 在这种情况下,为了使 Matplotlib 在 Jupyter 笔记本中交互工作,我们将需要使用魔术命令,该魔术命令以%开头,魔术命令的名称以及需要传递给的任何类型的参数。 它。 稍后,我们将在详细信息中介绍这些内容,但首先让我们运行该单元格。plt现在已经加载,现在我们可以使用它了。 例如,在最后一个单元格中,我们将输入以下代码:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n9T3vIrc-1681367023142)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/cd197191-9798-46d6-9448-bed5424046a6.png)]

请注意,此单元格的输出直接插入到文档中。 我们可以立即看到创建的图。 回到魔术命令,这不是我们唯一可用的命令。 让我们看看其他命令:

  • 魔术命令magic将打印有关魔术系统的信息,如以下屏幕截图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PSkfVGvF-1681367023142)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/0f3e2361-f268-4a4c-906f-a07c8abfb37e.png)]

魔术命令的输出

  • 另一个有用的命令是timeit,我们可以使用它来分析代码。 我们首先输入timeit,然后输入我们希望分析的代码,如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DElcfvpL-1681367023143)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/7568717e-d006-4017-9604-acd103872739.png)]

  • 魔术命令pwd可用于查看工作目录是什么,如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f3nzHiDc-1681367023143)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/40e2e58c-e439-408c-9599-ecddba61f8b8.png)]

  • 魔术命令cd可用于更改工作目录,如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x6da9WtG-1681367023143)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/17797748-fa2f-487f-b02c-d0059a261bf1.png)]

  • 如果我们希望以交互模式启动 Matplotlib 和 NumPy,魔术命令pylab很有用,如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SOm8hWxn-1681367023144)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/4c06dc29-3b70-487d-9d98-7e13353944c9.png)]

如果希望查看可用魔术命令的列表,可以键入lsmagic,如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-klhe2fv9-1681367023144)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/e34823c6-6be8-4696-bc06-5e54f9cff9d1.png)]

如果需要快速参考表,可以使用魔术命令quickref,如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KfHw4HMC-1681367023145)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/29c90042-1537-4075-88dd-edec313c9025.png)]

现在,我们已经完成了此笔记本的工作,让我们为其命名。 我们简单地称它为My Notebook。 通过单击编辑器窗格顶部的笔记本名称来完成此操作。 最后,您可以保存,并且保存后可以关闭和停止笔记本电脑。 因此,这将关闭笔记本并停止笔记本的内核。 那是离开笔记本电脑的干净方法。 现在注意,在我们的树中,我们可以看到保存笔记本的目录,并且可以看到该目录中存在笔记本。 它是ipynb文件。

探索 Jupyter 的替代品

现在,我们将考虑替代 Jupyter 笔记本。 我们将看:

  • Jupyter QT 控制台
  • Spider
  • Rodeo
  • Python 解释器
  • ptpython

我们将考虑的第一个替代方案是 Jupyter QT 控制台。 这是一个具有附加功能的 Python 解释器,专门用于数据分析。

以下屏幕截图显示了 Jupyter QT 控制台:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J1WZmLY2-1681367023145)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/43fea253-2b02-483a-8fac-781c98e575b9.png)]

它与 Jupyter 笔记本非常相似。 实际上,它实际上是 Jupyter 笔记本的控制台版本。 注意这里我们有一些有趣的语法。 我们有In [1],然后假设您要键入一个命令,例如:

print ("Hello, world!")

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T1WKXLmD-1681367023145)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/3c7060ef-3bf8-4512-9e27-204df317932e.png)]

我们看到一些输出,然后看到In [2]

现在让我们尝试其他方法:

1 + 1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gT9XIgRV-1681367023145)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/f8fbe4b3-179f-4688-a522-102e7ab26012.png)]

In [2]之后,我们看到Out[2]。 这是什么意思? 这是一种在会话中跟踪历史命令及其输出的方法。 要访问In [42]的命令,我们输入_i42。 因此,在这种情况下,如果要查看命令 2 的输入,请键入i2。 注意,它给我们一个字符串1 + 1。实际上,我们可以运行此字符串。

如果我们输入eval,然后输入_i2,请注意,它给我们提供的输出与原始命令In [2]相同。 现在Out[2]怎么样? 我们如何获取实际输出? 在这种情况下,我们要做的只是_,然后是输出的数量,例如 2。这应该给我们 2。因此,这为您提供了一种更方便的方法来访问历史命令及其输出。

Jupyter 笔记本电脑的另一个优点是您可以看到图像。 例如,让我们运行 Matplotlib。 首先,我们将使用以下命令导入 Matplotlib:

import matplotlib.pyplot as plt

导入 Matplotlib 之后,回想一下我们需要运行某种魔术,即 Matplotlib 魔术:

%matplotlib inline

我们需要给它内联参数,现在我们可以创建一个 Matplotlib 图形。 请注意,该图像显示在命令的正下方。 当我们输入_8时,它表明创建了 Matplotlib 对象,但实际上并未显示图本身。 如您所见,与典型的 Python 控制台相比,我们可以以更高级的方式使用 Jupyter 控制台。 例如,让我们使用名为Iris的数据集; 使用以下行将其导入:

from sklearn.datasets import load_iris

这是用于数据分析的非常常见的数据集。 它通常用作求值训练模型的一种方法。 我们还将在此上使用 k 均值聚类:

from sklearn.cluster import KMeans

load_Iris函数实际上不是Iris数据集; 它是我们可以用来获取Iris数据集的函数。 以下命令实际上将使我们能够访问该数据集:

iris  = load_iris()

现在,我们将在此数据集上训练 K 均值聚类方案:

iris_clusters = KMeans(n_clusters = 3, init =  "random").fit(iris.data)

键入函数时,我们可以立即查看文档。 例如,我知道n_clusters参数的含义。 它实际上是函数中的原始文档字符串。 在这里,我希望聚类的数量为3,因为我知道此数据集中实际上有三个真实聚类。 既然已经训练了聚类方案,我们可以使用以下代码对其进行绘制:

plt.scatter(iris.data[:, 0], iris.data[:, 1], c = iris_clusters.labels_)

Spyder

Spyder 是与 Jupyter 笔记本或 Jupyter QT 控制台不同的 IDE。 它集成了 NumPy,SciPy,Matplotlib 和 IPython。 它可以通过插件扩展,并且包含在 Anaconda 中。

以下屏幕截图显示了 Spyder,这是一个用于数据分析和科学计算的实际 IDE:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L1PjO4MJ-1681367023146)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/ca0a9906-aced-4951-a769-6679c7a0dc9c.png)]

Spyder Python 3.6

在右侧,您可以转到文件资源管理器以搜索要加载的新文件。 在这里,我们要打开iris_kmeans.py。 这是一个文件,其中包含我们之前在 Jupyter QT 控制台中使用的所有命令。 请注意,在右侧,编辑器有一个控制台。 实际上就是 IPython 控制台,您将其视为 Jupyter QT 控制台。 我们可以通过单击 Run 选项卡来运行整个文件。 它将在控制台中运行,如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bl8iBZ2B-1681367023146)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/fae7f8db-2540-43cf-a10f-76474350c5ff.png)]

以下屏幕截图将作为输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kO1PfgP9-1681367023146)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/2dfc4468-a03e-433a-90c6-d698e12b1019.png)]

注意,最后我们看到了之前看到的聚类结果。 我们也可以在命令中以交互方式键入; 例如,我们可以使计算机说Hello, world!

在编辑器中,我们输入一个新变量,例如n = 5。 现在,让我们在编辑器中运行此文件。 请注意,n是编辑器可以识别的变量。 现在让我们进行更改,例如n = 6。 除非我们再次实际运行此文件,否则控制台将不会意识到所做的更改。 因此,如果我再次在控制台中键入n,则没有任何变化,仍然是5。 您需要运行此行才能实际看到更改。

我们还有一个变量浏览器,可以在其中查看变量的值并进行更改。 例如,我可以将n的值从6更改为10,如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tsCv9WIg-1681367023147)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/284f9dfb-6801-4b6a-ae1c-2ed5fd1f09bd.png)]

以下屏幕截图显示了输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mih8Xydy-1681367023147)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/5dd3a7ac-d098-454b-bbf3-45fec9d1dd4a.png)]

然后,当我进入控制台并询问n是什么时,它会说10

n
10

到此结束我们对 Spyder 的讨论。

Rodeo

Rodeo 是 Yhat 开发的 Python IDE,专门用于数据分析应用。 它旨在模拟在 R 用户中很流行的 RStudio IDE,并且可以从 Rodeo 的网站上下载。 基本的 Python 解释器的唯一优点是每个 Python 安装程序都包含它,如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ii5v68YD-1681367023147)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/e63f586b-c60a-49fe-9a52-dee69d209d6c.png)]

ptpython

Jonathan Slenders 设计的ptpython可能是鲜为人知的基于控制台的 Python REPL。 它仅存在于控制台中,并且是他的独立项目。 您可以在 GitHub 上找到它。 它具有轻量级功能,但还包括语法突出显示,自动完成,甚至包括 IPython。 可以使用以下命令进行安装:

pip install ptpython

到此,我们结束了有关 Jupyter 笔记本替代品的讨论。

使用 Conda 进行包管理

现在,我们将与 Conda 讨论包管理。 在本节中,我们将研究以下主题:

  • 什么是 Conda?
  • 管理 Conda 环境
  • 使用 Conda 管理 Python
  • 使用 Conda 管理包

什么是 Conda?

那么什么是 Conda? Conda(Conda)是 Anaconda 的包管理器。 Conda 允许我们创建和管理多个环境,从而允许存在多个版本的 Python,R 及其相关包。 如果您需要使用不同版本的 Python 及其包针对不同的系统进行开发,这将非常有用。 Conda 允许您管理 Python 和 R 版本,并且还简化了包的安装和管理。

Conda 环境管理

Conda 环境允许开发人员在其包中使用和管理不同版本的 Python。 这对于在遗留系统上进行测试和开发很有用。 可以保存,克隆和导出环境,以便其他人可以复制结果。

以下是一些常见的环境管理命令。

对于环境创建:

conda create --name env_name prog1 prog2
conda create --name env_name python=3 prog3

对于列表环境:

conda env list

要验证环境:

conda info --envs

克隆环境:

conda create --name new_env --clone old_env

删除环境:

conda remove --name env_name -all

用户可以通过创建 YAML 文件来共享环境,收件人可以使用该文件来构建相同的环境。 您可以手动执行此操作,在其中可以有效地复制 Anaconda 所做的工作,但是让 Anaconda 为您创建 YAML 文件要容易得多。

创建了这样的文件后,或者如果您从其他用户那里收到了此文件,则创建新环境非常容易。

管理 Python

如前所述,Anaconda 允许您管理多个版本的 Python。 可以搜索并查看哪些版本的 Python 可用于安装。 您可以验证环境中使用的是哪个版本的 Python,甚至可以为 Python 2.7 创建环境。 您还可以更新当前环境中的 Python 版本。

包管理

假设我们对安装包selenium感兴趣,该包用于 Web 抓取和 Web 测试。 我们可以列出当前安装的包,并且可以给出安装新包的命令。

首先,我们应该搜索以查看 Conda 系统是否提供该包。 并非pip上可用的所有包都可从 Conda 获得。 也就是说,实际上可以安装pip提供的包,尽管希望,如果我们希望安装包,可以使用以下命令:

conda install selenium

如果selenium是我们感兴趣的包,则可以从互联网自动下载它,除非您具有 Anaconda 可以直接从您的系统直接安装的文件。

要通过pip安装包,请使用以下命令:

pip install package_name

当然,可以如下删除包:

conda remove selenium

配置数据库

现在,我们将开始讨论设置数据库供您使用。 在本节中,我们将研究以下主题:

  • 安装 MySQL
  • 为 Python 安装 MySQL 连接器
  • 创建,使用和删除数据库

为了使 MySQL 和 Python 一起使用,MySQL 连接器是必需的。 存在许多 SQL 数据库实现,尽管 MySQL 可能不是最简单的数据库管理系统,但它功能齐全,具有工业实力,在现实世界中很常见,而且它是免费和开源的,这意味着它是一个很好的学习工具。 您可以从 MySQL 的网站上获取 MySQL 社区版,它是免费和开源的版本。

安装 MySQL

对于 Linux 系统,如果可能,我建议您使用可用的任何包管理系统安装 MySQL。 如果您使用的是基于 Red-Hat 的发行版,则可以使用 YUM;如果您使用的是基于 Debian 的发行版,则可以使用 APT;或者,请使用 SUSE 的存储库系统。 如果您没有包管理系统,则可能需要从源代码安装 MySQL。

Windows 用户可以直接从其网站安装 MySQL。 您还应该注意,MySQL 包含 32 位和 64 位二进制文件,但是下载的任何程序都可能会为您的系统安装正确的版本。

您可以从以下网页下载适用于 Windows 的 MySQL:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AvsLwQRc-1681367023148)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/ee93dcc6-011a-4394-983e-12b44f1d65e8.png)]

我建议您使用 MySQL 安装程序。 向下滚动,然后在寻找要下载的二进制文件时,请注意,第一个二进制文件表示网络社区。 这将是一个安装程序,可在您进行安装时从互联网上下载 MySQL。 请注意,它比另一个二进制文件小得多。 它基本上包括了您能够安装 MySQL 所需的一切。 如果您继续关注的话,我会建议您下载该文件。

通常有可用的发行版。 这些应该是稳定的。 开发版本旁边是“常规版本”选项卡。 我建议您不要下载这些,除非您知道自己在做什么。

MySQL 连接器

MySQL 的功能类似于系统上的驱动程序,其他应用则与 MySQL 交互,就好像它是驱动程序一样。 因此,您将需要下载一个 MySQL 连接器,以便能够将 MySQL 与 Python 结合使用。 这将允许 Python 与 MySQL 通信。 您最终要做的是将其加载到包中,然后开始与 MySQL 的连接。 可以从 MySQL 的网站下载 Python 连接器。

该网页对于任何操作系统都是通用的,因此您需要选择适当的平台,例如 Linux,OS X 或 Windows。 无论您使用的是 32 位还是 64 位版本,都需要选择并下载与系统架构最匹配的安装程序,以及 Python 版本。 然后,您将使用安装向导以将其安装在系统上。

这是用于下载和安装连接器的页面:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zS4QnBI6-1681367023148)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/2242e5c4-4157-423d-a7d7-37975dd2b76b.png)]

注意,我们可以在这里选择哪个平台合适。 我们甚至有独立于平台的版本和源代码版本。 也可以使用包管理系统进行安装,例如,如果使用的是基于 Debian 的系统,则为 APT;如果使用的是基于 Red-Hat 的系统,则为 Ubuntu 或 YUM,等等。 我们有许多不同的安装程序,因此我们需要知道我们正在使用哪个版本的 Python。 建议您使用与项目中实际使用的版本最接近的版本。 您还需要在 32 位和 64 位之间进行选择。 然后,单击下载并按照安装程序的说明进行操作。

因此,数据库管理是一个主要主题。 涉及数据库管理的所有内容将使我们远远超出本书的范围。 我们不会谈论好的数据库是如何设计的。 我建议您转到另一个资源,也许是另一个解释这些主题的 Packt 产品,因为它们很重要。 关于 SQL,我们只会告诉您基本级别使用 SQL 所需的命令。 也没有关于权限的讨论,因此我们将假设您的数据库对使用它的任何用户都具有完全权限,并且一次只有一个用户。

建立数据库

在 MySQL 命令行中安装 MySQL 之后,我们可以使用以下命令创建数据库,其后为数据库的名称:

create database

每个命令必须以分号结尾; 否则,MySQL 将等到命令实际完成。

您可以使用以下命令查看所有可用的数据库:

show databases

我们可以通过以下命令指定要使用的数据库:

use database_name

如果要删除数据库,可以使用以下命令删除数据库:

drop database database_name

这是 MySQL 命令行:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g8KZHqJy-1681367023148)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/52e30627-c754-4336-a108-f81a6a9d9db6.png)]

让我们练习管理数据库。 我们可以使用以下命令创建数据库:

create database mydb

要查看所有数据库,我们可以使用以下命令:

show databases

这里有多个数据库,其中一些来自其他项目,但是正如您所看到的,我们刚刚创建的数据库mydb显示如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aYEMJxDz-1681367023149)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/4624af19-8534-4869-bcf7-50f7a3c0c526.png)]

如果要使用此数据库,则可以使用命令use mydb。 MySQL 说数据库已更改。 这意味着当我发出诸如创建表,从表中读取或添加新数据之类的命令时,所有这些操作都将由数据库mydb完成。

假设我们要删除数据库mydb; 我们可以使用以下命令进行操作:

drop database mydb

这将删除数据库。

总结

在本章中,向我们介绍了 Anaconda,了解了为什么它是一个有用的起点,然后下载并安装了它。 我们探索了 Jupyter 的一些替代方法,介绍了如何管理 Anaconda 包,还学习了如何设置 MySQL 数据库。 不过,在本书的其余部分中,我们都假定已经安装了 Anaconda。 在下一章中,我们将讨论如何使用 NumPy,它是数据分析中的有用包。 没有这个包,使用 Python 进行数据分析几乎是不可能的。

二、探索 NumPy

到目前为止,您应该已经安装了使用 Python 进行数据分析所需的一切。 现在让我们开始讨论 NumPy,这是用于管理数据和执行计算的重要包。 没有 NumPy,就不会使用 Python 进行任何数据分析,因此了解 NumPy 至关重要。 本章的主要目标是学习使用 NumPy 中提供的工具。

本章将讨论以下主题:

  • NumPy 数据类型
  • 创建数组
  • 切片数组
  • 数学
  • 方法和函数

我们从讨论数据类型开始,这在处理 NumPy 数组时在概念上很重要。 在本章中,我们将讨论由dtype对象控制的 NumPy 数据类型,这是 NumPy 存储和管理数据的方式。 我们还将简要介绍称为ndarray的 NumPy 数组,并讨论它们的作用。

NumPy 数组

现在让我们讨论称为ndarray的 NumPy 数组。 这些不是您在 C 或 C++ 中可能遇到的数组。 更好的模拟是 MATLAB 或 R 中的矩阵。 也就是说,它们的行为类似于数学对象,类似于数学向量,矩阵或张量。 尽管它们可以存储诸如字符串之类的非数学信息,但它们的存在主要是为了管理和简化对数字数据的操作。ndarray在创建时被分配了特定的数据类型或dtype,并且数组中所有当前和将来的数据必须属于该dtype。 它们还具有多个维度,称为

一维ndarray是一行数据; 这将是一个向量。 二维ndarray将是数据的平方,实际上是一个矩阵。 三维ndarray将是关键数据,就像张量一样。 允许任意数量的尺寸,但大多数ndarray都是一维或二维的。

dtype与基本 Python 语言中的类型相似,但 NumPy dtype与其他语言(例如 C,C++ 或 Fortran)中看到的数据类型也很相似,因为它们的长度是固定的。dtype具有层次结构;dtype通常具有字符串描述符,后跟 2 的幂以决定dtype的大小。

以下是常见的dtype列表:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-62B60lYz-1681367023149)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/c9a05b8f-94b1-4c7e-8888-fed3265c6cd5.png)]

让我们看一下我们刚刚讨论过的一些内容。 我们要做的第一件事是在 NumPy 库中加载。 接下来,我们将创建一个 1 的数组,它们将是整数。

这是数组的样子:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V2PvEEYk-1681367023149)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/53e332d4-6601-4803-919f-c1e772c4b24f.png)]

如果我们查看dtype,就会看到它是int8,即 8 位整数。 我们还可以创建一个由 16 位浮点数填充的数组。 该数组看起来类似于整数数组。 1 的末尾有一个圆点; 这有点表明包含的数据是浮点而不是整数。

让我们创建一个填充无符号整数的数组:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XbY6IwCj-1681367023149)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/3e9f87fd-7331-4399-9396-881a8c917e2d.png)]

同样,它们为 1,看起来与我们以前的相似,但现在让我们尝试更改一些数据。 例如,我们可以将数组int_ones中的数字更改为 -1,就可以了。 但是,如果我尝试将其以无符号整数更改为 -1,则最终会得到 255。

让我们创建一个填充字符串的数组:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z6l1gKCK-1681367023149)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/137bc79a-59ee-44a6-a90f-c8503ecfa0a3.png)]

我们此处未指定dtype参数,因为通常会猜测dtype。 通常会做出一个很好的猜测,但是并不能保证。 例如,在这里我想为该数组的内容分配一个新值Waldo。 现在,此dtype表示您的字符串长度不能超过四个。 虽然Waldo有五个字符,所以当我们更改数组并更改其内容时,我们以Wald而不是Waldo结尾。 这是因为它不能超过五个字符。 只需要前四个:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9UkXjMhH-1681367023150)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/9d488485-848b-4c1c-bfaa-6cd76eb8fc72.png)]

我可以手动指定dtype并说允许使用 16 个字符; 在这种情况下,Waldo可以正常工作。

特殊数值

除了dtype对象之外,NumPy 还引入了特殊的数值:naninf。 这些可以在数学计算中出现。 不是数字NaN)。 它表明应为数字的值实际上不是数学定义的。 例如,0/0产生nan。 有时nan也用于表示缺少的信息; 例如,Pandas 就用这个。inf表示任意大的数量,因此在实践中,它表示比计算机可以想象的任何数量大的数量。 还定义了-inf,它的意思是任意小。 如果数字运算爆炸,即迅速增长而没有边界,则可能会发生这种情况。

从未等于nan; 没有定义的事物等于其他事物是没有意义的。 您需要使用 NumPy 函数isnan来识别nan。 尽管==符号不适用于nan,但适用于inf。 就是说,最好还是使用函数有限或inf来区分有限值和无限值。 定义了涉及naninf的算法,但请注意,它可能无法满足您的需求。 定义了一些特殊函数,以帮助避免出现naninf时出现的问题。 例如,nansum 在忽略nan的同时计算可迭代对象的总和。 您可以在 NumPy 文档中找到此类函数的完整列表。 使用它们时,我只会提及它们。

现在让我们来看一个例子:

  1. 首先,我们将创建一个数组,并将其填充为1-10。 然后,将其除以0,然后看看得到了什么。 所以,当我们这样做时,它会抱怨,因为显然我们不应该除以0。 我们在小学学习了!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QJe4lXqC-1681367023150)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/beb7c2f1-67a7-4273-a78e-b0be573c6963.png)]

也就是说,它确实带有数字:1/0inf-1/0-inf0/0不是数字。 那么我们如何检测特殊值呢?

  1. 让我们首先运行一个错误的循环:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1arAbKy3-1681367023150)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/27a62731-2f47-4664-98b7-577852953fa5.png)]

我们将遍历vec2的每个可能值,并打印i == np.infi == -np.inf的结果以及i是否等于nani == np.nan的结果。 我们得到的是一张清单;inf-inf的前两个块很好,但是这个nan不好。 我们希望它检测到nan,但它没有这样做。 因此,让我们尝试使用是nan函数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-27ZNRIE3-1681367023151)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/5a78d47d-efda-4805-89cc-7184f5541f39.png)]

实际上,这确实有效; 我们能够检测到nan

  1. 现在,让我们检测有限与无限:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YoBfkD0o-1681367023151)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/4aafb70e-7107-4da8-a8af-083282dd191a.png)]

毫不奇怪,inf不是有限的。-inf都不是。 但是nan既不是有限的也不是无穷大; 它是未定义的。 让我们看看执行inf + 1inf * -1nan + 1时会发生什么。 我们总是得到nan

如果我们将 2 增大到负无穷大的幂,则得到的是 0。但是,如果将其提高到无穷大,我们将得到无穷大。inf - inf等于NaN而不是任何特定数字:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-33VzMJ1n-1681367023151)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/de302823-d282-46b1-81d2-a1655f52a956.png)]

  1. 现在,让我们创建一个数组并用数字999填充它。 如果我们求这个数组和自身的幂,换言之,计算999999次方,那么最终得到的就是inf

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lSqqXbll-1681367023151)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/d207463c-cb60-4a36-aa60-a938a2aa801a.png)]

对于这些程序来说,这个数字太大了。 也就是说,我们知道这个数字实际上不是无限的。 它是有限的,但是对于计算机而言,它是如此之大,以至于它也可能是无限的。

  1. 现在,让我们创建一个数组,并将该数组的第一个元素指定为nan。 如果我们对这个数组的元素求和,我们得到的是nan,因为nan +都是nan

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SFx9mnYa-1681367023151)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/45324bdd-4926-41d6-aaed-0e6efdb562c7.png)]

但是,如果我们使用函数nansum,则nan将被忽略,我们将获得合理的值 4。

创建 NumPy 数组

现在,我们已经讨论了 NumPy 数据类型,并简要介绍了 NumPy 数组,下面让我们讨论如何创建 NumPy 数组。 在本节中,我们将使用各种函数创建 NumPy 数组。 有一些函数可以创建所谓的空ndarray; 用于创建ndarray的函数,其中填充了 0、1 或随机数; 以及使用数据创建ndarray的函数。 我们将讨论所有这些,以及从磁盘保存和加载 NumPy 数组。 有几种创建数组的方法。 一种方法是使用数组函数,在此我们提供一个可迭代的对象或一个可迭代的对象列表,从中将生成一个数组。

我们将使用列表列表来执行此操作,但是这些列表可以是元组,元组的元组甚至其他数组的列表。 还有一些方法可以自动创建充满数据的数组。 例如,我们可以使用诸如oneszerosrandn之类的函数; 后者填充了随机生成的数据。 这些数组需要传递一个元组,该元组确定数组的形状,即数组具有多少维以及每个维的长度。 每个创建的数组都被认为是空的,不包含任何感兴趣的数据。 这通常是垃圾数据,由创建数组的内存位置中的任何位组成。

我们可以根据需要指定dtype参数,但如果不指定,则可以猜测dtype或浮点数。 请注意下表中的最后一行:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7acyMbHk-1681367023152)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/dd0e5908-9020-4161-93b6-ed15a67f7865.png)]

认为可以通过将arr1分配给新变量来复制它是错误的。 相反,您实际上得到的是指向相同数据的新指针。 如果您想要一个具有完全独立于其父代的相同数据的新数组,则将需要使用copy方法,我们将看到。

创建ndarray

在下面的笔记本中,我们创建一个ndarray。 我们要做的第一件事是创建一个 1 的向量。 注意正在传递的元组; 它仅包含一个数字5。 因此,它将是具有五个元素的一维ndarray

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8JqVi5mq-1681367023152)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/12e69768-3944-4664-b6c5-4458046f4bed.png)]

系统自动为其分配了dtype浮点 64:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-khTbz5OE-1681367023152)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/dcec4e5a-58a1-42ca-ac5e-f2a92e02a5f4.png)]

如果我们想将其转换为整数,我们可以首先尝试通过以下方式进行操作,但结果将是垃圾:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1y1Z3s3l-1681367023152)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/4234f49f-fcc5-4a98-8426-b73ec248839b.png)]

转换dtype时需要非常小心。

正确的方法是首先创建一个由五个 1 组成的原始向量,然后使用这些元素作为输入来创建一个全新的数组。 结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6Z2S2dd7-1681367023153)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/f75db329-ed43-4dbe-9d89-90b70549854e.png)]

注意vec1实际上具有正确的数据类型。 当然,我们可以通过指定我们最初想要的dtype来规避此问题。 在这种情况下,我们需要 8 位整数。 结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gMZlHAHO-1681367023153)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/90db700f-ecc0-4db4-bd7c-9b7429254765.png)]

现在,让我们创建一个 0 的多维数据集。 在这里,我们将创建一个三维数组。 也就是说,我们有行,我们有列,还有楼板。

因此,我们按此顺序有两行,两列和两个平板,我们将把它做成 64 位浮点数。 结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IfJDuD7N-1681367023153)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/c07321a7-79bf-4e42-b28d-951f94c0cdae.png)]

结果的顶部将被视为一个平板,而底部将被视为另一平板。

现在,让我们创建一个填充有随机数据的矩阵。 在这种情况下,我们将使用randn函数创建一个具有三行三列的方阵,该函数是 NumPy 随机模块的一部分:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xCvbjTAu-1681367023153)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/68db44e7-74f3-44b8-8712-ee9926259dcd.png)]

我们传递的第一个数字是行数,第二个数字是列数。 您可以传递第三个数字来确定平板的数量,第四个,第五个等等,以指定所需的维数以及每个维的长度。

现在,我们将创建2 x 2个具有所选名称的矩阵,以及2 x 2 x 2个包含数字的数组。 因此,这是一个仅包含名称的矩阵:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q3TQc2eb-1681367023154)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/bd1788b5-bd18-45d8-bb65-2965bc0332fb.png)]

我们可以看到dtypeU5,即五个字母长的 Unicode 字符串。

我们还可以使用元组来创建数组:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3sF7PJiQ-1681367023154)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/6eea7c99-9d1f-40bd-84a0-0ec0d41772db.png)]

在这种情况下,我们有一个具有多个级别的数组,因此最终将是三维数组。(1, 3, 5)将是此数组的第一个平板的第一行,(2, 4, 6)将是第一个平板的第二行。[(1, 3, 5), (2, 4, 6)]确定第一个平板。[(1, np.nan, 1), (2, 2, 2)]确定第二个平板。 总而言之,我们得到了一个多维数据集:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I5QOwjze-1681367023154)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/360ef440-ccb7-412c-9abe-11852ffb17e5.png)]

如前所述,如果我们希望复制数组的内容,则需要小心。

考虑以下示例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DbQMsxdr-1681367023154)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/9339726a-53dc-4313-a11a-b8900740f8c7.png)]

例如,我们可能天真地认为这将创建mat2的新副本,并将其存储在mat2_copy中。 但是请注意如果我们要更改此数组的假定副本中的条目,或者更改原始父数组的条目会发生什么。 在mat2中,如果我们将第一行和第一列中的元素(即元素(0, 0))更改为liam,则结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FWshjTtA-1681367023154)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/f964c0d8-2438-4651-8682-08e1a95bdd28.png)]

如果查看副本,则会发现更改也影响了副本:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SdQBOT9b-1681367023155)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/dc697d4b-f141-4b98-9ac9-73b6027cd8c8.png)]

因此,如果要独立副本,则需要使用copy方法。 然后,当我们更改mat2的 0,0 元素时,它不会影响copy,方法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BQ2E8HoX-1681367023155)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/fd6ee3d9-59f3-4eb8-8d9d-98b9e7c61c69.png)]

我们还可以对副本进行更改,并且不会影响父级。

以下是保存ndarray对象的常用方法的列表:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3LX1m1uD-1681367023155)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/d8ce83f0-5dbf-4559-9d09-05239a22de01.png)]

建议您使用savesavezsavetxt函数。 我已经在上表中显示了这些函数的通用语法。 在savetxt的情况下,如果要用逗号分隔的文件,只需将定界符参数设置为逗号字符。 另外,如果文件名以.gz结尾,则savetxt可以保存压缩的文本文件,从而节省了步骤,因为您以后无需自己压缩文本文件。 请注意,除非您编写完整的文件路径,否则指定的文件将保存在工作目录中。

让我们看看我们如何能够保存一些数组。 我们可能应该做的第一件事是检查工作目录是什么:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UXvwSieP-1681367023155)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/8040cc7b-15d7-4df0-89f5-afbf450ee59d.png)]

现在,在这种情况下,我将自动进入所需的工作目录中。 但是,如果我愿意,我可以使用cd命令更改工作目录,然后,实际上我会将那个目录作为我的工作目录:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mltBnFC4-1681367023155)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/1cbb6855-4f29-4568-9bc2-f31d2a31f5d2.png)]

就是说,让我们创建一个npy文件,它是 NumPy 的本机文件格式。 我们可以使用 NumPy 的save函数以此文件格式保存数组:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fzIejvI4-1681367023156)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/02387d90-35ec-4ba0-b00e-979069411de2.png)]

我们将拥有一个名为arr1npy文件。 实际上,这是我们工作目录中的一个二进制文件。

如果我们希望加载保存在该文件中的数组,可以使用load函数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PFrHgOoO-1681367023156)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/de072811-9bef-4e59-8ad2-ef193f5fe1c0.png)]

我们还可以创建一个在mat1中包含相同信息的 CSV 文件。 例如,我们可以使用以下函数保存它:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-26k3SyAM-1681367023156)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/432da793-afdb-4fc1-8d9c-c36e0c990774.png)]

我们可以使用以下代码查看mat1.csv的内容:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1uxLVwMI-1681367023156)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/773ca119-da58-47cc-9d5c-e54d348f849e.png)]

列用逗号分隔,行在换行符上。 然后,我们关闭此文件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EJVksRUU-1681367023156)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/92e6a7fc-a97e-4011-ac75-8e2f08d2fe3e.png)]

现在,很明显,如果我们可以保存ndarray,那么我们也应该能够加载它们。 以下是一些用于加载ndarray的常用函数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iSTTumPc-1681367023157)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/b74f654c-d2dd-4144-9fa4-d91ae823639a.png)]

这些函数与用于保存ndarray的函数紧密一致。 您将需要在 Python 中保存生成的ndarray。 如果要从文本文件加载,请注意,不必为创建ndarray而由 NumPy 创建数组。 如果您保存到 CSV,则可以使用文本编辑器或 Excel 创建 NumPy ndarray。 然后,您可以将它们加载到 Python 中。 我假设您正在加载的文件中的数据适合ndarray; 也就是说,它具有正方形格式,并且仅由一种类型的数据组成,因此不包含字符串和数字。

可以通过ndarray处理多类型的数据,但是此时您应该使用 pandas 数据帧,我们将在后面的部分中进行讨论。 因此,如果我想加载刚刚创建的文件的内容,可以使用loadtxt函数进行加载,结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PD9nFLqv-1681367023157)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/f28be513-9207-4b9c-bb2f-79cf5e1e108a.png)]

总结

在本章中,我们首先介绍 NumPy 数据类型。 然后我们迅速讨论了称为ndarray对象,的 NumPy 数组,它们是 NumPy 感兴趣的主要对象。 我们讨论了如何根据程序员的输入,其他 Python 对象,文件甚至函数创建这些数组。 我们继续讨论了如何从基本算术到成熟的线性代数对ndarray对象进行数学运算。

在下一章中,我们将讨论一些重要主题:使用数组对ndarray对象算术和线性代数进行切片,以及采用数组方法和函数。

三、NumPy 数组上的运算

现在,我们知道如何创建 NumPy 数组,我们可以讨论切片 NumPy 数组的重要主题,以便访问和操作数组数据的子集。 在本章中,我们将介绍每个 NumPy 用户应了解的有关数组切片,算术,带有数组的线性代数以及采用数组方法和函数的知识。

显式选择元素

如果您知道如何选择 Python 列表的子集,那么您将了解有关ndarray切片的大部分知识。 与索引对象的元素相对应的被索引数组元素在新数组中返回。 索引编制的最重要方面是要记住存在多个维度,并且索引编制方法应能够处理这些其他维度。

明确选择元素时,请记住以下几点:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XSCIfnWG-1681367023157)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/dd4c8b0f-33bd-41dc-8c0e-d60623965fda.png)]

用逗号分隔不同维度的索引对象; 第一个逗号之前的对象显示了如何索引第一维。 在第一个逗号之后是第二个维度的索引,在第二个逗号之后是第三个维度的索引,依此类推。

用冒号切片数组

使用冒号索引ndarray对象的工作类似于使用冒号索引列表。 只要记住,现在有多个维度。 请记住,当冒号之前或之后的点留为空白时,Python 会将索引视为扩展到维的开始或结束。 可以指定第二个冒号,以指示 Python 跳过每隔一行或反转行的顺序,具体取决于第二个冒号下的数目。

使用冒号对数组进行切片时,需要记住以下几点:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0tHNs6Y0-1681367023157)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/163f227b-8deb-49ee-be42-93a3d410ecc9.png)]

让我们来看一个例子。 首先,我们加载 NumPy 并创建一个数组:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zW0k2NKA-1681367023158)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/af0927e8-301a-42be-9310-3d7474e8d22b.png)]

注意,我们创建的是三维数组。 现在,这个数组有点复杂,所以让我们使用二维3 x 3数组代替 :

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EZvPFrBf-1681367023158)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/4b7191f0-9604-4d41-ade1-a94f825cc394.png)]

我们在这里使用了复制方法。 返回了一个新对象,但是该对象不是数组的新副本; 它是数组内容的视图。 因此,如果我们希望创建一个独立的副本,则在切片时也需要使用copy方法,如我们之前所见。

如果要更改此新数组中的条目,将第二行和第二列的内容设置为Atilla,则可以更改此新数组:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9YdQRWmg-1681367023158)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/a14afb7d-7531-4172-8cf0-16e2a3686a5f.png)]

但是我们没有更改原始内容:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gQHxBvpa-1681367023158)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/8065a920-5926-4da4-b25f-ffa671e97dcb.png)]

因此,这些是第一个数组中数据的两个独立副本。 现在让我们探索其他切片方案。

在这里,我们看到使用列表建立索引。 我们要做的是创建一个列表,该列表与我们要捕获的对象中每个元素的第一个坐标相对应,然后为第二个坐标提供一个列表。 因此 1 和 0 对应于我们希望选择的一个元素; 如果这是三维对象,我们将需要第三个列表作为第三个坐标:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qjx0mPgU-1681367023158)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/dbca1a1b-e7bb-4b0d-98a6-1d18cbf8fc98.png)]

我们使用切片器从左上角选择元素:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aB1G3Wi1-1681367023159)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/40172430-b3d5-42c0-8352-764244934c4f.png)]

现在,让我们从中间一栏中选择元素:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-42iZAZTj-1681367023159)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/4cc32014-9940-41e7-9119-8e39ea17c51b.png)]

并且,让我们从中间列中选择元素,但我们不会展平矩阵,而是保持其形状:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kvDCXSoL-1681367023159)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/0496fafd-12d4-4609-9bd7-00ea5b6e184d.png)]

这是一维对象,但是在这里我们需要一个二维对象。 尽管只有一列,但只有一列和一行,而不是只有一行和一列是没有意义的。 现在让我们选择中间列的最后两行:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1wcCwFBc-1681367023159)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/3b069361-e914-4be8-82ca-5de10e97f5e6.png)]

我们反转行顺序:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iWts4NLb-1681367023160)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/7ac075aa-ffdc-4e40-8122-44975eb2aeab.png)]

如果查看原始对象,则会发现这些规则以相反的顺序发生(与最初的排序方式相比),这意味着选择奇数列:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ZkIxX5l-1681367023160)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/8a40d17d-96b8-4941-9e5a-b021835166e4.png)]

我们可以转到更复杂的三维数组,并查看类似的切片方案。 例如,这是一个2 x 2 x 2的角落立方体:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lCfrjgai-1681367023160)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/71d20c8d-94ee-42a8-bcd0-5873b5436fa9.png)]

这是中间部分:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CcCb29yc-1681367023160)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/c0f97afc-f0ea-4844-a5b2-693f6e425405.png)]

我们可以看到该中间切片是二维数组。 因此,如果我们希望保留维数,那么另一种方法是使用 NumPy 中的新轴对象插入一个额外的维数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wwcqgYOO-1681367023160)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/11ef9cf1-1380-4b4d-b6bb-c7cbda525b09.png)]

我们看到这个对象实际上是三维的:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yetvPXsH-1681367023161)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/b4c482b3-2c3f-484b-9399-54c8d10a3db4.png)]

尽管事实上其中一个维度的长度为 1。

高级索引

现在让我们讨论更高级的索引技术。 我们可以使用其他ndarrayndarray对象建立索引。 我们可以使用包含与我们希望选择的ndarray的索引对应的整数的ndarray对象或布尔值的ndarray对象来切片ndarray对象,其中值true表示切片中应包含一个单元格。

选择不是Waynearr2元素,这是结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R9hcyjwx-1681367023161)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/ac3484b4-148f-429a-8a45-8438a9099552.png)]

Wayne不包括在选择中,这是为执行该索引而生成的数组:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KQWmihXT-1681367023161)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/e8020cee-2b6f-4749-a0fa-0853b8d9ccdf.png)]

除了内容为Wayne的地方,到处都是True

另一种更高级的技术是使用整数数组进行选择,以标识所需的元素。 因此,在这里,我们将创建两个用于切片的数组:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I3XnN999-1681367023161)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/8fad7f33-bca1-4121-8837-9e70331b95a0.png)]

第一个数组中的第一个 0 表示第一个坐标为零,第二个数组中的第一个 0 表示第二个坐标为零,这由这两个数组列出的顺序指定。因此,所得数组的第一行和第一列的元素为[0, 0]。 在第一行和第二列中,我们有原始数组中的元素[0, 2]。 然后,在第二行和第一列中,我们具有原始数组的第三行和第一列中的元素。 注意,这是Wayne

然后,我们有了原始数组的第三行和第三列中的元素,该元素对应于Joey

让我们来看一下更复杂的数组。 例如,我们可以看到arr1以外的所有条目Curtis

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E8bVdrYB-1681367023162)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/3d8e7ad6-8e26-4267-8894-56ecc09bc246.png)]

这是索引数组的样子:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NhdD8Psq-1681367023162)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/8d38cc7c-8b76-406d-82e3-8e995d1cab0e.png)]

在这里,我们看到了一个更为复杂的切片方案:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MKPQdkX6-1681367023162)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/7a8488bc-412e-4246-bda9-96d66bb31cc5.png)]

idx0指示如何选择第一个坐标,idx1指示如何选择第二个坐标,idx2指示如何选择第三个坐标。 在这种情况下,我们在原始数组的每个四分之一元素中选择对象。

因此,我实际上已经编写了一些代码,可以实际演示哪些元素将显示在新数组中,即,原始数组中的坐标对新数组中的元素而言是什么。

例如,我们得到的是一个二维矩阵2 x 2 x 2。如果我们想知道切片对象的第二行,第二列和第一个平板中的内容,则可以使用如下代码 :

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Inpxixgv-1681367023162)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/6775c4bd-a18b-4f5d-82a1-054281393b62.png)]

那是原始数组的元素 2、0、2。

扩展数组

连接函数允许使用屏幕上显示的语法沿公共轴将数组绑定在一起。 该方法要求数组沿未用于绑定的轴具有相似的形状。 结果就是全新的ndarray,这是将数组粘合在一起的产物。 为此,还存在其他类似函数,例如堆叠。 我们不会涵盖所有内容。

假设我们想向arr2添加更多行。 使用以下代码执行此操作:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BqaVXSV9-1681367023162)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/e700972d-12c9-4034-b0d3-306ec2834ddc.png)]

我们创建一个全新的数组。 在这种情况下,我们不需要使用copy方法。 结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DnjdiMQT-1681367023163)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/ff450802-d16c-42d4-93fa-e7185eaa62b5.png)]

我们在此数组中添加了第四行,将新数组与数据(数组中的名称)绑定在一起。 它仍然是一个二维数组。 例如,请参见以下示例中的数组。 您可以清楚地看到这是二维的,但只有一列,而前一个只有一列,这是我们在此新列中添加后的结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O4k3wM69-1681367023163)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/cf51cf02-cb2b-482a-926d-a82c002a1490.png)]

我们将继续对数组进行数学运算。

带数组的算术和线性代数

现在,我们已经了解了如何使用 NumPy 数组创建和访问信息,让我们介绍一下可以对数组执行的一些数值运算。 在本节中,我们将讨论使用 NumPy 数组的算法。 我们还将讨论将 NumPy 数组用于线性代数。

两个形状相等的数组的算术

NumPy 数组的算术总是按组件进行的。 这意味着,如果我们有两个形状相同的矩阵,则通过匹配两个矩阵中的相应分量并将它们相加来完成诸如加法之类的操作。 对于任何算术运算都是如此,无论是加法,减法,乘法,除法,幂,甚至是逻辑运算符。

让我们来看一个例子。 首先,我们创建两个随机数据数组:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4f3ERKvP-1681367023163)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/f96b8cbf-5d45-451d-9f0e-d0c8ddc7ebf9.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CG5MUaWA-1681367023163)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/d298f336-cf3a-4f8c-81d0-5a0652967533.png)]

虽然我用涉及两个数组的算术方式解释了这些想法,但正如我们在此处看到的那样,它可能涉及数组和标量,我们将100添加到arr1中的每个元素中:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KbJP2bcW-1681367023163)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/eea17a05-7c4e-4196-8bb9-374f5efa7ab7.png)]

接下来,我们将arr1中的每个元素除以2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kKYPkMp8-1681367023164)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/4c43d04b-0e78-4aeb-995a-2619bfbddf09.png)]

接下来,将arr1中的每个元素提升为2的幂:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9zuZQuEt-1681367023164)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/daba0abb-a6db-4245-8828-85a0b153641f.png)]

接下来,我们将arr1arr2的内容相乘:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OZ5a9FCK-1681367023164)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/209966df-2b39-418f-8748-460afe369d74.png)]

请注意,arr1arr2的形状相似。 在这里,我们进行了涉及这两个数组的更复杂的计算:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KBqHvncN-1681367023164)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/c0e90f0c-9107-4e67-acac-15aad71e9bd9.png)]

注意,此计算最终产生了infnan

广播

到目前为止,我们已经处理了两个形状相同的数组。 实际上,这不是必需的。 尽管我们不一定要添加两个任意形状的数组,但是在某些情况下,我们可以合理地对不同形状的数组执行算术运算。 从某种意义上说,较小数组中的信息被视为属于相同形状但具有重复值的数组。 让我们看看实际的广播行为。

现在,回想一下数组arr13 x 3 x 3; 也就是说,它具有三行,三列和三个平板。 在这里,我们创建一个对象arr3

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FIjqn3y1-1681367023165)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/3933075d-3add-41e7-ab02-a7ddac1faf9e.png)]

该对象的形状为(1, 1, 3)。 因此,此对象的平板数与arr1相同,但只有一行和一列。 这是可以应用广播的情况; 实际上,这是结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xMHFcfki-1681367023165)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/cc993b4c-c0a0-4b16-bbb7-a5fe7227e792.png)]

我将第 0 列和第 2 列设为 0,将中间列设为 1。因此,结果是我有效地选择了中间列并将其他两列设置为 0。有效地复制了该对象,因此好像我将arr1乘以一个对象一样,其中第一列为 0,第三列为 0,第二列为 1。

现在,让我们看看如果切换此对象的尺寸会发生什么? 因此,现在它具有一列,一个平板和三行:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N5qc7zZo-1681367023165)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/0d30cbca-e184-4779-bc56-f5b2332b3943.png)]

结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4OnglQBs-1681367023165)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/7db3d7e3-45ce-48eb-bf0c-5890de4dee64.png)]

现在,让我们进行另一个换位。 我们将最终将一个具有三个平板的对象相乘,中间的平板由 1 填充。 因此,当我进行乘法运算时,会发生以下情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PwVGm1YD-1681367023166)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/e73ffc17-b8e1-4085-af9b-4e47e4d7e2c6.png)]

线性代数

请注意,NumPy 是为支持线性代数而构建的。 一维 NumPy 数组可以对应于线性代数向量; 矩阵的二维数组; 和 3D,4D 或所有ndarray到张量。 因此,在适当的时候,NumPy 支持线性代数运算,例如数组的矩阵乘积,转置,矩阵求逆等。linalg模块支持大多数 NumPy 线性代数函数。 以下是常用的 NumPy 线性代数函数的列表:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-511shsuv-1681367023166)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/947424be-4f60-4dc5-ab46-b64a30b26289.png)]

其中一些是ndarray方法,其他则在您需要导入的linalg模块中。 因此,我们实际上已经在较早的示例中演示了转置。 注意,我们在这里使用转置来在行和列之间交换。

这是arr4中的转置:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FtYvM3mC-1681367023166)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/f7a9f0cd-719f-4d06-bdda-0b7dc921a6e2.png)]

我说arr4arr3,我们绕着轴切换。 因此,轴 0 仍将是轴 0,但轴 1 将是旧数组的轴 2,而轴 2 将是旧数组的轴 1。

现在,让我们看看其他示例。 让我们看一下重塑的演示。 因此,我们要做的第一件事是创建一个由八个元素组成的数组:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O1HEEIVc-1681367023166)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/fbe3c803-540a-4bd0-8173-4a9a4cccb241.png)]

我们可以重新排列此数组的内容,使其适合其他形状的数组。 现在,需要的是新数组具有与原始数组相同数量的元素。 因此,创建一个2 x 4数组,如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rvAygJWZ-1681367023167)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/9ff57a7c-299e-44f2-9aae-7bfbcba58140.png)]

与原始数组一样,它具有八个元素。 此外,它还创建了一个数组,其中第一行包含原始数组的前四个元素,第二行包含其余元素。 我可以用arr6做类似的操作:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3zlgzn85-1681367023167)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/e54f5721-61e0-4cac-9343-5b3a39c830f6.png)]

您可以通过查看此数组的逻辑方式来猜测。

现在让我们看一些更复杂的线性代数函数。 让我们从 Sklearn 库的数据集模块中加载一个名为load_iris的函数,以便我们可以查看经典的鸢尾花数据集:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sm7cY4pc-1681367023167)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/97bf54b1-56e6-4936-9afa-b1bf10da93a9.png)]

所以以下是iris的转置:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PWizNQCt-1681367023167)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/495b4cb9-950f-4685-ad2e-379f54cb1d08.png)]

复制此数组,如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eVBX5Lkd-1681367023167)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/280c0309-eb08-4c7f-a163-d90d2c923790.png)]

我还想创建一个仅包含鸢尾花副本最后一列的新数组,并创建另一个包含其余列和全为 1 的列的数组。

现在,我们将创建一个与矩阵乘积相对应的新数组。 所以我说X平方是X转置并乘以X,这就是结果数组:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FuA4E79z-1681367023168)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/bf272c7e-734d-4e2c-8f2c-1d1e5d90038e.png)]

它是4 x 4。现在让我们得到一个逆矩阵X的平方。

这将是矩阵逆:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eninuexf-1681367023168)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/0f98403f-4fa3-4fba-aec1-c893f18addc5.png)]

然后,我取这个逆,然后将其乘以X的转置乘积与矩阵Y的乘积,矩阵Y是我之前创建的那个单列矩阵。 结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QTgvZTwt-1681367023168)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/793b3b23-eb4d-41b2-92a3-241e2ee05250.png)]

这不是任意的计算顺序; 它实际上对应于我们求解线性模型系数的方式。 原始矩阵y = iris_cp[:, 3]对应于我们要使用X的内容预测的变量的值; 但是现在,我只想演示一些线性代数。 当遇到的函数时,您现在就知道自己编写此函数所需的所有代码。

我们在数据分析中经常要做的另一件事是找到矩阵的 SVD 分解,并且在此线性代数函数中提供了 SVD 分解:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iWNYtauG-1681367023168)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/c1c9b11f-b590-4921-96da-160a30dde065.png)]

因此,最后一行对应于奇异值。 奇异值分解SVD),输出中的值是矩阵的奇异值。 以下是左奇异向量:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zmi26AAJ-1681367023169)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/1a2c9e30-0d14-47a5-9583-c2d5824e7245.png)]

这些是正确的奇异向量:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MCbEWu7r-1681367023169)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/5d2aa92e-60d1-4e7f-89aa-f1a01dd3bb56.png)]

使用数组方法和函数

现在,我们将讨论 NumPy 数组方法和函数的使用。 在本节中,我们将研究常见的ndarray函数和方法。 这些函数使您可以使用简洁,直观的语法执行常规任务,而不仅仅是 Python 代码的概念。

数组方法

NumPy ndarray函数包含一些有助于完成常见任务的方法,例如查找数据集的均值或多个数据集的多个均值。 我们可以对数组的行和列进行排序,找到数学和统计量,等等。 有很多函数可以完成很多事情! 我不会全部列出。 在下面,我们看到了常见管理任务所需的函数,例如将数组解释为列表或对数组内容进行排序:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TmgqymHl-1681367023169)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/fcedd7e4-37bf-4748-811c-80ffbfad1457.png)]

接下来,我们将看到常见的统计和数学方法,例如查找数组内容的均值或总和:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ICBtBPf4-1681367023169)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/8621ecc1-012a-4343-9ec6-033da0ba19f1.png)]

我们还有一些用于布尔值数组的方法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GzvZD7HG-1681367023169)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/568c19b3-e306-4a48-b0f2-5cc093b6422f.png)]

让我们在笔记本中查看其中一些。 导入 NumPy 并创建一个随机值数组:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n9SnxBT7-1681367023170)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/af29b35f-17ce-4ac2-980c-159215be2517.png)]

让我们看看我们可以在此数组上执行的一些操作。 我们可以做的一件事是将数组强制为列表:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TpUNd304-1681367023170)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/ba2fae42-8863-4c5c-a04b-580ad14dc931.png)]

我们可以将数组展平,使其从4 x 4数组变为一维数组,如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SQ3wIMAa-1681367023170)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/90aef03f-ec71-4f3d-80e8-2f9953006162.png)]

我们还可以使用fill方法填充一个空数组。 在这里,我创建了一个用于字符串的空数组,并用字符串Carlos填充了它:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GytVQzLI-1681367023171)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/8ed9442b-16e1-4ccc-a42a-888d6d544fa7.png)]

我们可以取一个数组的内容并将它们加在一起:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PJFjbl3q-1681367023171)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/02492999-327d-4bdf-8971-8cb6b456c737.png)]

它们也可以沿轴求和。 接下来,我们沿行求和:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k8IMqaFW-1681367023171)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/0c5848ce-1041-4e75-86cd-ce2ff4feb9b1.png)]

在下面的内容中,我们沿列进行求和:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nEw9gZHP-1681367023171)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/05fda044-ecdf-4c1f-bfd4-a72be99ecdee.png)]

累积总和允许您执行以下操作,而不是对行的全部内容求和:

  • 对第一行求和
  • 然后将第一行和第二行相加
  • 然后第一,第二和第三行
  • 然后是第一第二,第三和第四行,依此类推

接下来可以看到:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qr5JMLDh-1681367023172)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/fefb42e0-e214-456a-b32a-74909478cd87.png)]

ufuncs的向量化

ufunc是专门用于数组的 NumPy 函数; 特别地,它们支持向量化。 向量化函数按组件方式应用于数组的元素。 这些通常是高度优化的函数,可以在较快的语言(例如 C)的后台运行。

在下面,我们看到一些常见的ufuncs,其中许多是数学上的:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-42jN8lfm-1681367023172)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/b61a65a6-9cb0-4d42-9085-38c799153d16.png)]

让我们来探讨ufuncs的一些应用。 我们要做的第一件事是找到arr1中每个元素的符号,即它是正,负还是零:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OBag2gCp-1681367023172)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/d2558b96-aa64-4e4a-83b0-7e9496a9dfdb.png)]

然后用这个符号,将该数组乘以arr1。 结果就好像我们取了arr1的绝对值:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NGhFAkBc-1681367023172)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/a9d4550c-b604-48c2-80d9-19b345d12f63.png)]

现在,我们找到产品内容的平方根。 由于每个元素都是非负的,因此平方根是明确定义的:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UNB1uqU4-1681367023172)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/ca953354-cd40-4edc-b718-2a94f81f88b8.png)]

自定义函数

如前所述,我们可以创建自己的ufuncs。 创建ufuncs的一种方法是使用现有的ufuncs,向量化操作,数组方法等(即 Numpy 的所有现有基础结构)来创建一个函数,该函数逐个组件地生成我们想要的结果。 假设由于某些原因我们不想这样做。 如果我们有一个现有的 Python 函数,而只想对该函数进行向量化处理,以便将其应用于ndarray组件,则可以使用 NumPy 的vectorize函数创建该函数的新向量化版本。 vectorize将函数作为输入,并将函数的向量化版本作为输出。

如果您不关心速度,可以使用vectorize,但是vectorize创建的函数不一定很快。 实际上,前一种方法(使用 NumPy 的现有函数和基础结构来创建您的向量化函数)可将ufuncs的生成速度提高许多倍。

我们要做的第一件事是定义一个适用于单个标量值的函数。 它的作用是截断,因此如果一个数字小于零,则该数字将替换为零:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PKWhjoQF-1681367023173)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/3ff39dbc-d824-4de3-8b8b-faf4e2a98576.png)]

此函数未向量化; 让我们尝试将此函数应用于矩阵arr1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z81ACqcn-1681367023173)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/04f9f215-dec1-4240-abf7-8eb57454d11e.png)]

然后,我们希望该矩阵中每个错误的数量都改为零。 但是,当我们尝试应用此函数时,它根本不起作用:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zVr484ot-1681367023173)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/6cc5d3ea-e108-4b80-84b6-60cc1a24d15f.png)]

我们需要做的是创建一个ufunc,其函数与原始函数相同。 因此,我们使用 vectorize 并可以创建可以按预期工作的向量化版本,但效率不高:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y9et8uBh-1681367023173)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/bcddac11-fa34-4ee4-b31b-c01e539951bc.png)]

我们可以通过创建一个使用 NumPy 的现有基础架构的更快版本来看到这一点,例如基于布尔值的索引,并将值分配为零。 这是结果ufunc

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1D8uxX7F-1681367023174)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/380190d1-54f2-4971-8bef-0e5f9196d14b.png)]

让我们比较这两个函数的速度。 以下是使用vectorize创建的向量化版本:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UKmpgEdK-1681367023174)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/a4a3a475-cc94-4a82-88c4-06b7329e39c1.png)]

接下来是手动创建的一个:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zdu21qb5-1681367023174)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/359ff8e0-9562-4334-a16a-10c1e7f6a1d1.png)]

请注意,第一个函数比手动创建的第二个函数要慢得多。 实际上,它慢了将近 10 倍。

总结

在本章中,我们从显式选择数组中的元素开始。 我们研究了高级索引编制和扩展数组。 我们还用数组介绍了一些算术和线性代数。 我们讨论了使用数组方法和函数以及ufuncs的向量化。 在下一章中,我们将开始学习另一个有影响力的包,称为 Pandas

一切顺利!


NumPy 和 Pandas 数据分析实用指南:1~6 全(下)https://developer.aliyun.com/article/1426751

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
22天前
|
数据采集 存储 数据挖掘
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第27天】在数据分析领域,Python的Pandas库因其强大的数据处理能力而备受青睐。本文介绍了Pandas在数据导入、清洗、转换、聚合、时间序列分析和数据合并等方面的高效技巧,帮助数据分析师快速处理复杂数据集,提高工作效率。
53 0
|
15天前
|
数据处理 Python
在数据科学领域,Pandas和NumPy是每位数据科学家和分析师的必备工具
在数据科学领域,Pandas和NumPy是每位数据科学家和分析师的必备工具。本文通过问题解答形式,深入探讨Pandas与NumPy的高级操作技巧,如复杂数据筛选、分组聚合、数组优化及协同工作,结合实战演练,助你提升数据处理能力和工作效率。
36 5
|
17天前
|
机器学习/深度学习 数据采集 数据挖掘
解锁 Python 数据分析新境界:Pandas 与 NumPy 高级技巧深度剖析
Pandas 和 NumPy 是 Python 中不可或缺的数据处理和分析工具。本文通过实际案例深入剖析了 Pandas 的数据清洗、NumPy 的数组运算、结合两者进行数据分析和特征工程,以及 Pandas 的时间序列处理功能。这些高级技巧能够帮助我们更高效、准确地处理和分析数据,为决策提供支持。
35 2
|
18天前
|
存储 数据采集 数据处理
效率与精准并重:掌握Pandas与NumPy高级特性,赋能数据科学项目
在数据科学领域,Pandas和NumPy是Python生态中处理数据的核心库。Pandas以其强大的DataFrame和Series结构,提供灵活的数据操作能力,特别适合数据的标签化和结构化处理。NumPy则以其高效的ndarray结构,支持快速的数值计算和线性代数运算。掌握两者的高级特性,如Pandas的groupby()和pivot_table(),以及NumPy的广播和向量化运算,能够显著提升数据处理速度和分析精度,为项目成功奠定基础。
26 2
|
24天前
|
数据采集 数据可视化 数据处理
如何使用Python实现一个交易策略。主要步骤包括:导入所需库(如`pandas`、`numpy`、`matplotlib`)
本文介绍了如何使用Python实现一个交易策略。主要步骤包括:导入所需库(如`pandas`、`numpy`、`matplotlib`),加载历史数据,计算均线和其他技术指标,实现交易逻辑,记录和可视化交易结果。示例代码展示了如何根据均线交叉和价格条件进行开仓、止损和止盈操作。实际应用时需注意数据质量、交易成本和风险管理。
48 5
|
23天前
|
存储 数据挖掘 数据处理
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第26天】Python 是数据分析领域的热门语言,Pandas 库以其高效的数据处理功能成为数据科学家的利器。本文介绍 Pandas 在数据读取、筛选、分组、转换和合并等方面的高效技巧,并通过示例代码展示其实际应用。
31 2
|
14天前
|
并行计算 数据挖掘 大数据
Python数据分析实战:利用Pandas处理大数据集
Python数据分析实战:利用Pandas处理大数据集
|
14天前
|
数据采集 数据可视化 数据挖掘
利用Python进行数据分析:Pandas库实战指南
利用Python进行数据分析:Pandas库实战指南
|
1月前
|
机器学习/深度学习 数据采集 算法
探索Python科学计算的边界:NumPy、Pandas与SciPy在大规模数据分析中的高级应用
【10月更文挑战第5天】随着数据科学和机器学习领域的快速发展,处理大规模数据集的能力变得至关重要。Python凭借其强大的生态系统,尤其是NumPy、Pandas和SciPy等库的支持,在这个领域占据了重要地位。本文将深入探讨这些库如何帮助科学家和工程师高效地进行数据分析,并通过实际案例来展示它们的一些高级应用。
54 0
探索Python科学计算的边界:NumPy、Pandas与SciPy在大规模数据分析中的高级应用
|
1月前
|
数据挖掘 索引 Python
Python数据分析篇--NumPy--进阶
Python数据分析篇--NumPy--进阶
18 0
下一篇
无影云桌面