提交 b84e715a 编写于 作者: W wizardforcel

2021-03-10 23:08:50

上级 4d3cfc67
......@@ -523,7 +523,7 @@ HTTP 方法有很多类型,例如 GET,HEAD,POST 和 PUT。 前两个用于
在本主题中,我们将讨论并演示如何使用 Bokeh 在 Jupyter 中构建交互式可视化。 但是,在此之前,我们将简要回顾 Pandas `DataFrame`,它们在使用 Python 进行数据可视化中起着重要作用。
## 子主题 A:构建用于存储和组织数据的数据
## 子主题 A:构建用于存储和组织数据的数据
正如在本书中一次又一次地看到的那样,Pandas是使用 Python 和 Jupyter笔记本进行数据科学不可或缺的一部分。`DataFrame`提供了一种组织和存储带标签数据的方法,但是更重要的是,Pandas 提供了节省时间的方法来转换`DataFrame`中的数据。 我们在本书中看到的示例包括删除重复项,将字典映射到列,在列上应用函数以及填写缺失值。
......@@ -645,7 +645,7 @@ HTTP 方法有很多类型,例如 GET,HEAD,POST 和 PUT。 前两个用于
要将数字列转换为浮点数,在这种情况下,我们必须首先对字符串进行一些修改。 我们使用字符串方法从总体中去除了所有逗号,并从“年度更改”列中删除了百分号。
现在,我们将在每行的国家/地区名称上合并数据。 请记住,这些仍然是从网络上抓取的原始国家/地区名称,因此匹配字符串可能涉及一些工作。
现在,我们将在每行的国家/地区名称上合并数据。 请记住,这些仍然是从网络上抓取的原始国家/地区名称,因此匹配字符串可能涉及一些工作。
11. 通过运行以下代码来合并`DataFrame`
......@@ -677,9 +677,9 @@ HTTP 方法有很多类型,例如 GET,HEAD,POST 和 PUT。 前两个用于
df_populations.loc[df_populations[col] == 'U.S.'] = 'United States'
```
我们使用`loc`方法重命名人口数据所在的国家/地区,以定位该行。 现在,让我们正确合并`DataFrame`。
我们使用`loc`方法重命名人口数据所在的国家/地区,以定位该行。 现在,让我们正确合并`DataFrame`。
14. 重新合并国家/地区名称上的数据,但这一次使用内部合并删除`NaN`值:
14. 重新合并国家/地区名称上的数据,但这一次使用内部合并删除`NaN`值:
```py
df_merge = pd.merge(df_populations,df_int_rates,left_on='Country (or dependency)',right_on='Country or currency union',
......
......@@ -1039,7 +1039,7 @@ print (zippedResults.max())
本章最初是为 Spark 1 编写的,因此让我们讨论一下 Spark 2 的新增功能以及 MLlib 现在具有哪些新功能。
因此,Spark 2 的主要优点是它们越来越趋向于数据框和数据集。 数据集和数据框有时可以互换使用。 从技术上讲,数据帧是行对象的数据集,它们有点像 RDD,但是唯一的区别是,RDD 仅包含非结构化数据,而数据集具有已定义的架构。
因此,Spark 2 的主要优点是它们越来越趋向于数据帧和数据集。 数据集和数据帧有时可以互换使用。 从技术上讲,数据帧是行对象的数据集,它们有点像 RDD,但是唯一的区别是,RDD 仅包含非结构化数据,而数据集具有已定义的架构。
数据集会提前准确知道每一行中存在哪些信息列,以及这些信息的类型。 因为它可以提前知道该数据集的实际结构,所以可以更有效地优化事物。 它还使我们可以将此数据集的内容视为一个小型微型数据库,实际上,如果它位于集群上,则是一个非常大的数据库。 这意味着我们可以做一些事情,例如在上面执行 SQL 查询。
......@@ -1102,7 +1102,7 @@ df = data.toDF(colNames)
```
我们将告诉 MLlib,结果 RDD 中的这两列实际上对应于标签和功能,然后我可以将该 RDD 转换为`DataFrame`对象。 此时,我有一个实际的数据,或者,如果有的话,我将有一个包含两个列,标签和要素的数据集,其中标签是浮点高度,而要素列是浮点权重的密集向量。 这是 MLlib 要求的格式,而 MLlib 可能对此有些挑剔,因此请务必注意这些格式。
我们将告诉 MLlib,结果 RDD 中的这两列实际上对应于标签和功能,然后我可以将该 RDD 转换为`DataFrame`对象。 此时,我有一个实际的数据,或者,如果有的话,我将有一个包含两个列,标签和要素的数据集,其中标签是浮点高度,而要素列是浮点权重的密集向量。 这是 MLlib 要求的格式,而 MLlib 可能对此有些挑剔,因此请务必注意这些格式。
现在,就像我说的,我们将数据分成两半。
......@@ -1138,9 +1138,9 @@ fullPredictions = model.transform(testDF).cache()
```
我将调用`model.transform(testDF)`,这将根据我的测试数据集中的权重来预测高度。 我实际上有已知的标签,即实际的正确高度,这将向该数据添加一个称为预测的新列,该列具有基于该线性模型的预测值。
我将调用`model.transform(testDF)`,这将根据我的测试数据集中的权重来预测高度。 我实际上有已知的标签,即实际的正确高度,这将向该数据添加一个称为预测的新列,该列具有基于该线性模型的预测值。
我将缓存这些结果,现在我可以提取它们并将它们进行比较。 因此,让我们像在 SQL 中一样使用`select`来抽出预测列,然后我将实际转换该数据并从中抽出 RDD,并使用它将其映射到一个普通的旧 RDD,在这种情况下,它充满浮点高度:
我将缓存这些结果,现在我可以提取它们并将它们进行比较。 因此,让我们像在 SQL 中一样使用`select`来抽出预测列,然后我将实际转换该数据并从中抽出 RDD,并使用它将其映射到一个普通的旧 RDD,在这种情况下,它充满浮点高度:
```py
predictions = fullPredictions.select("prediction").rdd.map(lambda x: x[0])
......
......@@ -15,7 +15,7 @@
* 处理丢失的数据
* 处理数据
# 使用 NumPy 的数组世界
# NumPy 数组世界
Python 默认情况下为,它具有可用于数组操作的数据结构,例如列表,但是 Python 列表本身并不适合执行繁重的数学运算,因为它没有为此进行优化。
......@@ -97,7 +97,7 @@ Array[10 10 10 10]
请注意,当减去两个数组时,它们的大小应相等。
## 平方数组
## 数组平方
以下命令将每个元素提高到`2`的幂,以获得此结果:
......@@ -224,23 +224,23 @@ Array[10 10 10 10]
```
# 利用Pandas进行数据分析
# Pandas 数据分析
Pandas库由 Wes McKinny 在 AQR Capital Management 工作时开发。 他想要一种足够灵活的工具来对财务数据进行定量分析。 后来,Chang She 加入了他,并帮助进一步开发了该软件包。
Pandas 库是一个开放源代码 Python 库,专门用于数据分析。 它建立在 NumPy 上,可以轻松处理数据。 NumPy 是一个相当底层的工具,可以很好地处理矩阵。
Pandas 库在 Python 世界中带来了 R 的丰富功能,可以处理数据。 它具有高效的数据结构,可以处理数据,执行快速接以及从各种来源读取数据,仅举几例。
Pandas 库在 Python 世界中带来了 R 的丰富功能,可以处理数据。 它具有高效的数据结构,可以处理数据,执行快速接以及从各种来源读取数据,仅举几例。
## Pandas的数据结构
Pandas库本质上具有三个数据结构:
1. 系列
2. 数据
2. 数据
3. 控制板
###
###
`Series`是一维数组,它可以保存任何类型的数据,例如也可以是整数,浮点数,字符串和 Python 对象。 可以通过调用以下命令来创建系列:
......@@ -286,7 +286,7 @@ dtype: int64
```
### 数据
### 数据
`DataFrame`是 2D 数据结构,其列可以具有不同的数据类型。 它可以看作是一张桌子。 一个`DataFrame`可以由以下数据结构组成:
......@@ -465,7 +465,7 @@ Pandas 库还提供了读取 JSON 文件的功能,可以使用`pd.read_json()`
原始数据中的数据通常需要进行一些清理,以便可以对其进行分析或在其上创建仪表板。 数据可能有很多原因。 例如,零售商店的销售点系统可能出现故障,并输入了一些缺少值的数据。 在下一节中,我们将学习如何处理此类数据。
## 检查失的数据
## 检查失的数据
通常,大多数数据都会缺少一些值。 可能有多种原因:收集数据的源系统可能未收集值,或者可能从未存在过这些值。 加载数据后,必须检查数据中缺少的元素。 根据要求,需要处理丢失的数据。 可以通过删除行或用替代值替换缺少的值来进行处理。
......@@ -509,7 +509,7 @@ dtype: int64
## 填写缺失的数据
让我们定义一些要使用的数据
让我们定义一些要使用的数据
```py
>>> df = pd.DataFrame(np.random.randn(5, 3), index=['a0', 'a10', 'a20', 'a30', 'a40'],
......@@ -858,9 +858,9 @@ p2 2 RAVENA COEYMANS SELKIRK CENTRAL SCHOOL DISTRICT ALBANY
该表是针对`ELEMENTARY`等级和`DELAWARE`县过滤的。 请注意,条件用括号括起来。 这是为了确保评估各个条件,并且如果未提供括号,则 Python 将引发错误。
## 加入
## 连接
可以使用Pandas在`DataFrame`上执行类似 SQL 的接。 让我们定义一个查找`DataFrame`,它使用以下命令为每个成绩指定级别:
可以使用Pandas在`DataFrame`上执行类似 SQL 的接。 让我们定义一个查找`DataFrame`,它使用以下命令为每个成绩指定级别:
```py
>>> grade_lookup = {'GRADE LEVEL': pd.Series(['ELEMENTARY', 'MIDDLE/HIGH', 'MISC']),
......@@ -883,13 +883,13 @@ p2 2 RAVENA COEYMANS SELKIRK CENTRAL SCHOOL DISTRICT ALBANY
```
### 内部联
### 内
图像后的是内部接的示例:
图像后的是内部接的示例:
![The inner join](img/3450_01_01.jpg)
可以使用以下命令执行内部接:
可以使用以下命令执行内部接:
```py
>>> d_sub = df[0:5].join(grade_lookup.set_index(['GRADE LEVEL']), on=['GRADE LEVEL'], how='inner')
......@@ -902,17 +902,17 @@ p2 2 RAVENA COEYMANS SELKIRK CENTRAL SCHOOL DISTRICT ALBANY
```
连接使用`join()`方法进行。 第一个参数采用在其上进行查找的`DataFrame`。 请注意,`grade_lookup``DataFrame`的索引是通过`set_index()`方法设置的。 这对于联接至关重要,因为没有联接,联接方法将不知道将`DataFrame`接到哪一列。
连接使用`join()`方法进行。 第一个参数采用在其上进行查找的`DataFrame`。 请注意,`grade_lookup``DataFrame`的索引是通过`set_index()`方法设置的。 这对于连接至关重要,因为没有连接,连接方法将不知道将`DataFrame`接到哪一列。
第二个自变量采用`d``DataFrame`的一列来联接数据。 第三个参数将联接定义为内部联接。
第二个自变量采用`d``DataFrame`的一列来连接数据。 第三个参数将连接定义为内部连接。
### 左外部联
### 左外
图像后的是左外部接的样本:
图像后的是左外部接的样本:
![The left outer join](img/3450_01_02.jpg)
可以使用以下命令执行左外部接:
可以使用以下命令执行左外部接:
```py
>>> d_sub = df[0:5].join(grade_lookup.set_index(['GRADE LEVEL']), on=['GRADE LEVEL'], how='left')
......@@ -929,13 +929,13 @@ p2 2 RAVENA COEYMANS SELKIRK CENTRAL SCHOOL DISTRICT ALBANY
您会注意到级别列的`DISTRICT TOTAL`缺少值,因为的`grade_lookup``DataFrame`没有`DISTRICT TOTAL`的实例。
### 完整的外部联
### 全外连
图像后的是完整外部接的示例:
图像后的是完整外部接的示例:
![The full outer join](img/3450_01_03.jpg)
完整的外部接可以使用以下命令执行:
完整的外部接可以使用以下命令执行:
```py
>>> d_sub = df[0:5].join(grade_lookup.set_index(['GRADE LEVEL']), on=['GRADE LEVEL'], how='outer')
......
# 第 2 章推理​​统计
# 第 2 章推统计
在了解推统计信息之前,让我们看一下描述性统计信息是关于什么的。
在了解推统计信息之前,让我们看一下描述性统计信息是关于什么的。
**描述性统计信息**是提供给数据分析的术语,它以有意义的方式汇总数据,从而从中得出模式。 这是描述数据的一种简单方法,但是它无助于我们就所做出的假设得出结论。 假设您已经收集了生活在香港的 1,000 个人的身高。 他们的平均身高是描述性统计数字,但他们的平均身高并不表示这是整个香港的平均身高。 在这里,推断统计将帮助我们确定整个香港的平均身高,这将在本章中详细介绍。
......@@ -15,7 +15,7 @@
* 定义总体均值所在的置信区间
* p 值的重要性及其如何用于解释结果
# 各种发行形式
# 各种分布
有多种概率分布,每种分布都显示了随机实验中不同结果的概率。 在本节中,我们将探讨各种概率分布。
......@@ -255,7 +255,7 @@ NumPy 程序包具有一个具有正态函数的随机模块,其中 50 是分
Z 得分是统计学中必不可少的概念,已被广泛使用。 现在您可以理解,它基本上用于标准化任何分布,以便可以对其进行比较或从中推论得出。
# 一个 p 值
# p 值
p 值是当假设被证明是正确的时,否定原假设的概率。 零假设是一种陈述,说两种度量之间没有区别。 如果假设每天学习 4 个小时的人的得分超过 100 分,则得分超过 90 分。这里的无效假设是,上课的小时数与得分得分之间没有关系。
......@@ -289,7 +289,7 @@ p 值是当假设被证明是正确的时,否定原假设的概率。 零假
因此,您可以看到 p 值为 3.2%,低于显着性水平。 这意味着无效的假设可以被拒绝,并且可以说在数学上获得 68 分并不常见。
# 一尾和二尾测试
# 单尾和双尾测试
上一节中的示例是一个单尾检验的实例,其中零假设基于正态分布的一个方向被拒绝或接受。
......@@ -459,7 +459,7 @@ upper_bound / lower_bound = mean(height) +/- sigma * SEmean(x)
这意味着随着样本量的增加,平均值的标准误差减小,这也意味着置信区间变窄,并且我们可以确定地确定总体平均值所依据的区间。
# 相关
# 相关
在统计中,相关性定义两个随机变量之间的相似性。 最常用的相关是皮尔森相关,它的定义如下:
......@@ -611,7 +611,7 @@ F 统计量由以下公式给出:
![The chi-square distribution](img/B03450_02_37.jpg)
## 卡尺适合度
## 卡方检验
卡方检验可用于检验观察到的数据是否与预期数据有显着差异。 让我们以骰子为例。 掷骰子 36 次,每个面朝上的概率为 1/6。 因此,预期分布如下:
......
# 第 3 章。在干草堆中寻找针头
# 第 3 章。大海捞针
分析数据集以查找模式既是一门艺术,也是一门科学。 数据集可能有很多指标,您想在这堆干草堆中找到要害。 对于我们来说,针是我们在以前不知道的数据中寻找的洞察力。 在这里,洞察力可能指的是有关购买特定品牌牛奶以及购买其他品牌谷物的人们的重要信息。 然后,零售商店可以将产品彼此靠近堆叠。
......@@ -63,7 +63,7 @@
![What is data mining?](img/B03450_03_02.jpg)
# 行分析
# 行分析
在执行分析之后,您需要提供一些观察结果。 为此,最常用的媒体是通过 Microsoft PowerPoint 演示文稿。 分析的结果可以是图表或表格形式的构造。 介绍这些结构时,应将某些信息添加到幻灯片中。 这是最常用的模板之一:
......@@ -75,7 +75,7 @@
* **观察结果**:此处,在垂直栏中列出了来自构建体的观察结果。 有时,可以使用箭头标记或对话框在结构上标记观察结果。
* **关键点**:在图像底部,您可以描述图表得出的结论。
# 学习泰坦尼克
# 学习泰坦尼克
为了执行数据分析,我们将使用来自 Kaggle 的泰坦尼克数据集。
......@@ -260,7 +260,7 @@
* 女乘客被优先选择救生艇,而大多数人获救。
## 在船上有家人的各个阶层中,非幸存者的分布是什么?
## 在船上有家人的各个舱位中,非幸存者的分布是什么?
为了回答这个问题,我们将使用以下代码再次绘制条形图,使用每个班级中每个都有家人的非幸存者的总数以及相对于乘客总数的百分比:
......
......@@ -67,7 +67,7 @@ movie_user_preferences['William']['Gone Girl']
欧式距离是空间中两点之间的最小距离。 让我们通过绘制观看过 Django Unchained 和 Avengers 的用户来了解这一点。
我们将创建一个数据,其中包含`user``django``avenger`列,其中`django``avenger`包含用户给出的评分:
我们将创建一个数据,其中包含`user``django``avenger`列,其中`django``avenger`包含用户给出的评分:
```py
>>> data = []
......
......@@ -445,7 +445,7 @@ In: import pandas as pd
![](img/b8b57788-4cb8-4483-b59c-a7aa1f9a5495.png)
可以很容易地说,对于要堆叠在一起的每个列,您都可以提供它们的名称(作为字典键)和值(作为该键的字典值)。 如前面的示例所示,`Col2``Col3`以两种不同的方式创建,但是它们提供了相同的结果值列。 这样,您可以创建一个Pandas数据,其中包含具有非常简单功能的多种数据类型。
可以很容易地说,对于要堆叠在一起的每个列,您都可以提供它们的名称(作为字典键)和值(作为该键的字典值)。 如前面的示例所示,`Col2``Col3`以两种不同的方式创建,但是它们提供了相同的结果值列。 这样,您可以创建一个Pandas数据,其中包含具有非常简单功能的多种数据类型。
在此过程中,请确保不要混合使用不同大小的列表; 否则,将引发异常,如下所示:
......@@ -469,7 +469,7 @@ In: col5 = pd.Series([4, 3, 2, 1, 0])
在前面的示例中,我们基于两个`Series`创建了一个新的`DataFrame``a_new_dataset`。 不管它们的索引如何,我们都将它们堆叠在一起,因为我们使用了`ignore_index`参数,该参数设置为`True`。 如果对索引进行匹配对您的项目很重要,则不要使用`ignore_index`参数(其默认值为`False`),您将基于两个索引的并集或仅基于两个索引而获得一个新的`DataFrame`结果匹配的索引元素。
通过在参数`join='inner'`中添加等效于 SQL 内部联接的参数`join='inner'`,可以在`pd.concat`中基于公共列联接两个不同的数据集(有关连接的主题,将在以下示例中处理) 。
通过在参数`join='inner'`中添加等效于 SQL 内部连接的参数`join='inner'`,可以在`pd.concat`中基于公共列连接两个不同的数据集(有关连接的主题,将在以下示例中处理) 。
根据索引进行匹配有时可能不足以满足您的需求。 有时,您可能需要在特定列或一系列列上匹配不同的`Series``DataFrame`。 在这种情况下,您需要`merge`方法,该方法可以在每个`DataFrame`中运行。
......@@ -485,18 +485,18 @@ In: key = pd.Series([1, 2, 4])
![](img/e7db965a-1b36-4a5f-a308-9cae74eeebd3.png)
通过将`how`参数设置为`left`来操作合并,从而实现 SQL 左外部接。 除`left`以外,此参数的其他可能设置如下:
通过将`how`参数设置为`left`来操作合并,从而实现 SQL 左外部接。 除`left`以外,此参数的其他可能设置如下:
* `right`:等效于 SQL 右外部
* `outer`:等效于 SQL 完全外部
* `inner`:等效于 SQL 内部接(如前所述)
* `right`:等效于 SQL 右外部
* `outer`:等效于 SQL 完全外部
* `inner`:等效于 SQL 内部接(如前所述)
```py
In: my_new_dataset.merge(reference_table,
on='Col5', how='left')
```
产生的`DataFrame`是左外部接:
产生的`DataFrame`是左外部接:
![](img/2ffe500a-110e-47e4-9e2a-1f20002b5107.png)
......
......@@ -1155,7 +1155,7 @@ Out: Row(features=SparseVector(41, {1: 8.0, 7: 181.0, 15: 1.0, 16: 2.0, 22:
* 群集(`pyspark.ml.clustering`程序包):KMeans
* 推荐人(`pyspark.ml.recommendation`软件包):ALS(协同过滤推荐器,基于交替最小二乘法)
让我们回到 KDD99 挑战的目标。 现在,该实例化随机森林分类器并设置其参数了。 要设置的参数是`featuresCol`(包含特征矩阵的列),`labelCol`(包含目标标签的数据的列),`seed`(使实验可复制的随机种子)和`maxBins` (用于树的每个节点中的分割点的最大箱子数)。 森林中树木数量的默认值为`20`,每棵树的最大深度为 5 级。 此外,默认情况下,此分类器在`DataFrame`中创建三个输出列:`rawPrediction`(用于存储每个可能标签的预测得分),`probability`(用于存储每个标签的可能性)和`prediction`(最可能的标签):
让我们回到 KDD99 挑战的目标。 现在,该实例化随机森林分类器并设置其参数了。 要设置的参数是`featuresCol`(包含特征矩阵的列),`labelCol`(包含目标标签的数据的列),`seed`(使实验可复制的随机种子)和`maxBins` (用于树的每个节点中的分割点的最大箱子数)。 森林中树木数量的默认值为`20`,每棵树的最大深度为 5 级。 此外,默认情况下,此分类器在`DataFrame`中创建三个输出列:`rawPrediction`(用于存储每个可能标签的预测得分),`probability`(用于存储每个标签的可能性)和`prediction`(最可能的标签):
```py
In: from pyspark.ml.classification import RandomForestClassifier
......
......@@ -331,7 +331,7 @@ display(london_info)
![SampleData – a simple API for loading data](img/00020.jpeg)
用于可视化`london_info`数据的图表选项
用于可视化`london_info`数据的图表选项
**选项**对话框中单击 **OK** 按钮后,我们得到以下结果:
......@@ -435,7 +435,7 @@ pixiedust_rosie.wrangle_data(url)
![Wrangling data with pixiedust_rosie](img/00029.jpeg)
编辑结果Pandas数据的变量名
编辑结果Pandas数据的变量名
单击**完成**按钮后,`pixiedust_rosie`应用模式定义遍历整个数据集。 完成后,它将使用生成的代码在当前单元的下面创建一个新单元格,该代码在新生成的Pandas `DataFrame`上调用`display()` API,如下所示:
......
......@@ -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()`操作。
下图说明了合并操作:
......@@ -546,7 +546,7 @@ nx.pagerank(flight_graph)
'YUM': 0.0006214341604372096}
```
考虑到这一点,我们无需执行与`degree`相同的步骤,而是可以实现一个名为`compute_centrality()`的泛型函数,该函数将计算中心度和列名的函数作为参数,创建一个临时函数。 包含计算出的中心值的数据框,并将其与`airports_centrality`数据框合并。
考虑到这一点,我们无需执行与`degree`相同的步骤,而是可以实现一个名为`compute_centrality()`的泛型函数,该函数将计算中心度和列名的函数作为参数,创建一个临时函数。 包含计算出的中心值的数据帧,并将其与`airports_centrality`数据帧合并。
以下代码显示了`compute_centrality()`的实现:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册