提交 81d2e9cd 编写于 作者: W wizardforcel

2021-03-08 21:53:52

上级 fabbad5e
......@@ -24,8 +24,8 @@
图主要有两大类:
* **有向图(称为有向图)**:成对关系的顺序很重要,即,从顶点`A`到顶点`B`的边(AB) ]不同于从顶点`B`到顶点`A`的边缘(BA)。
* **无向图**:成对关系的顺序无关紧要,即边(A-B)与边(B-A)相同。
* **有向图(称为有向图)**:成对关系的顺序很重要,即,从顶点`A`到顶点`B`的边(`AB`)不同于从顶点`B`到顶点`A`的边缘(`BA`)。
* **无向图**:成对关系的顺序无关紧要,即边(`A-B`)与边(`B-A`)相同。
下图显示了示例图的表示形式,即无向(边缘没有箭头)和有向(边缘有箭头):
......@@ -35,7 +35,7 @@
主要有两种表示图形的方式:
* **邻接矩阵**:使用 n 矩阵表示 n(我们称其为 A),其中 n 是图形中的顶点数。 使用 1 到 n 个整数对顶点进行索引。 我们用`A[i, j] = 1`来表示顶点 i 和顶点 j 之间存在边,而`A[i, j] = 0`来表示顶点 i 之间不存在边缘。 和顶点 在无向图的情况下,因为顺序无关紧要,所以我们总是有`A[i, j] = A [j, i]`。 然而,在有序关系重要的有向图的情况下,`A[i, j]`可能与`A[j, i]`不同。 以下示例显示了如何在有向和无向的邻接矩阵中表示样本图:
* **邻接矩阵**:使用`n`维矩阵表示图(我们称其为`A`),其中`n`是图形中的顶点数。 使用 1 到`n`个整数对顶点进行索引。 我们用`A[i, j] = 1`来表示顶点`i`和顶点`j`之间存在边,而`A[i, j] = 0`来表示顶点`i`和顶点`j`之间不存在边缘。 在无向图的情况下,因为顺序无关紧要,所以我们总是有`A[i, j] = A [j, i]`。 然而,在有序关系重要的有向图的情况下,`A[i, j]`可能与`A[j, i]`不同。 以下示例显示了如何在有向和无向的邻接矩阵中表示样本图:
![Graph representations](img/00218.jpeg)
......@@ -74,7 +74,7 @@
在 BFS 和 DFS 中查找未探索的顶点的顺序
* **连通组件和强连通组件**:图的连通组件是一组顶点,其中任意两个顶点之间都有路径。 注意,该定义仅指定必须存在路径,这意味着只要存在路径,两个顶点之间就不必具有边。 在有向图的情况下,由于附加的方向约束,连通组件被称为“强连通组件”,这不仅要求任何顶点 A 都应具有通往任何其他顶点 B 的路径,而且 B 也必须具有 通往 A 的道路
* **连通组件和强连通组件**:图的连通组件是一组顶点,其中任意两个顶点之间都有路径。 注意,该定义仅指定必须存在路径,这意味着只要存在路径,两个顶点之间就不必具有边。 在有向图的情况下,由于附加的方向约束,连通组件被称为“强连通组件”,这不仅要求任何顶点 A 都应具有通往任何其他顶点 B 的路径,而且 B 也必须具有通往 A 的路径
下图显示了牢固连通组件或有向图示例:
......@@ -94,7 +94,7 @@
![Graph algorithms](img/00223.jpeg)
(来源:https://en.wikipedia.org/wiki/Centrality#Closeness_centrality
(来源:<https://en.wikipedia.org/wiki/Centrality#Closeness_centrality>
其中`d(y, x)`是节点`x`和`y`之间的边缘长度。
......@@ -102,7 +102,7 @@
![Graph algorithms](img/00224.jpeg)
(来源:https://en.wikipedia.org/wiki/Centrality#Betweenness_centrality
(来源:<https://en.wikipedia.org/wiki/Centrality#Betweenness_centrality>
其中![Graph algorithms](img/00225.jpeg)是从顶点`s`到顶点`t`的最短路径总数,![Graph algorithms](img/00226.jpeg)是通过`v`的![Graph algorithms](img/00227.jpeg)的子集。 。
......@@ -118,7 +118,7 @@
在本节中,我们仅回顾了所有可用的图算法中的一小部分,并且深入探讨将超出本书的范围。 自己实现这些算法将花费大量时间,但是幸运的是,有很多开源库提供了图形算法的相当完整的实现,并且易于使用并将其集成到您的应用程序中。 在本章的其余部分,我们将使用`networkx`开源 Python 库。
# networkx 图形库入门
# NetworkX 图形库入门
在开始之前,如果尚未完成,则需要使用`pip`工具安装`networkx`库。 在自己的单元格中执行以下代码:
......@@ -167,7 +167,7 @@ import networkx as nx
`Graph`类提供了许多用于添加和删除顶点和边的方法。 这是可用方法的子集:
* `add_edge(u_of_edge, v_of_edge, **attr)`:在顶点`u`和顶点`v`之间添加一条边,并带有与该边相关联的可选附加属性。 如果图中尚未存在顶点 u 和 v,则会自动创建它们。
* `add_edge(u_of_edge, v_of_edge, **attr)`:在顶点`u`和顶点`v`之间添加一条边,并带有与该边相关联的可选附加属性。 如果图中尚未存在顶点`u``v`,则会自动创建它们。
* `remove_edge(u, v)`:移除`u``v`之间的边缘。
* `add_node(self, node_for_adding, **attr)`:使用可选的附加属性将节点添加到图形。
* `remove_node(n)`:删除由给定参数`n`标识的节点。
......@@ -178,7 +178,7 @@ import networkx as nx
![Creating a graph](img/00228.jpeg)
使用 networkx 以编程方式创建的示例图
使用 NetworkX 以编程方式创建的示例图
以下代码首先创建一个`DiGraph()`对象,然后使用`add_nodes_from()`方法在一次调用中添加所有节点,然后使用`add_edge()``add_edges_from()`的组合开始添加边线:
......@@ -259,7 +259,7 @@ 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`可以使用较小的文件更快地加载。
......@@ -352,7 +352,7 @@ edges
![Part 1 – Loading the US domestic flight data into a graph](img/00230.jpeg)
按出发地和目的地分组的航班,平均平均飞行时间为 ELAPSED_TIME
按出发地和目的地分组的航班,平均平均飞行时间为`ELAPSED_TIME`
在使用此`DataFrame`创建有向图之前,我们需要将索引从多索引重置为常规单索引,将索引列转换为常规列。 为此,我们仅使用`reset_index()`方法,如下所示:
......@@ -369,7 +369,7 @@ edges
![Part 1 – Loading the US domestic flight data into a graph](img/00231.jpeg)
按始发地和目的地分组的航班,平均平均飞行时间为 ELAPSED_TIME,并且只有一个索引
按始发地和目的地分组的航班,平均平均飞行时间为`ELAPSED_TIME`,并且只有一个索引
要创建有向加权图,我们使用 NetworkX `from_pandas_edgelist()`方法,该方法以 Pandas `DataFrame`作为输入源。 我们还指定了源列和目标列,以及权重列(在我们的示例中为`ELAPSED_TIME`)。 最后,我们告诉 NetworkX 我们想通过使用`create_using`关键字参数来创建有向图,并将`DiGraph`的实例作为值传递。
......@@ -462,7 +462,7 @@ plt.show()
![Part 1 – Loading the US domestic flight data into a graph](img/00233.jpeg)
使用 random_layout 的飞行数据图
使用`random_layout`的飞行数据图
### 注意
......@@ -508,7 +508,7 @@ airports_centrality
![Graph centrality](img/00235.jpeg)
使用 DEGREE 列增强的 Airport `DataFrame`
使用`DEGREE`列增强的机场`DataFrame`
要可视化 Mapbox 地图中的数据,我们只需在`airport_centrality``DataFrame`上使用`PixieDust.display()`
......@@ -589,7 +589,7 @@ airports_centrality
![Graph centrality](img/00238.jpeg)
使用 PAGE_RANK,CLOSENESS 和 BETWEENNESS 值增强的 Airports `DataFrame`
使用`PAGE_RANK``CLOSENESS``BETWEENNESS`值增强的机场 `DataFrame`
作为练习,我们可以验证四个中心指数为顶级机场提供了一致的结果。 使用 Pandas `nlargest()`方法,我们可以获得四个索引的前 10 个机场,如以下代码所示:
......@@ -703,7 +703,7 @@ def compute_weight(centrality_indice_col):
[您可以在此处找到代码文件](https://github.com/DTAIEB/Thoughtful-Data-Science/blob/master/chapter%209/sampleCode16.py)
现在,我们可以为每个中心性索引调用 NetworkX `dijkstra_path()`方法。 请注意,我们不使用 BETWEENNESS,因为某些值等于零,因此不能用作权重。 在调用`dijkstra_path()`方法之前,我们还需要清除缓存,因为使用不同的中心性索引会为每个机场产生不同的值。
现在,我们可以为每个中心性索引调用 NetworkX `dijkstra_path()`方法。 请注意,我们不使用`BETWEENNESS`,因为某些值等于零,因此不能用作权重。 在调用`dijkstra_path()`方法之前,我们还需要清除缓存,因为使用不同的中心性索引会为每个机场产生不同的值。
以下代码显示了如何为每个中心指数计算最短路径:
......@@ -740,7 +740,7 @@ CLOSENESS : ['BOS', 'DEN', 'PSC']
在下一节中,我们将创建`USFlightsAnalysis` PixieApp,以对这些分析进行操作。
# 第 2 部分–创建 USFlightsAnalysis PixieApp
# 第 2 部分–创建`USFlightsAnalysis` PixieApp
对于`USFlightsAnalysis`的第一个迭代,我们想实现一个简单的用户故事,该故事利用第 1 部分中创建的分析:
......@@ -1051,7 +1051,7 @@ def get_airport_location(self, airport_code):
![Part 2 – Creating the USFlightsAnalysis PixieApp](img/00242.jpeg)
使用 ELAPSED_TIME 和 DEGREE 中心指数显示从 BOS 到 PSC 的最短路径
使用`ELAPSED_TIME``DEGREE`中心指数显示从 BOS 到 PSC 的最短路径
在本节中,我们构建了一个 PixieApp,该应用程序使用 PixieDust Mapbox 渲染器提供两个机场之间最短路径的可视化。 我们已经展示了如何使用`MapboxBase`实用工具类创建一个新图层,以在地图上添加更多信息。
......@@ -1061,7 +1061,7 @@ def get_airport_location(self, airport_code):
在下一部分中,我们将添加与航班延误和相关航空公司有关的其他数据探索。
# 第 3 部分–向 USFlightsAnalysis PixieApp 添加数据浏览
# 第 3 部分–向`USFlightsAnalysis` PixieApp 添加数据浏览
在本节中,我们想扩展`USFlightsAnalysis` PixieApp 的航线分析屏幕,以添加两个图表,以显示从所选始发机场起飞的每家航空公司的历史到达延迟:对于所有从始发机场起飞的航班,其中一个 所有航班之一,与机场无关。 这将为我们提供一种在视觉上比较特定机场的延误是好于还是差于其他机场的方法。
......@@ -1111,9 +1111,9 @@ display(bos_delay)
![Part 3 – Adding data exploration to the USFlightsAnalysis PixieApp](img/00245.jpeg)
需要为 PixieApp 复制的延迟图的 PixieDust display()配置
需要为 PixieApp 复制的延迟图的 PixieDust `display()`配置
现在我们知道如何生成延迟图,我们可以开始设计 PixieApp。 我们首先更改主屏幕的布局,以使用`TemplateTabbedApp` helper 类,该类免费提供给我们标签式布局。 整体分析屏幕现在由`RouteAnalysisApp`子 PixieApp 驱动,它包含两个选项卡:与`SearchShortestRouteApp`子 PixieApp 关联的`Search Shortest Route`选项卡和与`AirlinesApp`子 PixieApp 关联的`Explore Airlines`选项卡。
现在我们知道如何生成延迟图,我们可以开始设计 PixieApp。 我们首先更改主屏幕的布局,以使用`TemplateTabbedApp`助手类,该类免费提供给我们标签式布局。 整体分析屏幕现在由`RouteAnalysisApp`子 PixieApp 驱动,它包含两个选项卡:与`SearchShortestRouteApp`子 PixieApp 关联的`Search Shortest Route`选项卡和与`AirlinesApp`子 PixieApp 关联的`Explore Airlines`选项卡。
下图提供了新布局中涉及的所有类的高层流程:
......@@ -1244,7 +1244,7 @@ class AirlinesApp():
`delay_airline_screen()`方法的主体中,我们还计算了`average_delay`局部变量中所选数据的平均延迟。 提醒一下,为了在 Jinja2 模板中使用此变量,我们使用`@templateArgs`装饰器,该装饰器会自动使所有局部变量在 Jinja2 模板中可用。
包含图表的`<div>`元素具有`pd_entity`属性,该属性使用我们在本节开头创建的`compute_delay_airline_df()`方法。 但是,由于参数已更改,因此我们需要将该方法重写为类的成员:`org_airport`现在是类变量,`delay_org_airport`现在是 String Boolean。 我们还添加了`<pd_options>`子元素和 PixieDust `display()` JSON 配置,该配置是从**编辑单元元数据**对话框复制的。
包含图表的`<div>`元素具有`pd_entity`属性,该属性使用我们在本节开头创建的`compute_delay_airline_df()`方法。 但是,由于参数已更改,因此我们需要将该方法重写为类的成员:`org_airport`现在是类变量,`delay_org_airport`现在是字符串布尔值。 我们还添加了`<pd_options>`子元素和 PixieDust `display()` JSON 配置,该配置是从**编辑单元元数据**对话框复制的。
以下代码显示了`delay_airline_screen()`路由的实现:
......@@ -1281,7 +1281,7 @@ class AirlinesApp():
[您可以在此处找到代码文件](https://github.com/DTAIEB/Thoughtful-Data-Science/blob/master/chapter%209/sampleCode32.py)
`compute_delay_airline_df()`方法具有两个参数:对应于 IATA 代码的航空公司和`delay_org_airport` String 布尔值。 我们已经介绍了此方法的实现,但此处提供了新的改编代码:
`compute_delay_airline_df()`方法具有两个参数:对应于 IATA 代码的航空公司和`delay_org_airport`字符串布尔值。 我们已经介绍了此方法的实现,但此处提供了新的改编代码:
```py
[[AirlinesApp]]
......@@ -1345,7 +1345,7 @@ plt.show()
![Part 4 – Creating an ARIMA model for predicting flight delays](img/00248.jpeg)
ARRIVAL_DELAY 数据的自相关函数
`ARRIVAL_DELAY`数据的自相关函数
同样,我们还使用以下代码绘制部分自相关函数:
......@@ -1363,13 +1363,13 @@ plt.show()
![Part 4 – Creating an ARIMA model for predicting flight delays](img/00249.jpeg)
ARRIVAL_DELAY 数据的部分自相关
`ARRIVAL_DELAY`数据的部分自相关
从前面的图表中,我们可以假设数据具有趋势和/或季节性,并且不稳定。 使用我们在第 8 章,“金融时间序列分析和预测”中介绍的对数差异技术,对序列进行转换并使用 PixieDust `display()`方法将其可视化,如 以下代码:
### 注意
**注意**:我们还确保通过先调用`replace()`方法将`np.inf``-np.inf`替换为`np.nan`,然后再调用`dropna()`来删除具有 NA 和 Infinite 值的行。 方法删除具有`np.nan`值的所有行。
**注意**:我们还确保通过先调用`replace()`方法将`np.inf``-np.inf`替换为`np.nan`,然后再调用`dropna()`来删除具有 NA 和无穷大值的行。 方法删除具有`np.nan`值的所有行。
```py
import numpy as np
......@@ -1392,7 +1392,7 @@ display(logdf_diff)
![Part 4 – Creating an ARIMA model for predicting flight delays](img/00250.jpeg)
用于 ARRIVAL_DELAY 数据的日志差异的选项对话框
用于`ARRIVAL_DELAY`数据的日志差异的选项对话框
单击 **OK** 后,我们得到以下结果:
......@@ -1402,7 +1402,7 @@ display(logdf_diff)
![Part 4 – Creating an ARIMA model for predicting flight delays](img/00251.jpeg)
ARRIVAL_DELAY 数据的对数差异折线图
`ARRIVAL_DELAY`数据的对数差异折线图
前面的图表看起来很平稳; 我们可以通过在对数差异上再次绘制 ACF 和 PACF 来加强这一假设,如以下代码所示:
......@@ -1419,7 +1419,7 @@ plt.show()
![Part 4 – Creating an ARIMA model for predicting flight delays](img/00252.jpeg)
ACF 图表以获取 ARRIVAL_DELAY 数据的对数差异
ACF 图表以获取`ARRIVAL_DELAY`数据的对数差异
在以下代码中,我们对 PACF 执行相同的操作:
......@@ -1436,7 +1436,7 @@ plt.show()
![Part 4 – Creating an ARIMA model for predicting flight delays](img/00253.jpeg)
PARI 图表以获取 ARRIVAL_DELAY 数据的对数差异
PARI 图表以获取`ARRIVAL_DELAY`数据的对数差异
作为第 8 章,“金融时间序列分析和预测”的提醒,ARIMA 模型由三个阶组成:`p``d``q`。 从前面的两个图表中,我们可以推断出要构建的 ARIMA 模型的这些顺序:
......
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册