提交 88fabc55 编写于 作者: W wizardforcel

2021-03-08 21:30:26

上级 a4cbd9ad
......@@ -536,7 +536,7 @@ HTTP 方法
正如在本书中一次又一次地看到的那样,Pandas是使用 Python 和 Jupyter笔记本进行数据科学不可或缺的一部分。`DataFrame`提供了一种组织和存储带标签数据的方法,但是更重要的是,Pandas 提供了节省时间的方法来转换`DataFrame`中的数据。 我们在本书中看到的示例包括删除重复项,将字典映射到列,在列上应用函数以及填写缺失值。
关于可视化,`DataFrame`提供了用于创建各种 Matplotlib 图的方法,包括`df.plot.barh()``df.plot.hist()`等。 交互式可视化库 Bokeh 以前依靠 Pandas`DataFrame`来获取*高级*图表。 它们的工作方式与 Seaborn 相似,就像我们在上一课前面所看到的那样,其中`DataFrame`与要绘制的特定列一起传递给了绘图函数。 但是,Bokeh 的最新版本已放弃对此行为的支持。 相反,现在可以使用与 Matplotlib 相同的方式创建图,在图中可以将数据存储在简单列表或 NumPy 数组中。 讨论的重点是,`DataFrame`并非完全必要,但对于在可视化之前组织和操作数据仍然非常有帮助。
关于可视化,`DataFrame`提供了用于创建各种 Matplotlib 图的方法,包括`df.plot.barh()``df.plot.hist()`等。 交互式可视化库 Bokeh 以前依靠 Pandas `DataFrame`来获取*高级*图表。 它们的工作方式与 Seaborn 相似,就像我们在上一课前面所看到的那样,其中`DataFrame`与要绘制的特定列一起传递给了绘图函数。 但是,Bokeh 的最新版本已放弃对此行为的支持。 相反,现在可以使用与 Matplotlib 相同的方式创建图,在图中可以将数据存储在简单列表或 NumPy 数组中。 讨论的重点是,`DataFrame`并非完全必要,但对于在可视化之前组织和操作数据仍然非常有帮助。
### 建立和合并 Pandas `DataFrame`
......@@ -1004,7 +1004,7 @@ Bokeh 是一个用于 Python 的交互式可视化库。 其目标是提供与 D
我们首先查看 HTTP 请求的工作方式,重点关注 GET 请求及其响应状态代码。 然后,我们进入 Jupyter 笔记本,并使用 Requests 库通过 Python 发出 HTTP 请求。 我们了解了如何使用 Jupyter 以及可与之交互的实际网页在笔记本中呈现 HTML。 发出请求后,我们看到了如何使用 BeautifulSoup 来解析 HTML 中的文本,并使用该库来刮擦表格数据。
抓取两个数据表后,我们将它们存储在 Pandas`DataFrame`中。 第一个表包含每个国家的中央银行利率,第二个表包含人口。 我们将它们组合到一个表中,然后用于创建交互式可视化。
抓取两个数据表后,我们将它们存储在 Pandas `DataFrame`中。 第一个表包含每个国家的中央银行利率,第二个表包含人口。 我们将它们组合到一个表中,然后用于创建交互式可视化。
最后,我们使用 Bokeh 在 Jupyter 中渲染交互式可视化效果。 我们看到了如何使用 Bokeh API 创建各种自定义图,并创建了具有特定交互功能(例如缩放,平移和悬停)的散点图。 在定制方面,我们明确显示了如何为每个数据样本设置点半径和颜色。 此外,当使用 Bokeh 探索被抓取的人口数据时,将工具提示悬停在各个点上时会显示国家名称和相关数据。
......
......@@ -380,7 +380,7 @@ corrMatrix.head()
我现在有了这个奇妙的矩阵,它将为我提供任何两部电影之间的相似度得分。 这有点令人惊奇,对于我们将要做的事情非常有用。 现在,就像前面一样,我们必须处理虚假的结果。 因此,我不想查看基于少量行为信息的关系。
事实证明,Pandas`corr`函数实际上具有一些您可以给它的参数。 一种是您要使用的实际相关性评分方法,所以我要说使用`pearson`相关性。
事实证明,Pandas `corr`函数实际上具有一些您可以给它的参数。 一种是您要使用的实际相关性评分方法,所以我要说使用`pearson`相关性。
```py
corrMatrix = userRatings.corr(method='pearson', min_periods=100)
......
......@@ -466,7 +466,7 @@ import pandas as pd
# Pandas分析
这是一个 GitHub 项目,可以轻松地从 Pandas`DataFrame`创建报告。 该软件包将在交互式 HTML 报告中提供以下措施,该报告用于评估数据科学项目中的手头数据:
这是一个 GitHub 项目,可以轻松地从 Pandas `DataFrame`创建报告。 该软件包将在交互式 HTML 报告中提供以下措施,该报告用于评估数据科学项目中的手头数据:
* **基本知识**,例如类型,唯一值和缺失值
* **分位数统计信息**,例如最小值,Q1,中位数,Q3,最大值,范围和四分位数范围
......
......@@ -116,7 +116,7 @@ In: y = iris['target']
Name: target, dtype: object
```
对象`y`的类型是Pandas系列。 现在,将其视为带有轴标签的一维数组,我们稍后将对其进行深入研究。 现在,我们刚刚了解到,Pandas`Index`类的作用类似于表中各列的字典索引。 请注意,您还可以获得按其索引引用它们的列的列表,如下所示:
对象`y`的类型是Pandas系列。 现在,将其视为带有轴标签的一维数组,我们稍后将对其进行深入研究。 现在,我们刚刚了解到,Pandas `Index`类的作用类似于表中各列的字典索引。 请注意,您还可以获得按其索引引用它们的列的列表,如下所示:
```py
In: X = iris[['sepal_length', 'sepal_width']]
......@@ -139,7 +139,7 @@ In: X = iris[['sepal_length', 'sepal_width']]
然后,以下步骤要求您了解问题的严重程度,因此,您需要了解数据集的大小。 通常,对于每个观察,我们计算一条线,对于每个要素,计算一列。
要获取数据集的维度,只需在 Pandas`DataFrame`或系列上使用属性形状,如以下示例所示:
要获取数据集的维度,只需在 Pandas `DataFrame`或系列上使用属性形状,如以下示例所示:
```py
In: print (X.shape) Out: (150, 2) In: print (y.shape) Out: (150,)
......@@ -745,7 +745,7 @@ In: dataset = pd.read_csv('a_selection_example_1.csv', index_col=0)
In: dataset['val3'][104] Out: 'A'
```
3. 请仔细应用此操作,因为它不是矩阵,因此您可能会想先输入行然后输入列。 请记住,它实际上是一个Pandas `DataFrame``[]`运算符首先在列上工作,然后在结果Pandas`Series`的元素上工作。
3. 请仔细应用此操作,因为它不是矩阵,因此您可能会想先输入行然后输入列。 请记住,它实际上是一个Pandas `DataFrame``[]`运算符首先在列上工作,然后在结果Pandas `Series`的元素上工作。
4. 要具有与前述访问数据的方法类似的功能,可以使用`.loc()`方法,该方法基于标签。 也就是说,它通过索引和列标签起作用:
```py
......@@ -784,7 +784,7 @@ In: dataset.iloc[range(2), [2,1]]
![](img/a0b6c853-52ca-4d9a-a4fd-f2c08a602a2e.png)
在 Pandas`DataFrame`中还有另一种索引方法:`ix`方法通过结合基于标签的索引和位置索引来工作:`dataset.ix[104, 'val3']`。 请注意,`ix`必须猜测您指的是什么。 因此,如果您不想混用标签和位置索引,则绝对首选`loc``iloc`,以便创建更安全有效的方法。 `ix`将在即将发布的Pandas版本中弃用。
在 Pandas `DataFrame`中还有另一种索引方法:`ix`方法通过结合基于标签的索引和位置索引来工作:`dataset.ix[104, 'val3']`。 请注意,`ix`必须猜测您指的是什么。 因此,如果您不想混用标签和位置索引,则绝对首选`loc``iloc`,以便创建更安全有效的方法。 `ix`将在即将发布的Pandas版本中弃用。
# 处理分类和文本数据
......@@ -1295,7 +1295,7 @@ In: # Check if a NumPy array is of the desired numeric type
print (isinstance(Array_2[0],np.number)) Out: False
```
在我们的数据处理过程中,无意中发现了一个字符串类型的数组作为输出,这意味着我们忘记了在前面的步骤中将所有变量都转换为数字变量。 例如,当所有数据都存储在 Pandas`DataFrame`中时。 在上一节中,“处理类别和文本数据”,我们提供了一些简单明了的方式来处理这种情况。
在我们的数据处理过程中,无意中发现了一个字符串类型的数组作为输出,这意味着我们忘记了在前面的步骤中将所有变量都转换为数字变量。 例如,当所有数据都存储在 Pandas `DataFrame`中时。 在上一节中,“处理类别和文本数据”,我们提供了一些简单明了的方式来处理这种情况。
在此之前,让我们完成对如何从列表对象派生数组的概述。 如前所述,列表中对象的类型也影响数组的维数。
......
......@@ -1055,7 +1055,7 @@ In: import os
批量大小通常取决于您的可用内存。 原理是数据块越大越好,因为随着数据样本的大小增加,数据样本将获得更多的数据分布代表。 此外,数据预处理也具有挑战性。 增量学习算法可以很好地处理`[-1, +1]``[0, +1]`范围内的数据(例如,多项式贝叶斯不接受负值)。 但是,要缩放到如此精确的范围,您需要事先知道每个变量的范围。 或者,您必须执行以下操作之一:一次传递所有数据,记录最小值和最大值,或者从第一批数据中导出它们,并修剪超出初始最大值和最小值的以下观察值。
解决此问题的一种更可靠的方法是使用 S归一化,将所有可能值范围限制在 0 到 1 之间。
解决此问题的一种更可靠的方法是使用 Sigmoid归一化,将所有可能值范围限制在 0 到 1 之间。
通过次数可能会成为问题。 实际上,当您多次传递相同的示例时,可以帮助将预测系数收敛到最佳解决方案。 如果您通过太多相同的观察结果,该算法将趋于过度拟合; 也就是说,它将过多地适应重复多次的数据。 一些算法(例如 SGD 系列)对您建议的要学习的示例的顺序也非常敏感。 因此,您必须设置其随机播放选项(`shuffle = True`)或在学习开始之前随机播放文件行,请记住,为提高效率,为学习建议的行顺序应该是随意的。
......
......@@ -5,7 +5,7 @@
在本章中,您将学习如何执行以下操作:
* 使用`matplotlib`程序包中的基本`pyplot`功能
* 利用 Pandas`DataFrame`进行**探索性数据分析****EDA**
* 利用 Pandas `DataFrame`进行**探索性数据分析****EDA**
* 与 Seaborn 一起创建漂亮的交互式图表
* 可视化我们在第 3 章,“数据管道”和第 4 章,“机器学习”中讨论的
的机器学习和优化过程
......@@ -610,7 +610,7 @@ In: new_palette=sns.color_palette('hls', 10)
Seaborn 不仅使您的图表更加美观,而且在其方面也易于控制。 它还为您提供了用于 EDA 的新工具,可帮助您发现变量之间的分布和关系。
在继续之前,让我们重新加载程序包,并以 Pandas`DataFrame`格式准备好 Iris 和波士顿数据集:
在继续之前,让我们重新加载程序包,并以 Pandas `DataFrame`格式准备好 Iris 和波士顿数据集:
```py
In: import seaborn as sns
......
......@@ -592,7 +592,7 @@ In: print(X_train[0])
1. 嵌入层。 原始词典设置为 25,000 个单词,组成嵌入的单位数(即图层的输出)为 256。
2. LSTM 层。 **LSTM** 代表**长短期记忆**,它是最强大的序列深度模型之一。 得益于其深厚的体系结构,它能够从序列中相距较远的单词中提取信息(因此得名)。 在此示例中,像元数设置为`256`(作为上一层输出尺寸),其中`0.4`的缺失用于正则化。
3. 具有 S活化的致密层。 这就是我们需要的二进制分类器。
3. 具有 Sigmoid活化的致密层。 这就是我们需要的二进制分类器。
这是执行此操作的代码:
......
......@@ -703,7 +703,7 @@ In: df.filter('gender is not null and balance > 0').show()
# 处理丢失的数据
数据预处理的一个常见问题是如何处理丢失的数据。 Spark`DataFrame`与 Pandas`DataFrame`类似,提供了您可以对它们执行的多种操作。 例如,获得仅包含完整行的数据集的最简单选择是丢​​弃包含缺失信息的行。 为此,在 Spark`DataFrame`中,我们首先必须访问`DataFrame``na`属性,然后调用`drop`方法。 结果表将仅包含完整的行:
数据预处理的一个常见问题是如何处理丢失的数据。 Spark`DataFrame`与 Pandas `DataFrame`类似,提供了您可以对它们执行的多种操作。 例如,获得仅包含完整行的数据集的最简单选择是丢​​弃包含缺失信息的行。 为此,在 Spark`DataFrame`中,我们首先必须访问`DataFrame``na`属性,然后调用`drop`方法。 结果表将仅包含完整的行:
```py
In: df.na.drop().show()
......
......@@ -282,7 +282,7 @@ cars = pixiedust.sampleData(1)
使用 PixieDust sampleData API 加载内置数据集
用户还可以传递指向可下载文件的任意 URL。 PixieDust 当前支持 JSON 和 CSV 文件。 在这种情况下,PixieDust 将自动下载文件,将缓存在临时区域中,检测格式,然后根据 Spark 是否在笔记本电脑中可用加载到 Spark 或 Pandas`DataFrame`中。 请注意,即使使用`forcePandas`关键字参数可以使用 Spark,用户也可以强制加载到Pandas中:
用户还可以传递指向可下载文件的任意 URL。 PixieDust 当前支持 JSON 和 CSV 文件。 在这种情况下,PixieDust 将自动下载文件,将缓存在临时区域中,检测格式,然后根据 Spark 是否在笔记本电脑中可用加载到 Spark 或 Pandas `DataFrame`中。 请注意,即使使用`forcePandas `关键字参数可以使用 Spark,用户也可以强制加载到Pandas中:
```py
import pixiedust
......
......@@ -225,7 +225,7 @@ app.run()
## 一个 GitHub 项目跟踪示例应用程序
让我们将到目前为止所学到的应用于实现示例应用程序。 为了解决问题,我们想使用 [GitHub Rest API](https://developer.github.com/v3) 搜索项目并将结果加载到 Pandas`DataFrame`中进行分析。
让我们将到目前为止所学到的应用于实现示例应用程序。 为了解决问题,我们想使用 [GitHub Rest API](https://developer.github.com/v3) 搜索项目并将结果加载到 Pandas `DataFrame`中进行分析。
初始代码显示了欢迎屏幕,其中带有一个简单的输入框以输入 GitHub 查询和一个按钮来提交请求:
......@@ -631,7 +631,7 @@ test.run()
在 PixieApp 中动态创建`DataFrame`
回到我们的`Github Tracking`应用程序,现在让我们将`pd_entity`值应用于从 GitHub Statistics API 加载的`DataFrame`。 我们创建了一个称为`load_commit_activity,`的方法,该方法负责将数据加载到 Pandas`DataFrame`中,并将其与显示图表所需的`pd_options`一起返回:
回到我们的`Github Tracking`应用程序,现在让我们将`pd_entity`值应用于从 GitHub Statistics API 加载的`DataFrame`。 我们创建了一个称为`load_commit_activity,`的方法,该方法负责将数据加载到 Pandas `DataFrame`中,并将其与显示图表所需的`pd_options`一起返回:
```py
from datetime import datetime
......@@ -734,7 +734,7 @@ def do_analyse_type(self, analyse_type):
[您可以在此处找到代码文件](https://github.com/DTAIEB/Thoughtful-Data-Science/blob/master/chapter%203/sampleCode12.py)
路由有一个名为`analyse_type,`的参数,我们将其用作在`analyses`数组中查找`load`函数的键(注意,我再次使用列表推导来快速进行搜索)。 然后,我们调用传递回购所有者和名称的此函数来获取`vis_info` JSON 有效负载,并将 Pandas`DataFrame`存储到名为`pdf`的类变量中。 然后,返回的 HTML 片段将`pdf`用作`pd_entity`值,将`vis_info["chart_options"]`用作`pd_optio` `ns`。 在这里,我使用[`tojson` Jinja2 过滤器](http://jinja.pocoo.org/docs/templates/#list-of-builtin-filters)来确保在生成的 HTML 中正确进行了转义 。 即使已在堆栈上声明了`vis_info`变量,也允许我使用它,因为我为函数使用了`@templateArgs`装饰器。
路由有一个名为`analyse_type,`的参数,我们将其用作在`analyses`数组中查找`load`函数的键(注意,我再次使用列表推导来快速进行搜索)。 然后,我们调用传递回购所有者和名称的此函数来获取`vis_info` JSON 有效负载,并将 Pandas `DataFrame`存储到名为`pdf`的类变量中。 然后,返回的 HTML 片段将`pdf`用作`pd_entity`值,将`vis_info["chart_options"]`用作`pd_optio` `ns`。 在这里,我使用[`tojson` Jinja2 过滤器](http://jinja.pocoo.org/docs/templates/#list-of-builtin-filters)来确保在生成的 HTML 中正确进行了转义 。 即使已在堆栈上声明了`vis_info`变量,也允许我使用它,因为我为函数使用了`@templateArgs`装饰器。
在测试改进的应用程序之前,要做的最后一件事是确保主要的`GitHubTracking` PixieApp 类继承自`RepoAnalysis` PixieApp:
......
......@@ -20,11 +20,11 @@
* 在 Python笔记本中运行 Node.js
# 使用@captureOutput 装饰器集成第三方 Python 库的输出
# 使用`@captureOutput`装饰器集成第三方 Python 库的输出
假设您想在已经使用了一段时间的第三方库中重用 PixieApp,以便执行某些任务,例如,使用 [Scikit-learn 机器学习库计算集群](http://scikit-learn.org)并将其显示为图形。 问题在于大多数时候,您正在调用一个高级方法,该方法不返回数据,而是直接在单元格输出区域上绘制某些内容,例如图表或报表。 从 PixieApp 路由调用此方法将不起作用,因为路由协定是返回将由框架处理的 HTML 片段字符串。 在这种情况下,该方法很可能不返回任何内容,因为它直接将结果写入单元格输出中。 解决方案是在 route 方法中使用`@captureOutput`装饰器(它是 PixieApp 框架的一部分)。
假设您想在已经使用了一段时间的第三方库中重用 PixieApp,以便执行某些任务,例如,使用 [Scikit-learn 机器学习库计算集群](http://scikit-learn.org)并将其显示为图形。 问题在于大多数时候,您正在调用一个高级方法,该方法不返回数据,而是直接在单元格输出区域上绘制某些内容,例如图表或报表。 从 PixieApp 路由调用此方法将不起作用,因为路由协定是返回将由框架处理的 HTML 片段字符串。 在这种情况下,该方法很可能不返回任何内容,因为它直接将结果写入单元格输出中。 解决方案是在路由方法中使用`@captureOutput`装饰器(它是 PixieApp 框架的一部分)。
## 使用@captureOutput 创建词云图像
## 使用`@captureOutput`创建词云图像
为了更好地演示前面描述的`@captureOutput`场景,让我们举一个具体的示例,在该示例中我们要构建一个使用`wordcloud` Python 库的 [PixieApp](https://pypi.python.org/pypi/wordcloud),以根据用户通过网址提供的文本文件生成文字云图片。
......@@ -211,7 +211,7 @@ app.run()
如果您发现自己需要在 PixieApp 中拥有同一组件的多个副本,请询问自己该组件是否需要在类变量中维护其状态。 如果是这种情况,最好使用`pd_app,`,但如果不是,那么也可以使用`pd_widget`
## 使用 pd_widget 创建小部件
## 使用`pd_widget`创建小部件
要创建小部件,可以使用以下步骤:
......@@ -297,7 +297,7 @@ app.run()
![PixieDust support of streaming data](img/00085.jpeg)
StreamingDataAdapter 体系结构
`StreamingDataAdapter`体系结构
在实现`StreamingDataAdapter`的子类时,必须重写基类提供的`doGetNextData()`方法,将重复调用该方法以获取新数据以更新可视化效果。 您还可以选择覆盖`getMetadata()`方法,以将上下文传递给渲染引擎(我们稍后将使用此方法来配置 Mapbox 渲染)。
......@@ -703,7 +703,7 @@ self._addHTMLTemplate('simpleTable.html', custom_arg = "Some value")
![Extending PixieDust visualizations](img/00091.jpeg)
在 Pandas`DataFrame`上运行自定义可视化插件
在 Pandas `DataFrame`上运行自定义可视化插件
如 PixieDust 扩展层架构图所示,您还可以使用**渲染器扩展层**扩展 PixieDust,它比**显示扩展层**更具规范性,但提供了更多功能。 框,例如选项管理和临时数据计算缓存。 从用户界面的角度来看,用户可以使用图表区域右上角的**渲染器**下拉菜单在渲染器之间进行切换。
......@@ -717,7 +717,7 @@ PixieDust 随附了一些内置渲染器,例如 Matplotlib,Seaborn,Bokeh
添加新的渲染器类似于添加显示可视化(使用相同的 API),尽管实际上更简单,因为您只需要构建一个类(无需构建元数据类)即可。 这是您需要遵循的步骤:
1. 创建一个从专门的`BaseChartDisplay class`继承的 Display 类。 实现所需的`doRenderChart()`方法。
1. 创建一个从专门的`BaseChartDisplay class`继承的展示类。 实现所需的`doRenderChart()`方法。
2. 使用`@PixiedustRenderer`装饰器注册`rendererId`(在所有渲染器中必须唯一)和要渲染的图表类型。
请注意,相同的`rendererId`可以用于渲染器中包含的所有图表。 PixieDust 提供了一组核心图表类型:
......@@ -775,7 +775,7 @@ class SimpleDisplayWithRenderer(BaseChartDisplay):
### 注意
同样,在运行代码时,请确保将`cars`数据集作为 Pandas`DataFrame`加载。 如果您已经运行了**简单表**的第一个实现,并且正在重新使用笔记本电脑,则可能仍然会看到旧的**简单表**菜单。 如果是这种情况,您将需要重新启动内核并重试。
同样,在运行代码时,请确保将`cars`数据集作为 Pandas `DataFrame`加载。 如果您已经运行了**简单表**的第一个实现,并且正在重新使用笔记本电脑,则可能仍然会看到旧的**简单表**菜单。 如果是这种情况,您将需要重新启动内核并重试。
以下屏幕快照显示了作为呈现器的简单表格可视化:
......@@ -882,11 +882,11 @@ class SimpleDisplayWithRenderer(BaseChartDisplay):
* `u(p)`:向上移动堆栈帧。
* `<any expression>`:在当前帧的上下文中求值并显示一个表达式。 例如,您可以使用`locals()`获取范围为当前帧的所有局部变量的列表。
如果发生异常并且您未设置自动`pdb`调用,则仍然可以在另一个单元格中使用`%debug` magic 来在事件发生后调用调试器,如以下屏幕截图所示:
如果发生异常并且您未设置自动`pdb`调用,则仍然可以在另一个单元格中使用`%debug`魔术来在事件发生后调用调试器,如以下屏幕截图所示:
![Debugging on the Jupyter Notebook using pdb](img/00095.jpeg)
使用%debug 进行事后调试会话
使用`%debug`进行事后调试会话
与常规 Python 脚本类似,您也可以通过`pdb.set_trace()`方法以编程方式显式设置断点。 但是,建议使用由 IPython 核心模块提供的`set_trace()`增强版本,该版本提供语法着色:
......@@ -903,7 +903,7 @@ class SimpleDisplayWithRenderer(BaseChartDisplay):
* 它是面向命令行的,这意味着必须手动输入命令并将结果顺序附加到单元格输出中,因此在进行高级调试时不切实际
* 它不适用于 PixieApps
PixieDebugger 功能解决了这两个问题。 您可以将其与在 Jupyter笔记本单元中运行的任何 Python 代码一起使用,以直观地调试代码。 要在单元格中调用 PixieDebugger,只需在单元格顶部添加`%%pixie_debugger`单元魔术即可。
PixieDebugger 功能解决了这两个问题。 您可以将其与在 Jupyter笔记本单元中运行的任何 Python 代码一起使用,以直观地调试代码。 要在单元格中调用 PixieDebugger ,只需在单元格顶部添加`%%pixie_debugger`单元魔术即可。
### 注意
......@@ -934,7 +934,7 @@ count_cars('chevrolet')
![Visual debugging with PixieDebugger](img/00097.jpeg)
运行中的 PixieDebugger
运行中的 PixieDebugger
没有参数,`pixie_debugger`单元魔术将在代码中的第一个可执行语句处停止。 但是,您可以使用`-b`开关轻松地将其配置为在特定位置停止,然后是一个断点列表,该断点可以是行号或方法名。
......@@ -963,7 +963,7 @@ count_cars('chevrolet')
![Visual debugging with PixieDebugger](img/00098.jpeg)
具有预定义断点的 PixieDebugger
具有预定义断点的 PixieDebugger
### 注意
......@@ -1194,14 +1194,14 @@ import pixiedust_node
![Run Node.js inside a Python Notebook](img/00104.jpeg)
pixiedust_node 欢迎输出
`pixiedust_node`欢迎输出
导入`pixiedust_node`时,会从 Python 端创建一个 Node 子进程,以及一个特殊线程,该线程读取该子进程的输出并将其传递给 Python 端,以在当前在其中执行的单元格中显示。 笔记本。 此子过程负责启动 **REPL** 会话([*读取-求值-打印-循环**](https://en.wikipedia.org/wiki/Read-eval-print_loop)),它将执行从笔记本发送的所有脚本,并使所有创建的类,函数和变量在所有执行中都可重用。
它还定义了一组旨在与笔记本和 PixieDust `display()` API 交互的功能:
* `print(data)`:输出当前在笔记本计算机中执行的单元格中的数据值。
* `display(data)`:使用从数据转换成的 Pandas`DataFrame`调用 PixieDust `display()` API。 如果数据无法转换为 Pandas `DataFrame`,则默认为`print`方法。
* `display(data)`:使用从数据转换成的 Pandas `DataFrame`调用 PixieDust `display()` API。 如果数据无法转换为 Pandas `DataFrame`,则默认为`print`方法。
* `html(data)`:在笔记本计算机中当前正在执行的单元格中以 HTML 格式显示数据。
* `image(data)`:期望数据是图像的 URL,并将其显示在当前在笔记本计算机中执行的单元格中。
* `help()`:显示所有前述方法的列表。
......@@ -1210,9 +1210,9 @@ pixiedust_node 欢迎输出
* `node.cancel()`:停止 Node.js 子进程中的当前代码执行。
* `node.clear()`:重置 Node.js 会话; 所有现有变量将被删除。
* `npm.install(package)`:安装一个 npm 软件包并使其可用于 Node.js 会话。 该软件包在各个会话之间均保持不变。
* `npm.uninstall(package)`:从系统和当前 Node.js 会话中删除 npm 软件包。
* `npm.list()`:列出当前安装的所有 npm 软件包。
* `npm.install(package)`:安装一个 NPM 软件包并使其可用于 Node.js 会话。 该软件包在各个会话之间均保持不变。
* `npm.uninstall(package)`:从系统和当前 Node.js 会话中删除 NPM 软件包。
* `npm.list()`:列出当前安装的所有 NPM 软件包。
`pixiedust_node`创建一个单元魔术,使您可以运行任意 JavaScript 代码。 只需在单元顶部上使用`%%node`魔术,然后照常运行即可。 然后将在 Node.js 子进程 REPL 会话中执行代码。
......@@ -1272,7 +1272,7 @@ display(df)
![Run Node.js inside a Python Notebook](img/00107.jpeg)
从节点单元创建的数据的 display()选项
从节点单元创建的数据的`display()`选项
我们得到以下结果:
......
......@@ -36,7 +36,7 @@
与往常一样,工作流从数据开始。 在监督学习的情况下,数据将用作示例,因此必须正确标记正确答案。 然后处理输入数据以提取称为**特征**的内在属性,我们可以将其视为代表输入数据的数值。 随后,将这些特征输入构建模型的机器学习算法中。 在典型设置中,原始数据分为训练数据,测试数据和盲数据。 在模型构建阶段,将使用测试数据和盲数据来验证和优化模型,以确保其不会过度拟合训练数据。 当模型参数过于紧随训练数据时会发生过度拟合,从而在使用看不见的数据时导致错误。 当模型产生所需的精度水平时,然后将其部署到生产中,并根据主机应用程序的需要将其用于新数据。
在本节中,我们将通过简化的数据流水线工作流程对机器学习进行非常高级的介绍,仅足以直观地说明如何构建和部署模型。 再一次,如果您是初学者,我强烈推荐在 Coursera 上使用 Andrew Ng 的*机器学习*课程(我仍然会不时地复习)。 在下一节中,我们将介绍称为深度学习的机器学习分支,我们将使用它来构建图像识别样本应用程序。
在本节中,我们将通过简化的数据流水线工作流程对机器学习进行非常高级的介绍,仅足以直观地说明如何构建和部署模型。 再一次,如果您是初学者,我强烈推荐在 Coursera 上使用 Andrew Ng 的《机器学习》课程(我仍然会不时地复习)。 在下一节中,我们将介绍称为深度学习的机器学习分支,我们将使用它来构建图像识别样本应用程序。
# 什么是深度学习?
......@@ -68,7 +68,7 @@
### 注意
**注意**:上式中的偏差表示偏差神经元的权重,它是添加到 x 值为+1 的每一层的额外神经元。 偏向神经元是特殊的,因为它有助于下一层的输入,但它没有连接到上一层。 但是,通常仍然像其他神经元一样学习其重量。 偏向神经元背后的直觉是,它在线性回归方程中提供了常数项 b:
**注意**:上式中的偏差表示偏差神经元的权重,它是添加到 x 值为 +1 的每一层的额外神经元。 偏向神经元是特殊的,因为它有助于下一层的输入,但它没有连接到上一层。 但是,通常仍然像其他神经元一样学习其重量。 偏向神经元背后的直觉是,它在线性回归方程中提供了常数项 b:
![What is deep learning?](img/00116.jpeg)
......@@ -78,11 +78,11 @@
![What is deep learning?](img/00118.jpeg)
下图显示了如何使用 S激活函数根据其输入及其权重来计算神经元输出:
下图显示了如何使用 Sigmoid激活函数根据其输入及其权重来计算神经元输出:
![What is deep learning?](img/00119.jpeg)
使用 S函数计算神经元输出
使用 Sigmoid函数计算神经元输出
其他流行的激活函数包括双曲正切![What is deep learning?](img/00120.jpeg)**整流线性单位****ReLu**):![What is deep learning?](img/00121.jpeg)。 ReLu 在有很多层时效果更好,因为可以激发*神经元的稀疏性*,从而降低噪音并加快学习速度。
......@@ -162,7 +162,7 @@ W1 = tf.Variable(tf.random_uniform([2,2], -eps, eps))
W2 = tf.Variable(tf.random_uniform([2,1], -eps, eps))
```
对于激活函数,我们使用 S函数:
对于激活函数,我们使用 Sigmoid函数:
### 注意
......@@ -206,13 +206,13 @@ with tf.Session() as sess:
在本部分中,我们快速探索了低级 TensorFlow API,以构建学习 XOR 转换的简单神经网络。 在下一节中,我们将探讨在低层 API 之上提供抽象层的高层估计器 API。
## 使用 DNNClassifier 进行简单分类
## 使用`DNNClassifier`进行简单分类
### 注意
[**注意**:本节讨论示例 PixieApp 的源代码。 如果您想继续学习,可以在以下位置下载完整的笔记本电脑](https://github.com/DTAIEB/Thoughtful-Data-Science/blob/master/chapter%206/TensorFlow%20classification.ipynb)
在使用低级 TensorFlow API 使用 Tensor,Graphs 和 Sessions 之前,最好先熟悉`Estimators`软件包中提供的高级 API。 在本节中,我们将构建一个简单的 PixieApp,它将 Pandas `DataFrame`作为输入并使用分类输出训练分类模型。
在使用低级 TensorFlow API 使用张量,图和会话之前,最好先熟悉`Estimators`软件包中提供的高级 API。 在本节中,我们将构建一个简单的 PixieApp,它将 Pandas `DataFrame`作为输入并使用分类输出训练分类模型。
### 注意
......@@ -224,7 +224,7 @@ with tf.Session() as sess:
**注意**:此示例应用程序的某些代码改编自[这个页面](https://github.com/tensorflow/models/tree/master/samples/core/get_started)
在此示例中,我们将使用内置样本数据集#7:Boston Crime 数据,为期两周的样本,但是您可以使用任何其他数据集,只要它具有足够的数据和数字列即可。
在此示例中,我们将使用内置样本数据集 #7:波士顿犯罪数据,为期两周的样本,但是您可以使用任何其他数据集,只要它具有足够的数据和数字列即可。
提醒一下,您可以使用以下代码浏览 PixieDust 内置数据集:
......@@ -276,7 +276,7 @@ display(crimes)
`DNNClassifier`构造函数带有很多可选参数。 在示例应用程序中,我们将仅使用其中的三个,但是我建议您看一下文档中的其他参数:
* `feature_columns``feature_column._FeatureColumn`模型输入的迭代。 在我们的例子中,我们可以使用 Python 理解从 Pandas`DataFrame`的数字列创建一个数组。
* `feature_columns``feature_column._FeatureColumn`模型输入的迭代。 在我们的例子中,我们可以使用 Python 理解从 Pandas `DataFrame`的数字列创建一个数组。
* `hidden_units`:每个单元可迭代的多个隐藏层。 在这里,我们将仅使用两层,每层 10 个节点。
* `n_classes`:标签类别的数量。 我们将预测变量列上的`DataFrame`分组并计算行数来推断此数字。
......@@ -531,7 +531,7 @@ app.run(crimes)
[**注意**:可在此处找到此示例应用程序的完整笔记本](https://github.com/DTAIEB/Thoughtful-Data-Science/blob/master/chapter%206/TensorFlow%20classification.ipynb)
在下一节中,我们将开始使用低级 TensorFlow API(包括 Tensors,Graphs 和 Sessions)来构建图像识别示例应用程序。
在下一节中,我们将开始使用低级 TensorFlow API(包括张量,图和会话)来构建图像识别示例应用程序。
# 图像识别示例应用程序
......@@ -1004,7 +1004,7 @@ app.run()
使用`TemplateTabbedApp`超类的另一个好处是,分别定义了子 PixieApps,这使代码更易于维护和重用。
首先让我们看一下`TensorGraphApp` PixieApp。 它的主要路线返回一个 HTML 片段,该片段将`tf-graph-basic.build.html``https://tensorboard.appspot.com,`加载到 iframe 中,并使用 JavaScript 加载侦听器应用通过`tf.Graph.as_graph_def`方法计算的序列化图定义。 为确保图形定义保持合理的大小,并避免浏览器客户端上不必要的性能下降,我们调用`strip_consts`方法来移除具有大尺寸的恒定值的张量。
首先让我们看一下`TensorGraphApp` PixieApp。 它的主要路线返回一个 HTML 片段,该片段将`tf-graph-basic.build.html``https://tensorboard.appspot.com,`加载到 IFrame 中,并使用 JavaScript 加载侦听器应用通过`tf.Graph.as_graph_def`方法计算的序列化图定义。 为确保图形定义保持合理的大小,并避免浏览器客户端上不必要的性能下降,我们调用`strip_consts`方法来移除具有大尺寸的恒定值的张量。
`TensorGraphApp`的代码如下所示:
......@@ -1121,7 +1121,7 @@ class LabelsApp():
我们首先下载了 2011 年秋季版本中所有图像 URL 的列表,[可在此处下载](http://image-net.org/imagenet_data/urls/imagenet_fall11_urls.tgz),然后将文件解压缩为 您选择的本地目录(例如,我选择`/Users/dtaieb/Downloads/fall11_urls.txt`)。我们还需要下载[上所有`synsets`的 WordNet ID 和单词之间的映射,网址为 http://image-net.org/archive/ words.txt](http://image-net.org/archive/words.txt) ,我们将使用它来查找包含我们需要下载的 URL 的 WordNet ID。
以下代码将两个文件分别加载到 Pandas`DataFrame`中:
以下代码将两个文件分别加载到 Pandas `DataFrame`中:
```py
import pandas
......@@ -1171,7 +1171,7 @@ def get_url_for_keywords(keywords):
按类别分配图像
我们现在可以构建代码,该代码将下载与我们选择的类别列表相对应的图像。 在本例中,我们选择了水果:`["apple", "orange", "pear", "banana"]`。 图像将被下载到 PixieDust 主目录的子目录中(使用`pixiedust.utils`包中的 PixieDust `Environment` helper 类),从而将图像数量限制为`500`以提高速度:
我们现在可以构建代码,该代码将下载与我们选择的类别列表相对应的图像。 在本例中,我们选择了水果:`["apple", "orange", "pear", "banana"]`。 图像将被下载到 PixieDust 主目录的子目录中(使用`pixiedust.utils`包中的 PixieDust `Environment`助手类),从而将图像数量限制为`500`以提高速度:
### 注意
......@@ -1489,7 +1489,7 @@ def do_score_url(self, score_url):
[完整的第四部分笔记本可以在以下位置找到](https://github.com/DTAIEB/Thoughtful-Data-Science/blob/master/chapter%206/Tensorflow%20VR%20Part%204.ipynb)
在本节中,我们讨论了使用 TensorFlow 在 Jupyter笔记本中构建图像识别示例应用程序的增量方法,特别着重于使用 PixieApps 操作算法。 我们首先使用 TensorFlow `DNNClassifier`估算器从 Pandas`DataFrame`构建简单的分类模型。 然后我们分四个部分构建了图像识别示例应用程序的 MVP 版本:
在本节中,我们讨论了使用 TensorFlow 在 Jupyter笔记本中构建图像识别示例应用程序的增量方法,特别着重于使用 PixieApps 操作算法。 我们首先使用 TensorFlow `DNNClassifier`估算器从 Pandas `DataFrame`构建简单的分类模型。 然后我们分四个部分构建了图像识别示例应用程序的 MVP 版本:
1. 我们加载了预训练的 MobileNet 模型
2. 我们为图像识别示例应用程序创建了一个 PixieApp
......
......@@ -465,7 +465,7 @@ array([[ 1, 3, 5, 7],
`quandl`库主要由两个 API 组成:
* `quandl.get(dataset, **kwargs)`: 这将为请求的数据集返回 Pandas`DataFrame`或 NumPy 数组。 `dataset`参数可以是字符串(单个数据集)或字符串列表(多个数据集)。 当`database_code`是数据发布者,而`dataset_code`与资源有关时,每个数据集都遵循语法`database_code/dataset_code`。 (请参阅下面的如何获取所有`database_code``dataset_code`的完整列表)。
* `quandl.get(dataset, **kwargs)`: 这将为请求的数据集返回 Pandas `DataFrame`或 NumPy 数组。 `dataset`参数可以是字符串(单个数据集)或字符串列表(多个数据集)。 当`database_code`是数据发布者,而`dataset_code`与资源有关时,每个数据集都遵循语法`database_code/dataset_code`。 (请参阅下面的如何获取所有`database_code``dataset_code`的完整列表)。
关键字参数使您能够优化查询。 [您可以在 GitHub 上的`quandl`代码中找到受支持参数的完整列表](https://github.com/quandl/quandl-python/blob/master/quandl/get.py)。
......@@ -583,7 +583,7 @@ display(codes)
WIKI 数据库的数据集列表
在本节的其余部分中,我们将加载过去几年中的 Microsoft 股票(股票代码 MSFT)的历史时间序列数据,并开始探索其统计属性。 在下面的代码中,我们将`quandl.get()``WIKI/MSFT`数据集结合使用。 我们添加了一个称为`daily_spread`的列,该列通过调用Pandas`diff()`方法来计算每日收益/损失,该方法返回当前和先前调整后的收盘价之间的差额。 请注意,返回的Pandas `DataFrame`使用日期作为索引,但是 PixieDust 目前不支持通过索引绘制时间序列。 因此,在以下代码中,我们调用`reset_index()``DateTime`索引转换为名为`Date`的新列,其中包含日期信息:
在本节的其余部分中,我们将加载过去几年中的 Microsoft 股票(股票代码 MSFT)的历史时间序列数据,并开始探索其统计属性。 在下面的代码中,我们将`quandl.get()``WIKI/MSFT`数据集结合使用。 我们添加了一个称为`daily_spread`的列,该列通过调用Pandas `diff()`方法来计算每日收益/损失,该方法返回当前和先前调整后的收盘价之间的差额。 请注意,返回的Pandas `DataFrame`使用日期作为索引,但是 PixieDust 目前不支持通过索引绘制时间序列。 因此,在以下代码中,我们调用`reset_index()``DateTime`索引转换为名为`Date`的新列,其中包含日期信息:
```py
msft = quandl.get('WIKI/MSFT')
......@@ -1410,7 +1410,7 @@ with warnings.catch_warnings():
**注意**:我们使用`warnings`包来避免在使用较旧版本的 NumPy 和 Pandas 时可能发生的弃用警告。
在前面的代码中,我们将`train_set['Adj. Close']`用作`ARIMA`构造函数的参数。 由于我们对数据使用序列,因此我们还需要为`dates`参数传递`train_set['Date']`系列。 请注意,如果我们通过带有`DateIndex`索引的 Pandas`DataFrame`来传递,则不必使用`dates`参数。 `ARIMA`构造函数的最后一个参数是`order`参数,它是表示`p``d``q`顺序的三个值的元组, 如本节开头所讨论的。
在前面的代码中,我们将`train_set['Adj. Close']`用作`ARIMA`构造函数的参数。 由于我们对数据使用序列,因此我们还需要为`dates`参数传递`train_set['Date']`系列。 请注意,如果我们通过带有`DateIndex`索引的 Pandas `DataFrame`来传递,则不必使用`dates`参数。 `ARIMA`构造函数的最后一个参数是`order`参数,它是表示`p``d``q`顺序的三个值的元组, 如本节开头所讨论的。
然后,我们调用`fit()`方法,该方法返回将用于预测值的实际 ARIMA 模型。 出于信息目的,我们使用`arima_model.resid.describe()`打印有关模型剩余误差的统计信息。
......
......@@ -259,11 +259,11 @@ import matplotlib.pyplot as plt
* `airlines.csv`:美国航空公司的列表,包括其 IATA 代码。
* `flights.csv`:2015 年发生的航班列表。此数据包括日期,始发和目的地机场,计划和实际时间以及延误。
`flights.csv`文件包含将近 600 万条记录,需要清除这些记录才能删除始发地或目的地机场中所有没有 IATA 三字母代码的航班。 我们还想删除`ELAPSED_TIME`列中值缺失的行。 如果不这样做,则会在将数据加载到图形结构中时引起问题。 另一个问题是数据集包含一些时间列,例如`DEPARTURE_TIME``ARRIVAL_TIME`,并且为了节省空间,这些列仅以`HHMM`格式存储时间,而实际日期存储在`YEAR`中 ],`MONTH``DAY`列。 我们将在本章中进行的一项分析将需要`DEPARTURE_TIME`的完整日期时间,并且由于进行此转换是一项耗时的操作,因此我们现在进行并将其存储在`flights.csv`的处理版本中 我们将存储在 GitHub 上。 此操作使用通过`to_datetime()`函数和`axis=1`调用的Pandas`apply()`方法(指示对每行应用了转换)。
`flights.csv`文件包含将近 600 万条记录,需要清除这些记录才能删除始发地或目的地机场中所有没有 IATA 三字母代码的航班。 我们还想删除`ELAPSED_TIME`列中值缺失的行。 如果不这样做,则会在将数据加载到图形结构中时引起问题。 另一个问题是数据集包含一些时间列,例如`DEPARTURE_TIME``ARRIVAL_TIME`,并且为了节省空间,这些列仅以`HHMM`格式存储时间,而实际日期存储在`YEAR`中 ],`MONTH``DAY`列。 我们将在本章中进行的一项分析将需要`DEPARTURE_TIME`的完整日期时间,并且由于进行此转换是一项耗时的操作,因此我们现在进行并将其存储在`flights.csv`的处理版本中 我们将存储在 GitHub 上。 此操作使用通过`to_datetime()`函数和`axis=1`调用的Pandas `apply()`方法(指示对每行应用了转换)。
另一个问题是我们希望将文件存储在 GitHub 上,但是最大文件大小限制为 100M。因此,为使文件小于 100 M,我们还删除了一些不需要的列 我们尝试构建的分析文件,然后将其压缩,然后再将其存储在 GitHub 上。 当然,另一个好处是`DataFrame`可以使用较小的文件更快地加载。
从 Kaggle 网站下载文件后,我们运行以下代码,该代码首先将 CSV 文件加载到 Pandas`DataFrame`中,删除不需要的行和列,然后将数据写回到文件中:
从 Kaggle 网站下载文件后,我们运行以下代码,该代码首先将 CSV 文件加载到 Pandas `DataFrame`中,删除不需要的行和列,然后将数据写回到文件中:
### 注意
......@@ -371,7 +371,7 @@ edges
按始发地和目的地分组的航班,平均平均飞行时间为 ELAPSED_TIME,并且只有一个索引
要创建有向加权图,我们使用 NetworkX `from_pandas_edgelist()`方法,该方法以 Pandas`DataFrame`作为输入源。 我们还指定了源列和目标列,以及权重列(在我们的示例中为`ELAPSED_TIME`)。 最后,我们告诉 NetworkX 我们想通过使用`create_using`关键字参数来创建有向图,并将`DiGraph`的实例作为值传递。
要创建有向加权图,我们使用 NetworkX `from_pandas_edgelist()`方法,该方法以 Pandas `DataFrame`作为输入源。 我们还指定了源列和目标列,以及权重列(在我们的示例中为`ELAPSED_TIME`)。 最后,我们告诉 NetworkX 我们想通过使用`create_using`关键字参数来创建有向图,并将`DiGraph`的实例作为值传递。
以下代码显示如何调用`from_pandas_edgelist()`方法:
......@@ -484,7 +484,7 @@ print(flight_graph.degree)
[('BMI', 14), ('RDM', 8), ('SBN', 13), ('PNS', 18), ………, ('JAC', 26), ('MEM', 46)]
```
现在,我们想向机场数据框添加`DEGREE`列,其中包含前一个数组中每个机场行的度值。 为此,我们需要创建一个具有两列的新`DataFrame``IATA_CODE``DEGREE`并在`IATA_CODE`上执行Pandas`merge()`操作。
现在,我们想向机场数据框添加`DEGREE`列,其中包含前一个数组中每个机场行的度值。 为此,我们需要创建一个具有两列的新`DataFrame``IATA_CODE``DEGREE`并在`IATA_CODE`上执行Pandas `merge()`操作。
下图说明了合并操作:
......@@ -1190,7 +1190,7 @@ class SearchShortestRouteApp(MapboxBase):
**注意**:为简洁起见,省略了`SearchShortestRouteApp`的其余实现,因为它与第 2 部分完全相同。 要访问该实现,请参阅完整的第 3 部分笔记本。
最后要实现的 PixieApp 类是`AirlinesApp`,它将显示所有延迟图。 与`SearchShortestRouteApp`相似,我们从`parent_pixieapp`选项字典中存储`org_airport``dest_airport`。 我们还计算了中所有航班超出给定`org_airport`的航空公司的元组列表(代码和名称)。 为此,我们在`AIRLINE`列上使用Pandas`groupby()`方法并获取索引值的列表,如以下代码所示:
最后要实现的 PixieApp 类是`AirlinesApp`,它将显示所有延迟图。 与`SearchShortestRouteApp`相似,我们从`parent_pixieapp`选项字典中存储`org_airport``dest_airport`。 我们还计算了中所有航班超出给定`org_airport`的航空公司的元组列表(代码和名称)。 为此,我们在`AIRLINE`列上使用Pandas `groupby()`方法并获取索引值的列表,如以下代码所示:
```py
[[AirlinesApp]]
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册