关于 Python 中的字典,你应该知道的 15 件事
Python 中词典的使用指南
1.什么是 Python 字典?
字典是一个无序和可变 Python 容器,它存储唯一键到值的映射。字典用花括号({})书写,包括用逗号(,)分隔的键值对。冒号(:)将每个键与其值分开。
下面显示了三个字典,包含了德国最大的五个城市的人口,产品列表和学生的成绩。
2.用 dict()构造函数创建字典
也可以使用内置函数 dict(kwarg) 创建字典。该函数接受任意数量的关键字参数**(前面带有标识符 kwarg=value 的参数)作为输入。
我们还可以使用另一个字典结合关键字参数 ( **dict(mapping,kwarg) )创建一个字典,如下所示:
或者,我们可以使用一个 iterable(例如元组列表)来构建一个字典。每个元组必须包含两个对象。第一个对象成为键,第二个成为字典的值。
最后,我们可以使用两个列表创建一个字典。首先,我们必须使用 zip(iterables) 函数构建元组的*迭代器。然后,我们使用 dict([iterable,kwarg]) 函数来构建字典,就像我们之前做的那样。
3。访问字典中的值
为了访问字典值,我们不能使用数字索引(就像我们对列表或元组所做的那样),因为字典是无序的容器。相反,我们用方括号([])将键括起来。如果我们试图使用一个未定义的键来访问一个值,就会产生键错误。
为了避免出现未定义键的异常,我们可以使用方法 dict.get(key[,default]) 。如果键在字典中,该方法返回键的值,否则返回默认值。如果没有提供默认值,它将返回 None (但不会引发异常)。
4.在词典中插入元素
要在字典中插入元素,我们可以使用方括号,如下所示:
要一次插入多个条目,我们可以使用方法dict . update(【other】)。这个方法用来自其他的键/值对更新字典,覆盖现有的键。
如上图,。update() 方法不仅接受另一个字典作为参数,还接受元组列表或关键字参数作为参数。这个方法就地修改字典,返回 None 。
5.更改字典中的元素
我们可以通过使用方括号([])访问键来更改项目的值。要一次修改多个值,我们可以使用**。update()** 方法,因为该函数会覆盖现有的键。
随后,我们将一个沙发的价格提高了 100 个单位,我们修改了两个学生的成绩。
6.删除字典中的元素
要删除字典中的元素,我们可以使用 del dict[key] 关键字或 dict.pop(key[,default]) 方法。
del dict[key] 关键字从字典中删除给定的元素,如果键不存在,则引发 KeyError 。
如果键存在于字典中,则 dict.pop(key[,default]) 方法从字典中删除带有给定键的项,并返回其值。相反,如果键在字典中不存在,该方法返回缺省值。如果没有提供默认值,并且键不存在,则**。pop()** 方法会引发一个异常 ( KeyError )。
7.检查密钥是否存在
为了检查键是否存在于字典中,我们必须使用一个成员操作符。成员运算符用于测试是否在序列中找到某个值(例如字符串、列表、元组、集合或字典)。有两个成员资格运算符,如下所述。
- 中的→如果左侧的对象包含在右侧的对象中,则评估为真。
- 不在中→如果左侧的对象不在右侧的对象中,则评估为真。
如上所示,成员操作符(中的和中的**)可以用来检查一个键是否存在于字典中,但是它们也可以以下面的方式用于其他序列。**
8.复制一本字典
要复制一个字典,我们可以简单地使用 dict.copy() 方法。这个方法返回字典的一个浅拷贝。我们必须小心使用浅拷贝,因为如果你的字典包含另一个容器对象如列表、元组或集合,它们将被再次引用而不会重复。
为了避免这个问题,我们可以使用 copy.deepcopy(x) 函数(在 copy 模块中定义)创建一个深度复制,如下所示:
浅拷贝和深拷贝之间的区别仅在字典包含列表等其他对象时才相关,因为这些对象将被引用而不是被复制(浅拷贝)。为了创建原始字典的完全独立的克隆,我们必须制作一个深度副本。
如果你想知道更多关于如何抄字典的知识,你可以阅读下面这篇文章,其中详细解释了浅抄和深抄的区别。
[## Python:如何复制字典|浅层复制 vs 深层复制
在本文中,我们将讨论如何用 Python 创建字典的浅层和深层副本。Python 的字典…
thispointer.com](https://thispointer.com/python-how-to-copy-a-dictionary-shallow-copy-vs-deep-copy/)
记住 =操作符不会复制字典是很重要的。这只是引用同一词典的另一个名称,意味着对新词典的任何修改都会反映在原始词典中。
9.确定字典的长度
要确定字典包含多少个键-值对,我们可以使用 len() 函数。这个函数返回一个对象的项数。函数的输入可以是字典,也可以是另一种类型的序列,如字符串、列表、元组或集合。
10.循环查阅字典
遍历键
为了迭代键,我们可以在循环的中直接使用字典,如下所示:
或者,我们可以使用 dict.keys() 方法。这个方法返回一个视图对象,包含字典的键。
遍历值
如果您只需要处理字典的值,那么您可以在循环的中使用 dict.values() 方法。该方法返回一个视图对象,该对象包含字典的值**。**
我们可以使用 dict.values() 方法计算出有多少人居住在德国最大的 5 个城市,如下所示:
正如我们所观察到的,将近 900 万人居住在德国最大的五个城市。
遍历项目
当你使用字典时,你可能需要使用键和值。要在两者之间循环,可以使用 dict.items() 方法。该方法返回一个视图对象,包含作为元组列表的键值对。
我们可以使用 dict.items() 方法结合 for 循环来确定考试分数最低的学生,如下所示:
如上图,诺曼多是考试成绩最低的学生(2.5)。
11。词典释义
Python for-loops 在处理重复性编程任务时非常得心应手;然而,还有另一种方法可以更有效地达到同样的效果。
字典理解允许使用优雅简单的语法创建字典:**{ key:iterable 中变量的值}。**此外,它们比传统的 for-loops 更快。
我们可以使用传统的 for 循环和字典理解来过滤价格低于 100 欧元的产品。
正如我们所观察到的,字典理解以一种更优雅的方式提供了与传统的 for 循环相同的结果。
12.嵌套词典
嵌套字典是包含其他字典的字典。我们可以创建一个嵌套字典,就像我们使用花括号({})创建一个普通字典一样。
下面的嵌套字典包含了 5 个著名艺术作品的信息,我们可以观察到,该字典的值也是其他字典。
我们还可以使用 dict() 构造函数创建先前的嵌套字典,将 key: value 对作为关键字参数传递。
为了访问嵌套字典中的元素,我们使用多个方括号([])来指定键。
如果你想了解更多关于嵌套字典的内容,你可以阅读下面这篇文章,其中详细解释了如何使用嵌套字典(例如更新条目、改变元素、循环遍历)。
一个字典可以包含另一个字典,而另一个字典又可以包含字典本身,以此类推,直到任意…
www.learnbyexample.org](https://www.learnbyexample.org/python-nested-dictionary/)
13.替代容器:OrderedDict、defaultdict 和 Counter
集合模块提供了内置 Python 容器的替代容器数据类型。在使用 Python 时,包含在集合模块中的三个字典子类非常方便:(1) OrderedDict 、( 2) defaultdict 和(3) Counter 。
有序直接
OrderedDict 由一个字典组成,该字典记住其内容被添加的顺序。在 Python 3.6+中,字典也是插入有序的,意味着它们记住了插入条目的顺序。然而,为了保证跨其他 Python 版本的元素顺序,我们必须使用有序直接容器。
如上所示, OrderedDict 接受字典方法和函数。此外,可以像普通字典一样插入、更改或删除元素。
默认字典
Defaultdicts 是一个字典子类,当一个键丢失(它还没有被设置)时,它分配一个默认值。如果我们试图访问一个字典中没有的条目,他们永远不会抛出一个 KeyError。
Defaultdicts 以一个函数作为参数,用函数返回的值初始化缺失的键。在下面的示例中,根据用作第一个参数的函数,键被初始化为不同的值。
正如我们所观察到的,我们可以传递一个字典或关键字作为第二个参数(可选)来初始化 defaultdict 容器。
计数器
一个计数器是一个字典子类,用于计算 hastable 对象。该函数返回一个计数器对象,其中元素存储为键,它们的计数存储为值。使用这个函数,我们可以很容易地计算一个列表的元素,如下所示。
如上所示,我们可以很容易地用**获得最频繁的元素。**最常用(【n】)方法。该方法返回 n 个最常见元素及其计数的列表。
14.根据字典创建一个熊猫数据框架。
Pandas DataFrame 是一个二维表格数据,其中每个行代表一个观察值,每个列代表一个变量。熊猫数据框架可以使用熊猫创建。DataFrame 构造器。该函数接受各种 python 容器(例如列表、字典或 numpy 数组)作为输入。然而,在本文中,我们只解释了使用字典创建数据框架的方法。
从字典创建数据帧
我们可以从一个字典中创建一个数据帧,其中键表示列名,而值以如下方式表示列数据:
正如我们所观察到的,默认索引只是行号(从 0 开始的整数索引)。我们可以通过将索引列表传递给 DataFrame 构造函数来修改这些索引。
从字典列表中创建一个数据框架
字典列表也可以用来创建数据框架**,其中键代表列名。和以前一样,我们可以通过将索引列表传递给 DataFrame 函数来更改索引。**
15.熊猫使用字典的功能
Pandas 中有几个函数使用字典作为输入值,例如, pandas。DataFrame .重命名和pandas . data frame . replace .
熊猫。DataFrame .重命名
这个函数返回一个带有重命名轴标签的数据帧。我们可以使用字典作为输入,其中键引用旧名称,而值引用新名称。字典中未包含的标签保持不变。
如上所示,我们可以更改索引标签,为索引参数提供一个字典。或者,我们可以修改列名,将字典提供给列参数。
熊猫。数据框架.替换
该功能用其他值动态替换数据帧的值。我们可以使用具有替换功能的字典来修改数据帧,其中键表示现有条目,而值表示替换条目。
文章完了!🍀正如你所看到的,字典是 Python 中非常有用的工具。我希望这篇文章能为你在用 Python 编码时充分利用它们提供指导。💪
关于 Python 中的列表,你应该知道的 15 件事
Python 中列表的使用指南
1.什么是 Python 列表?
一个列表是一个有序和可变的 Python 容器,是 Python 中最常见的数据结构之一。为了创建一个列表,元素被放在方括号( [] )中,用逗号分隔。
如上所示,列表可以包含不同类型的元素以及重复的元素。
2.用 list()构造函数创建一个列表
列表也可以用内置函数**list(【iterable】)**创建。该函数将 iterable(即任何类型的序列、集合或迭代器)作为参数,返回一个包含输入对象项的列表。
如上所示,我们不仅可以从 Python 内置容器中创建列表,还可以从 Numpy 数组和 Pandas 系列以及其他可迭代对象中创建列表。
我们也可以使用没有任何输入参数的 list() 构造函数。在这种情况下,构造函数返回一个空列表。
3。访问列表中的元素
列表是元素的有序序列,像 Python 中的其他有序容器一样,它们使用起始索引 0 进行索引。为了访问列表中的元素,我们提供方括号( [] )内的索引(整数),如下所示。
如上所示,当试图访问列表范围之外的索引时,会引发一个 IndexError 。
我们还可以使用一个负值从列表的末尾访问一个项目,其中-1 表示最后一个元素,-2 表示倒数第二个元素,依此类推。
为了访问多个元素,我们使用 python 的切片操作符:
【开始:停止:步进】
切片时,记住开始索引是包含的,而结束索引是不包含的,这一点很重要。
请记住,我们可以访问和切片列表的元素,因为它们是有序容器。在 Python 中,容器可以是有序的(顺序定义的),或者是无序的元素序列(顺序未定义的),我们只关心对象是否包含元素,而不关心它的位置。例如,我们可以很容易地访问列表中的值,就像我们之前解释的那样;然而,如果我们试图访问集合中的一个元素,我们会得到一个类型错误,因为元素在集合中没有特定的位置。
4.修改列表中的项目
我们可以通过在赋值操作符的左边(当我们访问或分割一个列表时)给定方括号中的一个或多个索引,并在右边给定新值来修改列表中的一项。
下面的代码显示了我们如何更新一个列表中的单个或多个元素,如前所述。
可以就地修改列表,因为列表是可变对象。可变性指改变对象值的可能性。可变对象可以改变它们的值,而不可变对象不能被改变。例如,我们可以修改列表中的一项;然而,不可能就地改变一个元组,因为元组是不可变的对象;它们的值不能修改。
5.从列表中删除元素
从列表中删除元素有三种方式:
- 使用 del 关键字
- 使用 list.remove(x) 方法
- 使用 list.pop([x]) 方法
del 关键字
我们可以使用 del 关键字删除列表中的一个或多个条目,以下面的方式在方括号( [] )中提供我们想要删除的索引:
如上所示,我们不仅可以使用 del 关键字从列表中删除条目,还可以删除对对象的引用。
流行方法
list.pop([x])方法移除给定索引处的项目,并返回它。如果没有提供索引, list.pop()方法移除并返回列表的最后一项。当试图移除列表范围之外的索引时,会引发索引错误。
该移除方法
list.remove(x) 方法从列表中删除第一个匹配元素,并返回 None 。如果元素不在列表中,则引发 ValueError 异常。
6.在列表中插入元素
要在列表中插入一个元素,我们可以使用:
- list.insert(i,x) 方法
- list.append(x) 方法
插入方法
list.insert(i,x) 方法在给定索引 i 处插入一个元素 x ,并返回 None 。
如上所示,第一个参数 i 是我们在它之前插入一个项目的元素的索引。这就是为什么,如果我们提供索引-1 作为输入,元素会被插入到倒数第二个位置,而不是列表的末尾。要在列表的末尾插入一个条目,我们必须提供列表的长度作为输入。
我们不仅可以用插入方法添加一个原始数据类型(整型、浮点型、字符串型或布尔型),还可以添加一个 Python 容器(例如一个列表),如下所示。
append 方法
list.append(x)方法在列表末尾添加一个项目,相当于 list.insert(len(list),x) 。
如上所示。 append() 方法就地修改列表,返回 None 。
7.对列表排序
排序函数
为了对列表中的元素进行排序,我们可以同时使用排序函数和排序方法。排序函数返回一个排序列表,但是作为输入提供的列表保持不变。
该函数具有以下语法:
排序(iterable[,key][,reverse])
第一个参数是我们想要排序的 iterable (在本例中是一个列表)。以下两个参数键和反转是可选的,允许我们进行更复杂的排序。我们以后会看到的!
排序方法
与排序函数不同,排序方法就地排序列表,返回 None 。
sort 方法具有以下语法和两个可选参数: key 和 reverse 。
list.sort(key=…,reverse=…)
下面的代码展示了我们如何使用排序函数和排序方法对列表中的元素进行排序。
附加参数:反向和键控
排序函数和排序方法按升序对元素进行排序,除非我们另有说明,提供参数 reverse=True 。
另一个重要参数是键。我们可以根据 key 参数中提供的函数返回的值对列表进行排序。我们将函数应用于列表中的每个元素,然后根据该函数返回的值对元素进行排序。键参数可以包含内置、匿名或普通函数以及方法。
在下面的例子中,我们使用关键参数来:
- 按长度对字符串列表进行排序。
2.按照元音的数量对字符串列表进行排序。
3.按第三个值对嵌套列表进行排序。
8。反转列表
反向函数
为了反转列表中的元素,我们可以同时使用 reversed(seq)函数和 list.reverse() 方法。反转函数返回给定序列的反转迭代器,保持作为输入提供的序列不变。与排序函数相比,****反转函数不返回列表,所以如果我们想要获得列表,我们必须使用 list() 构造函数。
反向方法
与反转功能不同,反转方法原地反转列表,返回 None 。
9.连接两个列表
在 Python 中有多种方法可以连接两个列表**。****+运算符**是最简单的方法之一;事实上,我们也可以使用这个操作符来连接另一种类型的容器,比如字符串或元组。
+操作符也允许你连接两个以上的列表。
另一种连接两个列表的方法是使用 list.extend(iterable) 方法。该方法通过追加 iterable 中的所有项来扩展列表。
如上图所示, list.extend(iterable) 方法就地修改了列表,在列表的末尾添加了来自 iterable 的元素。作为输入提供的 iterable 保持不变,方法返回 None 。
正如我之前提到的,有多种方式来连接列表。下面的文章解释了在 Python 中连接两个列表的可选模式。
本教程涵盖以下主题- Python 添加列表。它描述了在…中加入/连接/添加列表的各种方法
www.techbeamers.com](https://www.techbeamers.com/python-add-lists-join-concatenate/)
10.检查列表中是否存在元素
为了检查一个元素是否存在于列表中,我们必须使用一个成员操作符。成员运算符用于测试是否在序列中找到某个值(例如字符串、列表、元组、集合或字典)。有两个成员资格运算符,如下所述。
- 中的→如果左侧的对象包含在右侧的对象中,则评估为真**。**
- 不在中→如果左侧的对象不在右侧的对象中,则评估为真。
如上图所示,成员运算符(中的和中的**)可用于检查一个元素是否存在于列表中,但它们也可以以如下方式用于其他序列。**
11.复制列表
要复制一个列表,我们可以简单地使用 list.copy() 方法。这个方法返回一个列表的浅拷贝。我们必须小心使用浅拷贝,因为如果你的列表包含另一个容器对象像其他列表、元组或集合一样,它们将被再次引用而不会重复。
为了避免这个问题,我们可以使用 copy.deepcopy(x) 函数(在 copy 模块中定义)创建一个深度复制,如下所示:
浅拷贝和深拷贝之间的区别只在列表包含其他对象如列表(嵌套列表)时相关,因为那些对象将被引用而不是被复制(浅拷贝)。为了创建原始列表的完全独立的克隆,我们必须制作一个深度副本。
切记 =操作符不会复制列表,这一点很重要。这只是引用同一个列表的另一个名称,意味着对新列表的任何修改都会反映在原始列表中。
12.确定列表的长度
要确定列表包含多少个元素,我们可以使用 len() 函数。这个函数返回一个对象的项数。函数的输入可以是列表,也可以是另一种类型的序列,如字符串、字典、元组或集合。
13.列出理解
For 循环可用于在 Python 中创建列表;然而, list comprehensions 提供了一个更优雅和简单的语法来重写循环。此外,对于循环,它们比传统的更快。
语法:iterable 中变量的表达式]
在下面的代码块中,我们创建了一个新的城市列表,包含大写的名称。
如上所示,我们分三步创建一个新列表。
- 创建空列表(cities_capitalized)
- 循环浏览列表(城市)
- 将大写的名称追加到新列表中(cities_capitalized)
然而,通过使用列表理解,我们只用一行代码就可以得到相同的结果。
我们也可以使用条件语句和列表理解来过滤掉不需要的数据。在下面的代码块中,条件语句从列表中筛选出奇数。
如您所见,列表理解是创建列表的一种优雅而简洁的方式。然而,非常长的理解列表会使读者感到困惑。因此,它的使用应该仅限于简单的语句。
14.替代集装箱:德克
deque 对象(在集合模块中定义)是一个 like-list 容器,为添加和删除两边(右边和左边)的项目进行了优化。
我们可以使用方法**。追加(x)** 和**。扩展(iterable)** 将元素添加到 deque 对象的右侧,就像我们之前对列表所做的那样。然而,与列表不同,deque 对象支持方法**。左追加(x)** 和**。extendleft(iterable)** 向左侧添加元素。
除了添加项目,队列对象还支持**。pop()** 和**。popleft()** 从两边移除元素的方法。
如果您想了解更多关于容器的信息,可以浏览一下文档。
[## 8.3.集合-高性能容器数据类型- Python 2.7.18rc1 文档
源代码:Lib/collections.py 和 Lib/_abcoll.py 这个模块实现了专门的容器数据类型,提供了…
docs.python.org](https://docs.python.org/2/library/collections.html#collections.deque)
15.从列表中创建一个熊猫数据框架。
Pandas DataFrame 是一个二维表格数据,其中每个行代表一个观察值,每个列代表一个变量。熊猫数据框架可以使用熊猫创建。DataFrame 构造器。尽管该函数接受多个 Python 容器作为输入,但创建数据框的最常见方式之一是使用嵌套列表作为输入。
正如我们所观察到的,默认索引是整数(从 0 开始)。我们可以通过向参数 index 和列传递一个列表来修改这些索引。
正如我之前所说,有多种方法来创建熊猫数据框。想知道更多的方法,可以访问下面的链接。😃
Pandas DataFrame 是一个带有潜在不同类型列的二维标签数据结构。一般是…
www.geeksforgeeks.org](https://www.geeksforgeeks.org/different-ways-to-create-pandas-dataframe/)
列表是最重要的 Python 内置容器,是用 Python 编程时正确理解它们的一个关键方面。除了官方的 Python 文档之外,还有多个网页提供了如何使用列表的详细解释和示例。
Python 编程语言中有四种集合数据类型:列表是有序的集合,并且…
www.w3schools.com](https://www.w3schools.com/python/python_lists.asp) [## Python 列表- GeeksforGeeks
列表就像动态大小的数组,用其他语言声明(C++中的 vector 和 Java 中的 ArrayList)。列表需要…
www.geeksforgeeks.org](https://www.geeksforgeeks.org/python-list/) [## Python 编程简介| Udacity
在本课程中,您将学习 Python 编程语言的基础,以及编程最佳…
www.udacity.com](https://www.udacity.com/course/introduction-to-python–ud1110)
我打算写一组关于 Python 容器的文章。到目前为止,使用字典和列表的指南已经完成!
[## 关于 Python 中的字典,你应该知道的 15 件事
Python 中词典的使用指南
towardsdatascience.com](/15-things-you-should-know-about-dictionaries-in-python-44c55e75405c)
集合、字符串和元组将在以后介绍💪
感谢阅读👧
阿曼达
Jupyter 笔记本的 15 个技巧和窍门将会减轻您的编码体验
使用这些技巧优化您在 Jupyter 笔记本中的工作
图片来自 Pixabay
Jupyter Notebook 是一个基于 REPL (read eval print loop)的浏览器,建立在 IPython 和其他开源库的基础上,它允许我们在浏览器上运行交互式 Python 代码。
它不仅运行 python 代码,还拥有许多有趣的插件和神奇的命令,极大地增强了 python 编码体验。
1.计算一个单元的执行时间:
我们可以在 jupyter 笔记本单元的开头使用魔法命令来计算该单元的执行时间。它计算墙时间,该墙时间可被称为执行该单元所需的总时间。
2.进度条:
人们可以使用 python 外部库来创建进度条,它可以实时更新代码的进度。它让用户了解正在运行的代码脚本的状态。你可以在这里获得库的 Github 库。
首先,你需要安装库,
pip3 install tqdm
或者您也可以使用!
将其安装在 jupyter 笔记本电池中。
tqdm
功能可以通过导入其包来使用,使用和实现可以观察如下:
3.自动代码格式化程序:
使用nb_black
库,可以将单元格中的代码片段格式化为适当的格式。有时 jupyter 笔记本单元格中的代码片段格式不正确,这个库有助于获得代码片段的正确格式。
nb_black
是 Jupyter Notebook 和 Jupyter Lab 的简单扩展,自动美化 Python 代码。
库的安装:
pip3 install nb_black
Jupyter 笔记本的用法:
%load_ext nb_black
(作者图片),无格式单元格
(图片由作者提供),使用 nb_black 格式化的单元格
4.安装包:
Jupyter 笔记本可以在笔记本本身安装任何 python 包。要在 jupyter 笔记本单元格中使用 pip 命令安装任何 python 包,请在命令前输入一个!
。
安装 pandas 包:输入! pip install pandas
并运行单元。
5.文档:
Jupyter Notebook 可以显示您正在调用函数的文档。按Shift+Tab
查看文档。这非常有帮助,因为您不需要每次都打开文档网站。此功能也适用于本地自定义功能。
用法:
- 写下你想实现的函数的名字
- 按下
Shift+Tab
查看文档。 - 点击文档右上角的
^
在页面中查看。 - 点击
+
垂直增长文档串。 - 点击
x
关闭文档字符串。
(图片作者),熊猫 read_csv 函数的 Docstring
6.自动完成:
Jupyter 笔记本可以显示任何函数名或变量的建议。要查看建议,输入代码,按键盘上的Tab
,建议将出现在自上而下的菜单中。按下arrow-up
或arrow-down
键向上或向下滚动菜单。您也可以使用鼠标滚动。单击关键字或在选定的关键字上按 enter 键以确认您的建议。
您还将获得定制函数和变量的建议。
(图片由作者提供),熊猫套餐的建议
7.调整输出视图:
Jupyter Notebook 可以在单元格正下方打印每个单元格的输出。当您有大量输出时,您可以通过单击输出的左侧面板来减少它所占用的空间。这将把输出变成一个滚动窗口。双击输出左侧以完全折叠输出面板。
您可以重复单击或双击的过程来更改查看“输出”面板的格式。
(Gif by Author),点击面板左侧可更改输出屏幕的视图
8.单元格执行功能:
Jupyter Notebook 具有某些单元执行特性,可以减轻程序员的工作负担。
- Shit+Enter 将运行当前单元格并突出显示下一个单元格,如果没有单元格,它将创建一个新的单元格。
- Alt+Enter 将运行当前单元格,插入一个新单元格并高亮显示它。
9.降价:
Jupyter 笔记本电池不仅可以运行代码片段,还可以用来写文本。减价单元格可用于编写文本描述。是比用评论更好的表达方式。
用法:
- 单击单元格将其转换为降价。
- 从下拉菜单中选择降价选项
(图片由作者提供),从暗码单元格到降价单元格
(来源)
10.在笔记本中运行不同语言的代码:
Jupyter Notebook cells 还可以使用 IPython magic 命令编译和运行不同语言的代码。使用 IPython Magics,在您想要使用该单元的每个单元的开头使用您的内核名称:
%%bash
%%HTML
%%python2
%%python3
%%ruby
%%perl
(图片由作者提供),jupyter 笔记本单元格中的 HTML 代码片段
11.多光标:
Jupyter Notebook 支持同时使用多个光标编辑代码。要立即选择要编辑的代码,按下Alt
键并用鼠标选择代码片段。选择之后,您现在可以一次使用多个光标编辑代码。
12.从 Jupyter 笔记本创建演示文稿:
Jupyter 笔记本可以用来创建 PowerPoint 风格的演示文稿。在这里,笔记本的每个单元或单元组可以被视为每个幻灯片。
- 首先,使用 conda:
conda install -c damianavila82 rise
安装上升 - 进入/退出上升幻灯片按钮出现在笔记本工具栏中。在视图>单元格工具栏>幻灯片显示下也会出现一个幻灯片显示选项
- 要准备幻灯片,点击视图>单元格工具栏>幻灯片,并为每张幻灯片选择 jupyter 笔记本单元格。
- 选择每张幻灯片后,单击笔记本工具栏中的“幻灯片放映”按钮。
访问此处了解详细的视频指南使用方法。
(来源)
13.分享 Jupyter 笔记本:
代码完成后,您有几个选项来共享您的 jupyter 笔记本。
- 下载你的 jupyter 笔记本为 HTML,pdf,ipynb,py 文件等。
- 您可以使用 JupyterHub 来创建一个多用户 Hub,它产生、管理和代理单用户 Jupyter 笔记本服务器的多个实例。
- 您可以直接从 jupyter 笔记本发布到 medium。阅读这个就知道步骤了。
14.在笔记本中绘图:
Jupyter 笔记本是用于数据分析和可视化的最佳工具。它可用于使用不同的 python 或 R 库生成不同类型的图。一些用于生成图的 python 库包括:
(来源),不同类型的地块
15.键盘快捷键:
快捷键的使用节省了程序员大量的时间,缓解了编码体验。Jupyter 笔记本有很多内置的键盘快捷键,你可以在**Help**
菜单栏下找到:**Help>Keyboard Shortcuts**
。
Jupyter Notebook 还提供了编辑键盘快捷键的功能,以方便程序员。您可以编辑键盘快捷键:**Help>Edit Keyboard Shortcuts**
。
(图片由作者提供),命令模式快捷键
(图片由作者提供),编辑模式快捷键
结论:
Jupyter Notebook 是数据科学领域工作人员使用的最好的可扩展工具之一,因为它具有交互式 UI。上面讨论的 15 个提示和技巧将帮助您轻松体验 jupyter 笔记本编码。它有很多本文没有讨论的内置魔法命令,你可以在这里阅读。让我知道你最喜欢的技巧和评论,如果你知道更多的技巧。
- 文章中使用的图片由作者引用或生成
感谢您的阅读
更有效使用 Jupyter 笔记本的 15 个技巧和窍门
用这些技巧优化你在 Jupyter 的工作
概观
在数据科学社区中,Jupyter notebook 是一个受欢迎的工具,被广泛采用。本文旨在分享一些很酷的技巧和窍门,帮助你在使用 Jupyter 笔记本时变得更有效率。了解如何从 Jupyter 执行终端命令,通过隐藏输出来加速您的笔记本,为您的笔记本添加额外的功能,等等!
提示#1 —使用常用快捷方式快速导航
知道这些捷径可以帮你节省时间。我用黄色突出显示了我经常使用并且发现非常有用的工具。如果您忘记了快捷方式,您可以随时进入命令模式并按 H 键查看完整列表。Jupyter 笔记本还允许你创建自己的快捷方式,如果你想。点击编辑快捷按钮来设计你自己的热键。
提示#2 —在输出中显示多个项目
Jupyter notebook 一次只显示一个输出,如下所示。在本例中,只显示了最后一个变量的输出。
但是,您可以添加下面的代码来显示单元格中的所有输出。请注意,现在两个变量都显示出来了。
技巧 3——向 Jupyter 笔记本添加图片
如果您想要插入图像,您必须首先将单元格类型从代码更改为标记。您可以在页面顶部的下拉框中完成此操作,或者进入命令模式并按 m 键。一旦单元格降价,只需将图片拖放到单元格中即可。
一旦您将图像放入单元格,应该会出现一些代码。运行单元格(Shift + Enter)来查看图像。
技巧 4——在 Jupyter 笔记本中直接执行 Shell 命令
与其让 Jupyter notebook 执行 shell 命令,不如使用感叹号(!)在你命令的开始。例如,您可以安装一个软件包。
!pip install matplotlib-venn
技巧 5——使用内置的魔法命令
神奇命令是有助于提高工作效率的特殊命令。
您可能最熟悉下面这个神奇的命令,它可以让您的绘图在笔记本中呈现。
%matplotlib inline
以下是一些其他有用的神奇命令:
**%pwd** #print the current working directory
**%cd** #change working directory
**%ls** #show contents in the current directory
**%load [insert Python filename here]** #load code into the Jupyter notebook
**%store** **[insert variable here]** #this lets you pass variables between Jupyter Notebooks
**%who** #use this to list all variables
对于%who,您也可以指定变量类型。例如,下面的代码将列出所有 int 类型的变量。
**%**who int
关于魔法命令的完整列表:
%lsmagic #show all magic commands
技巧#6 —测量单元执行时间
使用%%time
获得整个单元格的墙壁时间。
技巧 7——使用多光标加速工作
假设您有多行代码,如下所示,您想删除每行代码中的所有数字。你可以一次删除所有的数字,而不是一行一行的删除。
按住Alt
键,选择整个单元格内容。按左箭头,您将看到现在有多个光标(下面代码片段中的黑线),每行一个。从这里,你可以点击delete
键删除所有的数字。如果您想将光标移动到末尾,请使用右箭头键。
提示# 8——为代码完成创建一个警报
如果您有需要一段时间运行的代码,您可以添加代码,让 Python 告诉您它何时完成运行。
对于 Windows:
**import** winsound
duration **=** 1000 *#milliseconds* freq **=** 440 *#Hz* winsound.Beep(freq, duration)
这将在代码完成时发出警报。
对于 Mac:
**import** os
os.system('say "your program has finished"')
来源:https://stack overflow . com/questions/16573051/sound-alarm-when-code-finishes/16573339 # 16573339
技巧 9 —添加 Jupyter 笔记本扩展以提高工作效率
Jupyter 笔记本扩展是为您提供更多功能的简洁工具。
以下是您可以启用的可配置扩展列表。一些对我有用的是可折叠标题,代码折叠,便笺和拼写检查。
我建议查看这些扩展,找到对您的工作有用的内容。
如需在计算机上安装 Jupyter 笔记本扩展的帮助,请点击此链接。https://jupyter-contrib-nb extensions . readthedocs . io/en/latest/install . html #
提示#10 —展示方法文档
如果您忘记了特定方法的参数,请使用 Shift + Tab 获取该方法的文档。单击右上角的+箭头展开文档。
提示#11 —扩展熊猫中显示的列数和行数
pandas 表格中显示的行数和列数是有限的,但是您可以根据自己的喜好自定义限制。
这里,我将行和列的最大输出设置为 500。
**import** pandas **as** pd
pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 500)
提示# 12——加粗或着色你的输出,让它突出
为了突出输出的重要部分,您可以添加粗体和/或颜色。我还没有试过这个,但我认为这是 Stas Bekman 提供的一个非常酷的技巧。参见下面的片段。
技巧# 13 —隐藏输出以提高笔记本电脑速度
你发现你的 Jupyter 笔记本滞后了吗?这可能是因为你有很多正在渲染的图形。
将鼠标悬停在图表左侧的区域(见下面的红色矩形),双击该区域以隐藏输出。这将大大加快你的笔记本电脑的速度!
技巧#14 —隐藏恼人的 Matplotlib 文本
当你创建一个图表时,你可能会在图表的正上方看到这个文本“<matplotlib.collections.pathcollection at=“”>”(下面突出显示黄色)。</matplotlib.collections.pathcollection>
我个人觉得那很烦人,所以要隐藏那一行文字,可以在代码末尾加个分号。
提示# 15——组织和记录你的分析
使用 markdown 单元格,很容易记录您的工作。您可以使用“#”符号创建字体层次结构来组织笔记本,如下所示。
一旦上面的执行,这就是字体层次的样子。
如果您创建了这些不同的标题,并将其与技巧 9 中提到的可折叠标题扩展结合起来,那么隐藏一大块单元格以及能够快速导航和移动部分将会非常有用。
感谢阅读!如果你有任何喜欢的技巧和诀窍没有在文章中列出,我很乐意在评论中听到它们。
要获得满足您的数据科学和数据分析需求的更多便利文章,请查看以下内容:
如果你想下载 Jupyter 笔记本,你可以在这里找到它。
创建熊猫数据框架的 15 种方法
关于用熊猫创建数据框的不同方法的学习参考
作者图片
动机
在进行 EDA(探索性数据分析)或开发/测试模型时,使用强大而优雅的 pandas DataFrame 来存储和操作数据是非常常见的。通常,它从“创建数据帧”开始。
我在用 pandas 开始一些 EDA 或建模时,通常会遇到以下场景:
我需要快速创建一些记录的数据帧来测试代码。
我需要将 csv 或 json 文件加载到数据帧中。
我需要从网页中读取一个 HTML 表格到数据帧中
我需要在不创建 json 文件的情况下将类似 json 的记录加载到 dataframe 中
我需要在不创建 csv 文件的情况下将类似 csv 的记录加载到数据帧中
我需要合并两个数据帧,垂直或水平
我必须将数据帧中的一列转换成一个热列
每一个场景都让我每次都用谷歌搜索语法或查找文档,直到我通过几个月或几年的练习慢慢记住它们。
理解了查找的痛苦,我认为在 pandas 中创建数据帧的多种方法的快速查找表可以节省一些时间。这可能会帮助学习者,直到他们成为经验丰富的数据分析师或数据科学家。
这里有几种方法可以创建一个数据框架。如果任何读到这里的人发现了其他优雅的方式或方法,请随时评论或给我发消息;我很乐意将它们添加到您的参考页面中。
使用 DataFrame 构造函数 pd。数据帧()
pandas DataFrame()构造函数提供了许多不同的方法来创建和初始化 DataFrame。
- 方法 0 —初始化空白数据帧,并不断添加记录。columns 属性是成为数据帧的列的字符串列表。loc 方法通过索引引用数据帧行(类似于列表)。例如,数据帧 df 中的第一条记录将被 df.loc[0]引用,第二条记录将被 df.loc[1]引用。通过设置 df.loc[i] = <记录属性为列表>,可以直接在位置 I 增加一行
*# method 0**# Initialize a blank dataframe and keep adding*df = pd.DataFrame(columns = ['year','make','model'])*# Add records to dataframe* *using the .loc function*df.loc[0] = [2014,"toyota","corolla"]
df.loc[1] = [2018,"honda","civic"] df
- 方法 1 —在 DataFrame 构造函数中使用 numpy 数组。传递 2D numpy 数组—每个数组都是数据帧中的相应行
*# Pass a 2D numpy array - each row is the corresponding row required in the dataframe*
data = np.array([[2014,"toyota","corolla"],
[2018,"honda","civic"],
[2020,"hyndai","accent"],
[2017,"nissan","sentra"]])
*# pass column names in the columns parameter*
df = pd.DataFrame(data, columns = ['year', 'make','model'])
df
- 方法 2 —在 DataFrame 构造函数中使用字典。字典键成为数据帧中的列名。字典值成为列的值。列值根据指定的顺序组合在一行中
data = {'year': [2014, 2018,2020,2017],
'make': ["toyota", "honda","hyndai","nissan"],
'model':["corolla", "civic","accent","sentra"]
}
*# pass column names in the columns parameter*
df = pd.DataFrame(data)
df
- 方法 3 —在 DataFrame 构造函数中使用字典列表。每本词典都是一个记录。字典键成为数据帧中的列名。字典值成为列的值
data = [{'year': 2014, 'make': "toyota", 'model':"corolla"},
{'year': 2018, 'make': "honda", 'model':"civic"},
{'year': 2020, 'make': "hyndai", 'model':"nissan"},
{'year': 2017, 'make': "nissan" ,'model':"sentra"}
]
*# pass column names in the columns parameter*
df = pd.DataFrame(data)
df
- 方法 4 —在 from_dict 方法中使用字典。字典键成为数据帧中的列名。字典值成为列的值。列值根据它们被指定的顺序组合在一行中*。*
data = {'year': [2014, 2018,2020,2017],
'make': ["toyota", "honda","hyndai","nissan"],
'model':["corolla", "civic","accent","sentra"]
}
*# pass column names in the columns parameter*
df = pd.DataFrame.from_dict(data)
df
注意 : 虽然方法 2 和方法 4 都是字典,但两者还是有区别的。使用 from_dict,我们能够选择任何列作为数据帧的索引。如果我们上面使用的列名需要成为索引——比如早期数据的转置——会怎么样?为转置后生成的列指定 orient = "index "并传递列名
df = pd.DataFrame.from_dict(data, orient='index',columns=['record1', 'record2', 'record3', 'record4'])
df
使用 pandas 库函数— read_csv、read_json
- 方法 5 —使用 pandas 库的 read_csv 方法从 csv 文件中获取。这是为 EDA 创建数据帧的最常见方式之一。csv 文件中的分隔符(或分隔符)、标题和索引列的选择是可配置的。默认情况下,分隔符是逗号,标题是从第一行推断出来的(如果找到的话),索引列不是从文件中提取的。该文件如下所示:
df = pd.read_csv('data.csv' , sep = ',', header = 'infer', index_col = None)
df
- 方法 6 —使用熊猫库*的 read_csv 方法从一串 csv 记录中。*当我们不想创建文件但手头有记录结构时,这特别有用——我们所做的就是使用 StringIO 库函数将 csv 记录“字符串”转换为文件句柄。
from io import StringIO*# f is a file handle created from a csv like string*f = StringIO('year,make,model\n2014,toyota,corolla\n2018,honda,civic\n2020,hyndai,accent\n2017,nissan,sentra')df = pd.read_csv(f)
df
- 方法 7 —当 json 文件每行都有记录时,使用 pandas 库的 read_json 方法从 json 文件中获取。设置 lines=True 意味着每行将文件作为 json 对象读取。下面是 json 文件的样子:
df = pd.read_json('data.json',lines=True)
df
- 方法 8 —使用 pandas 库的 read_json 方法从一串 json 记录中。当我们不想创建文件,但手头有 json 记录结构时,这特别有用。
from io import StringIO*# f is a file handle created from json like string*f = StringIO('{"year": "2014", "make": "toyota", "model": "corolla"}\n{"year": "2018", "make": "honda", "model": "civic"}\n{"year": "2020", "make": "hyndai", "model": "accent"}\n{"year": "2017", "make": "nissan", "model": "sentra"}')df = pd.read_json(f,lines=True)
df
- 方法 9 — 最有趣的方法之一 —使用 read_html 中内置的 pandas 库从 HTML 页面中读取表格。这将生成一个数据帧列表;在后台,它抓取 html 页面中的任何<表>标签,并试图将该表捕获到一个数据帧中。即使页面中只有一个表,也会创建一个数据帧列表,因此需要使用列表下标来访问它。下面的例子展示了如何捕获一个 HTML 页面,然后加载表——这使用请求库来获取 HTML 内容。
import requests
url = 'https://www.goodcarbadcar.net/2020-us-vehicle-sales-figures-by-brand'r = requests.get(url)*#if the response status is OK (200)*
if r.status_code == 200: *# from the response object, pass the response text
# to read_html and get list of tables as list of dataframes*
car_data_tables = pd.read_html(r.text)
*# display the first table*
car_data_tables[0]
从其他数据帧
- 方法 10 —作为另一个数据帧的副本*。*
df_copy = df.copy() # copy into a new dataframe object
df_copy = df # make an alias of the dataframe(not creating
# a new dataframe, just a pointer)
注意:上面显示的两种方法是不同的——copy()函数创建一个全新的独立于原始数据帧的数据帧对象,而变量 copy 方法只是为原始数据帧创建一个别名变量——没有创建新的数据帧对象。如果原始数据帧有任何更改,也会反映在别名中,如下所示:
*# as a new object using .copy() method - new dataframe object created independent of old one*a = pd.DataFrame({'year': [2019],'make': ["Mercedes"],'model':["C-Class"]})b = a.copy()*# change old one*
a['year'] = 2020*# new copy does not reflect the change*
b
*# as variable copy - new variable is just an alias to the old one*a = pd.DataFrame({'year': [2019],'make': ["Mercedes"],'model':["C-Class"]})b = a*# change old one*
a['year'] = 2020*# alias reflects the change*
b
- 方法 11 —垂直连接—一个在另一个之上
data1 = [{'year': 2014, 'make': "toyota", 'model':"corolla"},
{'year': 2018, 'make': "honda", 'model':"civic"},
{'year': 2020, 'make': "hyndai", 'model':"nissan"},
{'year': 2017, 'make': "nissan" ,'model':"sentra"}
]df1 = pd.DataFrame(data1)data2 = [{'year': 2019, 'make': "bmw", 'model':"x5"}]df2 = pd.DataFrame(data2)*# concatenate vertically
# NOTE: axis = 'index' is same as axis = 0, and is the default
# The two statements below mean the same as the one above*df3 = pd.concat([df1,df2], axis = 'index') *#OR*df3 = pd.concat([df1,df2], axis = 0)*# OR*df3 = pd.concat([df1,df2])df3
在上面的例子中,第二个数据帧的索引保留在连接的数据帧中。要重置索引以匹配整个数据帧,请使用数据帧的 reset_index()函数
df3 = pd.concat([df1,df2]).reset_index()*#OR*df3 = pd.concat([df1,df2], ignore_index = True)
df3
- 方法 12 —水平连接—并排追加,不用任何键连接
data1 = [{'year': 2014, 'make': "toyota", 'model':"corolla"},
{'year': 2018, 'make': "honda", 'model':"civic"},
{'year': 2020, 'make': "hyndai", 'model':"nissan"},
{'year': 2017, 'make': "nissan" ,'model':"sentra"}
]df1 = pd.DataFrame(data1)data2 = [{'year': 2019, 'make': "bmw", 'model':"x5"}]df2 = pd.DataFrame(data2)df3 = pd.concat([df1,df2], axis = 'columns')*#OR*df3 = pd.concat([df1,df2], axis = 1)df3
**注意:**对于水平拼接,
- 数据帧的行按照它们的位置(索引)顺序连接
- 如果其中一个数据帧中有任何记录丢失,则串接的数据帧中的相应记录将丢失。这与在索引上进行左外连接是一样的(参见下面的合并)
- 方法 13 —水平连接—相当于 SQL 连接。
内部连接
data1 = [{'year': 2014, 'make': "toyota", 'model':"corolla"},
{'year': 2018, 'make': "honda", 'model':"civic"},
{'year': 2020, 'make': "hyndai", 'model':"nissan"},
{'year': 2017, 'make': "nissan" ,'model':"sentra"}
]df1 = pd.DataFrame(data1)data2 = [{'make': 'honda', 'Monthly Sales': 114117},
{'make': 'toyota', 'Monthly Sales': 172370},
{'make': 'hyndai', 'Monthly Sales': 54790}
]df2 = pd.DataFrame(data2)*# inner join on 'make'
# default is inner join*df3 = pd.merge(df1,df2,how = 'inner',on = ['make'])
df3 = pd.merge(df1,df2,on = ['make'])df3
左连接
*# for a left join , use how = 'left'*
df3 = pd.merge(df1,df2,how = 'left',on = ['make'])df3
- 方法 14 —作为另一个数据帧的转置
*# To transpose a dataframe - use .T method*
df4 = df3.T*# To rename columns to anything else after the transpose*
df4.columns = (['column1','column2','column3','column4'])df4
- 方法 15 —使用 pandas get_dummies 函数转换为一个热点列(用于学习算法建模)。
One-Hot 基本上是将一个列值转换成一组派生列,就像二进制表示一样。one-hot 列集合中的任何一个都是 1,其余的是 0。
如果我们知道一辆汽车的车身类型=轿车、SUV、货车、卡车,那么车身= '轿车’的丰田卡罗拉将成为 one-hot 编码为
body_SEDAN body_SUV body_VAN body_TRUCK
1 0 0 0
每个热列的格式基本上都是 <原始 _ 列名> _ <可能 _ 值>
下面是一个例子:
data1 = [{ 'make': "toyota", 'model':"corolla", 'body':"sedan"},
{'make': "honda", 'model':"crv", 'body':"suv"},
{'make': "dodge", 'model':"caravan", 'body':"van"},
{'make': "ford" ,'model':"f150", 'body':"truck"}
]df1 = pd.DataFrame(data1)
df2 = pd.get_dummies(df1,columns = ['body'])
df2
我希望这个“备忘单”在学习 EDA 或建模的初始阶段有所帮助。当然,随着时间的推移和不断的练习,所有这些都会被记住。
那么祝你一切顺利:)
如果您有任何其他创建数据帧的好方法,或者有任何新的函数可以为某些特定目的创建数据帧,请分享您的宝贵意见。
这个笔记本的 git 链接是这里的。
数据工程中听到的 150 多个概念
面向数据工程师的综合词汇表
古斯塔夫·古尔斯特兰德在 Unsplash 拍摄的照片
数据工程是一个很有吸引力的领域。它始于你,一个单独的数据文件和一台个人电脑,终于堆积如山的数据和雄伟的“云”。
在本文中,我整理了一个词汇表,包含了数据工程师日常生活中听到的 150 个概念。我将这个术语表分为几个主题,如数据、模式、数据编码、分布式系统、架构、即服务、云、数据存储、缓存、数据结构、硬件、数据安全、和措施。
概念用足够多的行数来解释,让你理解背后的意思。每当我使用其他信息来源时,我都会在本节末尾引用该来源。如果您想深入了解,请考虑这些来源。我尽最大努力选择对每个概念都有最佳解释的资料来源。
该术语表在许多方面都很有用,其中包括:
- 您想学习数据工程,并将这个术语表用作路线图。
- 你是一名数据工程师,你想更新数据工程的概念。
- 你正在准备一次数据工程面试,你想确保没有任何主题/概念逃过你的注意。
- 你是一名面试官,你用这个词汇表作为一个问题库。
在查看术语表之前,我有两件事需要澄清:
- 这个词汇表将来肯定会更新。如果我遗漏了什么,请写一个回复,我会确保把它包括在内。
- 我跳过了解释特定的工具,比如 Python、Spark 或 Kafka。这些是我正在写的另一篇关于数据工程中听到的顶级技术的文章的一部分。(那篇文章一发表,我就会在这里附上链接)。
快乐学习。
快注意!如果你对数据工程感兴趣,也可以看看我的另一篇文章“开发人员应该知道的 50 多个实时数据处理概念”。
下面是在流数据处理领域经常听到的一组概念。我为每一个概念量身定做…
medium.com](https://medium.com/@dardanx/50-real-time-data-processing-concepts-devs-should-know-830ee0441843)
#数据
事实的集合,如数字、文字、测量和对现象的观察。
**#原始数据:**原始状态下未加工的数据。(即。因为它是从源传送的)。
**#已处理数据:**处理后的原始数据。处理的主要目的是使数据比原始数据更容易使用。
**#大数据:**描述由于的量、速度、多样性、准确性而无法用传统数据处理工具处理的数据。当有人问你什么是大数据时,请阅读我的文章中关于大数据的不同定义的更多信息。
**#数据质量:**评估数据是否服务于特定用例的预期目的的过程。在评估数据质量时,我们通常检查数据的准确性、完整性、可靠性、相关性和及时性。更多信息,请阅读雷切尔·利维·萨芬关于数据质量的 5 个特征的文章。
**#主数据:**根据 Gartner ,“主数据是一组一致且统一的标识符和扩展属性,用于描述企业的核心实体,包括客户、潜在客户、公民、供应商、地点、层级和会计科目表。”[1].
**# SSOT:(单一事实来源)😗*公司中的一种数据组织,数据集中保存,可从外部其他组件和人员访问。如果对系统中其他地方的数据进行了更改,这种更改应该反映在 SSOT 中。例如,如果一家公司在中央数据库中保存客户联系信息,如果联系信息发生变化,只有一个地方需要更新(即 SSOT)。
**#时间序列数据:**收集的数据点以及指示数据点生成时间的时间戳。例子包括*监控数据、传感器数据、网络数据、用户点击数据、*等。
Cookie :根据维基百科的说法,“……是用户在浏览时,由网络浏览器从网站发送并存储在用户电脑上的一小段数据。”[2].
**#开放数据:**根据维基百科的说法,“开放数据是一种理念,即一些数据应该免费提供给每个人,让他们按照自己的意愿使用和重新发布,而不受版权、专利或其他控制机制的限制。[3].
**#个人数据:**根据欧盟委员会的规定、“个人数据是指任何与已识别或可识别的活着的个人相关的信息。不同的信息收集在一起可以识别特定的人,也构成个人数据。”[4].
[1]主数据管理。https://www . Gartner . com/en/information-technology/glossary/master-data-management-MDM
[2] HTTP cookie。https://en.wikipedia.org/wiki/HTTP_cookie
[3]开放数据。https://en.wikipedia.org/wiki/Open_data
[4]个人资料:https://EC . Europa . eu/info/law/law-topic/data-protection/reform/what-Personal-data _ en
#数据序列化
数据序列化(编码、编组)是将结构化数据转换为一种格式的过程,这种格式允许以允许恢复其原始结构的形式共享或存储数据[1](Python 的搭便车指南)
# Parquet: 以列方式对数据进行编码。在 parquet 中编码的数据是二进制格式的(因此不可读)。查询(尤其是聚合)在 parquet 中编码的数据之上执行得更快。由于高效的列式压缩,数据量大大减少。压缩是逐列进行的,因此不同的列可以使用不同的编码类型。
# Avro: 以行方式编码数据。Avro 中编码的数据是二进制格式(因此不可读)。指定用 JSON 编码的数据的模式,该模式定义与数据一起写入一个文件。Avro 的一个关键特性是对随时间变化的模式的健壮支持(模式进化)。
**# JSON(JavaScript Object Notation)😗*这是一种广泛使用的 key: value 数据编码格式。JSON 提供了一种轻量级的数据交换格式。对人类来说,读和写很容易。机器很容易解析生成。
YAML: (YAML 不是标记语言):这是一种人类可读的数据编码格式。YAML 通常用于配置文件,并以其极简的语法著称。
**# XML(可扩展标记语言)😗*是一种标记语言,它定义了一组规则,用于以人类可读和机器可读的格式对文档进行编码。为了执行编码,XML 使用开始和结束标记。属性进一步丰富了这些标签。
**# CSV(逗号分隔值)😗*一种编码格式,将值存储在由分隔符(大多数情况下是逗号,但也可能是分号、制表符或其他字符)分隔的行中。文件的每一行都是一条数据记录。CSV 文件通常存储表格数据,在这种情况下,每一行都有相同数量的字段。CSV 文件是人类可读的。
[1]序列化。https://docs.python-guide.org/scenarios/serialization/
#模式
描述数据在数据存储区中的组织方式的框架/结构(数据库、文件等)
# Schema-on-write: 我们在处理数据之前定义模式。例如,如果不首先定义模式(表、列名、数据类型等等),我们就不能在 MySQL 中存储和查询数据。比如说,当我们因为列的数据类型发生变化而需要更改模式时,就会出现挑战。我们需要删除模式并再次加载所有数据。多见于 SQL 数据库。
# Schema-on-read: 我们在定义模式之前处理数据。在这种情况下,我们在数据到达时立即存储,而不必将其转换为严格的格式。读取数据的时刻就是推断模式的时刻。它主要出现在 NoSQL 的数据库中。一篇值得一读的好文章是 luminousmen 的读时模式与写时模式。
# Schema evolution: 数据不断发展,模式应该反映对数据所做的更改。当发展模式时,为了不丢失它,使它与您拥有的数据兼容是很关键的。在添加新列或需要更改列的数据类型时,模式演化是必要的。
#分布式系统
“…分布式系统是位于不同机器上的独立组件的集合,这些组件为了实现共同的目标而相互共享消息。”[1] ( 汇合)
#集群:它是一组相互连接的机器(节点),它们一起工作来完成任务。机器之间的连接是在软件级别完成的。从外部看,群集看起来像一个系统。
# Node: 作为集群一部分的单个机器/服务器/虚拟机。
**#商用硬件:**据 Suse ,“商用硬件,有时被称为现成的硬件,是一种相对便宜、可广泛获得且易于与其他同类硬件互换的计算机设备或 IT 组件。”[2].
**#可伸缩性:**分布式系统的一种品质,能够通过向系统添加或移除资源来应对负载(请求、数据等)。
**#容错:**分布式系统的一种品质,即使部分系统出现故障,也能持续工作。
# Robustness: 分布式系统的一种质量,不仅在预期情况下,而且在强调设计者假设的情况下都表现良好。
**#滚动升级:**分布式系统中升级软件的一种策略,一次将更新的软件逐步部署到几个节点,而不是同时部署到所有节点。
**#垂直扩展:**通过在单台机器上添加更多资源进行扩展,如 CPU 、 RAM、或磁盘。
**#水平扩展:**通过向现有资源池中添加其他机器来进行扩展。
#复制:在通过网络连接的不同机器上复制相同的数据。通过复制数据,我们确保了系统的容错能力。当复制的数据分布在不同的地理位置时,我们减少了延迟或读取。
# Partitioning: 将一个大数据集拆分成若干部分,分布在不同的节点上。当查询在不同的节点上工作时,分区通过分布来确保可伸缩性。
**#数据局部性:**将计算移动到数据驻留的地方,而不是将数据移动到计算驻留的地方。使用大数据系统是为了通过移动计算而不是数据来减少网络流量。
**#重新平衡分区:**将数据从一个集群节点移动到另一个集群节点的过程。通常在数据分区大小不均匀增长时,或者在集群中添加或删除节点时执行。
# CAP 定理:It陈述了一个分布式系统可能最多同时具备以下两个品质:一致性,可用性,分区容忍度。详细讲这个的一篇很棒的文章是什么是 CAP 定理?。
****#写后读一致性:在写入更改后立即查看更改(读取最新数据)的能力。
****#最终一致性:在对系统进行写入/更新后,系统需要一些时间来更新您的写入影响的所有节点的数据点。如果发出立即读取请求,则有机会接收旧数据。
**# **小文件问题:在 Hadoop 中,当数据存储在 HDFS 的许多小文件中时,计算性能会显著下降。
_____________
[1]分布式系统。https://www.confluent.io/learn/distributed-systems/
[2]商用硬件。https://susedefines.suse.com/definition/commodity-hardware/
#建筑
“……计算系统的总体设计及其组件之间的逻辑和物理相互关系被定义为体系结构。该架构规定了整个系统中使用的硬件、软件、访问方法和协议[1].(高德纳)****
#共享内存架构:将 CPU、RAM 芯片、磁盘等多种资源连接在一起,形成一台机器。在这种资源组织中,任何 CPU 都可以访问内存或磁盘的任何部分。这些机器的容错能力较差,可伸缩性是通过增加 CPU、RAM 芯片和磁盘(即垂直缩放)。
#无共享架构:商用机器通过网络链接在一起,独立访问自己的机器。可伸缩性是通过向资源池添加其他独立的机器来实现的。节点之间的协调是在软件级别完成的。
# Producer: 产生事件(数据)的组件。例如,考虑一个每当客户下订单时都会生成一个事件的软件组件。
# Consumer: 消费事件的组件。例如,考虑一个软件组件,它通过向进行购买的用户发送确认电子邮件来对收到的订单事件做出反应。
****#事件流架构:由产生事件流的生产者和消费这些事件的消费者组成的架构。事件有不同的类型,如:放入购物车的产品、订购的产品、配送的订单等。消费者组件消费这些事件并对其做出反应。
****#批处理架构:由一个或多个数据存储(数据湖、数据库等)组成的架构,其中收集数据并定期(例如每天一次)运行作业,以处理大块数据(或所有数据)来转换或执行分析。处理后的数据以期望的格式进一步存储在目标系统中。
****# Lambda 架构:将流和批处理的优势结合到一个架构中。流式处理部分负责实时处理传入的数据以获得近似的结果,而批处理部分负责处理在某个时间间隔内收集的整组数据以从数据中获得精确的结果。
#高可用架构:不会受到负载、错误和外部威胁(自然灾害)的负面影响,从而牺牲其性能和可用性的架构。这种体系结构包含地理上分散的组件,这些组件可以根据传入的负载进行伸缩,并且副本可以在部分系统出现故障时升级。
#无服务器计算:**据维基百科“它是一种云计算执行模型,由云提供商运行服务器,并动态管理机器资源的分配。”【2】。
****#无服务器架构:组件完全是无服务器组件的架构。这种架构不太复杂,运行成本更低,开发和维护所需的工程时间也更少。
****#增量架构:一种从小规模开始、模块化、专注于领域并由高度解耦的组件组成的架构。
****# ETL(Extract Transform Load):描述了从多个源中提取数据,将它们转换/处理成所需的格式,并将数据加载到最终目标中作为数据库或数据仓库或数据湖的过程。
#实时处理:数据可用后立即处理。例如雷达等关键系统。
****# 近实时:当数据可用后,在允许的几秒或几分钟的等待时间内进行处理。
_____________
[1]建筑。https://www . Gartner . com/en/information-technology/glossary/architecture
[2]无服务器计算。https://en.wikipedia.org/wiki/Serverless_computing
#作为服务
描述产品(软件、基础架构等)的业务模型,该产品由所有者维护和运行,并以订购或现购现付的方式向客户提供
******# IaaS(基础设施即服务):提供计算基础设施(虚拟机、物理机)、对象存储、文件系统、负载平衡器、网络等。IaaS 例子有:亚马逊 EC2 、 Windows Azure 、谷歌计算引擎、等。
****# PaaS(平台即服务):据微软“…PaaS 是云中的一个完整的开发和部署环境,其资源使您能够交付从简单的基于云的应用程序到复杂的、支持云的企业应用程序的一切。”[1].PaaS 的例子有 AWS 弹性豆茎、 Windows Azure 、 Heroku 、 Google App Engine 等。
****# SaaS(软件即服务):由一家公司开发、运行和维护的软件,该公司以订阅的方式向客户授予许可。SaaS 的例子有: Google Apps 、 Dropbox 和 Salesforce 。
FaaS(作为服务的功能):这也被称为无服务器计算。这使得开发人员可以只编写业务逻辑并执行它,而无需处理资源供应和管理。
****# BaaS(后端即服务):根据cloud flare“BaaS 是一种云服务模式,开发人员将 web 或移动应用程序的所有后台工作外包出去,这样他们只需编写和维护前端。”[2].
_____________
[1]什么是 PaaS。https://azure.microsoft.com/en-us/overview/what-is-paas/
[2]支持和服务。https://www . cloud flare . com/learning/server less/glossary/back end-as-a-service-baas/
#云
“…指通过互联网访问的服务器,以及在这些服务器上运行的软件和数据库。”[1].(云闪)
*#云计算:*根据微软“云计算是通过互联网交付计算服务,包括服务器、存储、数据库、网络、软件、分析和智能。【②】。
****#虚拟化:根据 RedHat " … 虚拟化是一种技术,它允许您从单个物理硬件系统创建多个模拟环境或专用资源。"[3].
# Hypervisor: 根据Vmware“Hypervisor 也称为虚拟机监视器或 VMM,是创建和运行虚拟机(VM)的软件。虚拟机管理程序允许一台主机通过虚拟共享其资源(如内存和处理能力)来支持多个来宾虚拟机。”[4].
****# AWS(Amazon Web Services):一个提供了很多服务的云平台,其中以下服务在数据工程中使用最多: S3 (简单存储服务) EMR (弹性地图还原) Kinesis ( 流,分析,消防水管,数据管道,红移
# Microsoft Azure: 一个提供了很多服务的云平台,其中以下服务在数据工程中使用最多: Blob Storage , Azure Databricks , Azure Stream Analytics , HDInsight , Azure Cosmos DB , Event Hubs , Azure Data Lake Storage ,
****# GCP(Google Cloud Platform):一个提供很多服务的云平台,其中在数据工程中使用最多的有:云存储,计算引擎,大查询,数据流,云函数,云 SQL ,云 Bigtable。
****#现收现付:云提供商使用的一种支付模式,您只需为您需要的个人服务付费,只要您使用这些服务,不需要长期合同或复杂的许可。您只需为所消费的服务付费,一旦您停止使用这些服务,就不会产生额外的费用或终止费。
****#按需服务:云计算服务的一个特性,允许用户随时随地根据需要提供云资源。
****# Lambda Functions:AWS Lambda 中的一个函数,您可以在其中运行代码,而无需提供或管理服务器。AWS Lambda 仅在需要时(响应事件,或通过 API 调用触发时)执行您的代码,并自动伸缩。类似的还有微软 Azure 的 Azure 功能和谷歌云平台的云功能。
****#云迁移:这是将数据库、应用程序和 It 流程从内部转移到云或从一个云转移到另一个云的过程。
_____________
【1】什么是云。https://www . cloud flare . com/learning/cloud/what-is-the-cloud/
【2】什么是云计算。https://azure . Microsoft . com/en-us/overview/what-is-cloud-computing/
[3]云与虚拟化。https://www . red hat . com/en/topics/云计算/云计算与虚拟化
[4]虚拟机管理程序。https://www.vmware.com/topics/glossary/content/hypervisor
#数据存储
数据存储库是用于持久存储和管理数据集合的存储库,不仅包括数据库等存储库,还包括文件等更简单的存储类型[1].(维基百科)
#数据库:根据维基百科“数据库是一个有组织的数据集合,通常通过计算机系统以电子方式存储和访问。” [2]。
#关系数据库(SQL): 数据用实体(表)和属性(列)组织的数据库,其中关系表示表之间的连接(关系)。一些比较知名的关系数据库有: MySQL , SQL Server , PostgreSQL , Oracle。
# Table: 关系数据库中的表表示以表格格式构造相关数据的唯一实体。
******# **属性(列,字段,特征,特性):表示表格中的一列数据。例如,表“Car”包含“brand”作为其属性之一。
# Record (tuple,data point): 表格中的一行。
# Query: 对数据库的定制请求,用于检索必要的数据。结果可能由单个表或多个表的数据组成。
****# RDBMS(关系数据库管理系统):用于维护关系数据库的软件系统。
****#主键:一个或多个列的组合,为表中的每条记录生成一个标识符。主键代表每行的唯一值。例如,列" name" 不是主键,但是" passport_id" 是主键。
#规范化:根据维基百科“数据库规范化是 按照一系列所谓的范式 1NF、2NF、3NF 和 BCNF 来结构化关系数据库的过程,以减少数据冗余,提高数据完整性。”【3】。数据完整性是通过确保在插入、更新和删除的情况下不会发生异常来实现的。
# Transaction: 事务是一个逻辑工作单元,包含一个或多个 SQL 语句,在数据库中执行定义的操作。
#ACID: 描述了一组保证,如原子性、一致性、隔离性和持久性,数据库事务做出这些保证以确保即使在错误、电源故障等情况下的有效性。****
# Index :在数据库中执行查询时,需要快速定位到所需的数据。索引有助于这一点。当您索引一个列时,将会创建一个数据结构。这个数据结构将保存列值和数据在磁盘中存储位置的指针。这个数据结构主要是一个 B 树,但它可以是任何东西。当在索引列中执行查询时,可以快速找到所需的记录,从而避免了扫描整行的最坏情况。
****# Hash 函数:是将任意长度的给定值转换成另一个固定大小值的算法。哈希函数的输出称为哈希值。最著名的哈希算法是 MD5(消息摘要 5)和 SHA(安全哈希算法)1 和 2。
# 非关系数据库(NoSQL): 所有以其他格式而非表格组织数据的数据库都属于这一类。在这里你可以找到以文档、分栏、键值、和图形格式组织数据的数据库。
# Key: Value 数据库:**以“Key:Value”格式存储数据——也称为字典或散列表。使用键存储和检索数值。每个记录可能有不同的数量和不同类型的字段。其他数据库,例如文档数据库,是建立在" key: value" 数据库之上的。例子有 Redis , Couchbase , Hazlecast , Memcached , ArangoDB 等。**
******#面向文档的数据库:文档就是关系数据库中的一行。这些数据库以“key:value”格式存储数据,其中的值以 JSON、XML 或 YAML 或 BSON 等二进制格式编码。文档可以有灵活数量的文件和数据类型。通过查询文档的内容来检索数据。例子有 MongoDB 、 Couchbase 、 CouchDB 、 RethinkDB 、 Elasticsearch 、 ArangoDB 等。
#图形数据库:**以图形格式组织数据,其中顶点(节点)表示一个实体,如一个人和表示两个顶点之间关系的边。用于存储适合这种组织模式的数据,如社交网络数据、公共交通、网络拓扑等。例子有 AllegroGraph 、 ArangoDB 、 Apache 、 Giraph 、 Neo4J 、 OrientDB 等。
**#面向列的数据库:**以列而不是行来组织数据。这些数据库在分析查询处理方面非常有效。例子有亚马逊 DynamoDB 、 Bigtable 、 Cassandra 、Scylla、 HBase 、 Hypertable、等。
#内存数据库:主要依靠内存进行数据存储的数据库,与将数据存储在磁盘上的数据库形成对比。这些数据库在游戏和实时分析等响应时间至关重要的环境中非常有用。例如 Redis、Hazelcast、H2、Memcached 等。
******# 时序数据库:针对时序数据优化的数据库。这些数据库附带了许多功能,便于您处理时间序列数据。例子有 InfluxDB,普罗米修斯,时标 DB,德鲁伊,等。
# Collection: 什么表是关系数据库,集合是非关系数据库。集合可以存储文档,即使它们具有不同的结构。
# Document: 什么行在关系数据库,文档在非关系数据库。
****#数据仓库:这是一个中央存储库,收集了来自不同来源的数据。此外,数据仓库为 BI(商业智能)提供了分析和报告功能。通常,数据仓库会保存数兆字节或数千兆字节的结构化数据。数据仓库解决方案的例子有 Oracle 、红移、 MarkLogic 等。
****#数据湖:数据湖简单来说就是用来存储来自各种数据源的各种格式的原始数据的存储器。数据湖的例子有 AWS S3 、 Azure Blob、Google 云存储等。
# OLAP(在线分析处理)😗*根据 IBM ,“作为数据仓库实现的核心组件,OLAP 为商业智能(BI)和决策支持应用提供了快速、灵活的多维数据分析。”[4].在 OLAP,通常是历史数据—比如说过去 5 年—被查询。这种处理的一个例子是“公司 X 比较地点 A2020 年第一季度与第二季度的销售额”。
****# OLTP(在线事务处理):描述了在数据仓库之外完成的其他处理。例如,在数据库中插入、删除、更新少量数据的查询就属于这一类。OLTP 涉及电子商务网上银行、POS 终端等的日常运营。
****#脏读:当事务 B 从数据库中读取从事务 A 写入的数据,而 A 尚未提交或中止时。
****#脏写:当事务 B 覆盖事务 A 写入的数据且 A 尚未提交或中止时。
*#文件存储:*根据 IBM 的说法,“文件存储是一种分层存储方法,用于在计算机硬盘或网络附加存储(NAS)设备上组织和存储数据。在文件存储中,数据存储在文件中,文件组织在文件夹中,文件夹组织在目录和子目录的层次结构下。【⑤】。
#块存储:**数据被分割成块,然后存储在整个系统的不同部分。每个块都分配有一个唯一的标识符。为了访问文件,服务器的操作系统使用唯一的地址将块一起拉回到文件中,这比通过目录和文件层次结构导航来访问文件花费的时间更少。块存储的例子有 SAN 、 iSCSI 和本地磁盘。
#对象存储:**根据 IBM 的说法,“对象是存储在结构扁平的数据环境中的离散数据单元。”[6].每个对象都是一个简单的自包含存储库,其中包括数据、元数据(与对象相关联的描述性信息)和唯一的标识 ID 号。这种存储的例子有 AWS S3 、 Azure Blob 存储和谷歌云存储。
# Backup: 您的数据的副本,在您的生产数据被破坏的情况下,您可以重复使用该副本。
_____________
[1]数据存储。https://en.wikipedia.org/wiki/Data_store
[2]数据库。https://en.wikipedia.org/wiki/Database
[3]数据库规范化。https://en.wikipedia.org/wiki/Database_normalization
[4] OLAP。https://www.ibm.com/cloud/learn/olap
[5]对象存储。https://www.ibm.com/cloud/learn/object-storage
#缓存
“缓存是存储数据的硬件或软件组件,以便将来可以更快地处理对该数据的请求……”[1]。( 百科 )
****#缓存命中:描述在缓存中找到请求的数据时的事件。
****#缓存未命中:描述在缓存中找不到请求的事件。
****# TOL(生存时间):定义的时间间隔,对象可以在缓存中生存。TOL 到期时,对象将被删除或刷新。
# Eviction policy: 当缓存已满时,决定丢弃哪个元素的策略。驱逐策略的例子有 LRU (最近最少使用)、 FIFO (先进先出)、 RR (随机替换)等。
_____________
[1]缓存。https://en . Wikipedia . org/wiki/Cache _(计算)
#数据结构
数据结构以某种格式(列表、映射、队列……)组织数据,并提供访问和修改数据的功能”。
# Queue: 一种线性数据结构,其中项目按 FIFO(先进先出)顺序处理。项目总是被附加在队列的末尾,并从队列的开头开始使用。
# Stack: 一种线性数据结构,其中项目按后进先出(LIFO)顺序处理。项目总是附加在开头,并从开头开始消耗。
# B-Tree: 根据 CalPonyPomona ,“B-Tree 是一种树形数据结构,它保持数据有序,并允许在对数摊销时间内进行搜索、插入和删除……针对读写大型数据块的系统进行了优化。它最常用于数据库和文件系统。[1].
_____________
[1] B 树。https://www.cpp.edu/~ftang/courses/CS241/notes/b-tree.htm
#网络
两台或多台计算机连接在一起共享资源。
****# IP 地址(互联网协议地址):根据维基百科,“IP 地址是分配给连接到使用互联网协议进行通信的计算机网络的每个设备的数字标签。”[1].IP 地址的一个例子是192.0.2.1
。
******# TCP/IP(传输控制协议/互联网协议):是一系列网络协议,规范数据在网络中传输的方式。这个家族包含的协议有 IP(互联网协议)、TCP(传输控制协议)、UDP(用户数据报协议)和 ICMP(互联网控制消息协议)。
****# UDP(用户数据报协议):一种具有轻量级机制的协议,用于向网络上的其他主机发送数据。它不提供握手,保证消息的传递和排序。
# OSI(开放系统互连)**:是描述网络系统如何工作的概念框架。将网络系统功能分为 7 个部分进行描述:物理、数据链路、网络、传输、会话、展现和应用。
# SSH(安全 Shell): 是一种从一台计算机安全远程登录到另一台计算机的方法。
****#握手:根据维基百科的说法,“握手是两个参与者之间的自动协商过程……通过在通信开始时建立通信链路协议的信息交换,在全面通信开始之前。”[2].
****# FTP(文件传输协议):网络中连接的机器使用的标准协议,用于在彼此之间传输文件。
# Certificate: 根据 computerhope 的说法,“证书或数字证书是唯一的、数字签名的文档,它权威地标识个人或组织的身份。使用公钥加密技术,可以验证其真实性,以确保您正在使用的软件或网站是合法的。”[3].
****#代理服务器:根据what ismip,“代理服务器基本上是另一台计算机,它作为一个中枢,通过它处理互联网请求。”[4].
# Ping: Ping 是一个用来测试 ip 地址是否可达的工具。通过命令ping <ip-address>
通过终端访问 Ping。
# Heartbeat: 根据维基百科,“…heart beat 是由硬件或软件产生的周期性信号,用以指示正常运行或同步计算机系统的其他部分。”[5].
****# NAS(网络附加存储):它是一个连接到网络的单个文件存储服务器,为一组客户端提供数据访问。NAS 的主要缺点是它不具备容错能力。如果服务器出现故障,机器将无法再访问数据。
****# SAN(存储区域网络):存储大量数据并提供访问的连接存储的高速网络。这是一个存储网络(多个存储)。数据在网络中的不同存储之间共享和复制,从而使 SAN 具有容错能力。
_____________
[1] IP 地址。https://en.wikipedia.org/wiki/Internet_Protocol
********[2]握手。【https://en.wikipedia.org/wiki/Handshaking ********
[3]证书。https://www.computerhope.com/jargon/c/certific.htm
[4]什么是代理。https://www.whatismyip.com/what-is-a-proxy/
【5】心跳。https://en.wikipedia.org/wiki/Heartbeat
#数据安全性
一套旨在保护数字数据免受未经授权的访问和物理灾难的实践。
*#公钥加密:*根据 Globalsign , " 公钥加密,或称非对称加密,是一种使用两种数学上相关但不相同的密钥的加密方案——公钥和私钥……公钥用于加密,私钥用于解密。【①】。
****#公钥:在密码系统中,公钥是用来加密数据的。公钥可以自由地与其他人共享。从公钥计算私钥是不可行的。
****#私钥:私钥用于解密数据。私钥在所有者处保密(即不与任何其他人共享)。用特定公钥 K123-public 加密的数据只能用精确关联的私钥 K123-private 解密。
****# GDPR(通用数据保护法规):欧盟设计的法规,2018 年 5 月 25 日生效。该法规确保欧盟公民对其个人数据的使用有更多的控制权。要了解更多关于 GDPR 的信息,请访问欧盟官方网站。
#数据匿名化:**据维基百科、**数据匿名化是从数据集中去除个人身份信息的过程,使数据描述的人保持匿名。【2】。数据要么被删除,要么被替换成乱码。**
#数据泄露(Data Leak): 数据泄露是指有意或无意地向公众发布私人(机密)信息。
****#服务条款:服务条款是服务提供商和想要使用该服务的人之间的法律协议。
****#勒索软件:据卡巴斯基,“勒索软件是一种恶意软件,它会感染你的电脑,并显示要求付费的消息,以使你的系统重新工作……它有能力锁定电脑屏幕或用密码加密重要的、预先确定的文件。”[3].
# SHA-2: 一组六个加密哈希函数,命名为 SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224 和 SHA-512/256。数字表示每个哈希值使用的位数。
****# RSA(Rivest-sha mir-ad leman):一种广泛使用的公钥密码系统。在密码系统中,公钥用于加密数据,私钥用于解密数据。
_____________
[1]什么是公钥密码学。https://www . globalsign . com/en/SSL-information-center/what-is-public-key-cryptography
[2]数据匿名化。https://en.wikipedia.org/wiki/Data_anonymization
[3]勒索软件。https://www . Kaspersky . com/resource-center/definitions/what-is-ransomware
措施
# Bit: 数字信息的基本单位,取二进制值 1 或 0。
****# 字节:通常包含 8 位的位块。
# Terabyte: 在 1 TB = 1024GB 的情况下测量数据的大小。
# Petabyte: 测量数据的大小 1PB = 1024TB。
# 一个数量级:据研究,“一个数量级通常写成 10 的 n 次方。n 代表数量级。如果你把一个数字提高一个数量级,你基本上是把这个数字乘以 10。如果你把一个数字减少一个数量级,基本上就是把这个数字乘以 0.1。”[1].
****# IOPS(每秒输入输出操作数):测量存储系统的输入输出性能。
****#吞吐量:衡量系统在给定时间内处理的信息单位。例如“此数据管道每分钟处理 25GB 数据”。
# Latency: 请求/响应从发送方传输到接收方所需的时间。
****#响应时间:从发送方提交请求到收到响应的总时间。
****#带宽:描述在给定时间内,通过互联网连接传输的最大数据量。
_____________
[1]数量级定义示例。https://study . com/academy/lesson/order-of-magnitude-definition-examples . html
#硬件
描述计算机的物理部件。
****# HDD(硬盘):根据维基百科“硬盘是一种机电数据存储设备,它使用磁性存储来存储和检索数字数据,使用一个或多个涂有磁性材料的刚性快速旋转的盘片。”[1].硬盘是廉价的机械设备,仍然广泛用于存储系统。
****# SDD(固态硬盘):根据维基百科“固态硬盘是一种固态存储设备,它使用集成电路组件来持久存储数据,通常使用闪存……”[2]。固态硬盘比硬盘贵得多,主要用于对数据访问速度要求很高的场合。
****# RAM(随机存取存储器):也称为主存储器,RAM 是易失性、短期快速存储器,它从辅助存储器(即硬盘或固态硬盘),以加快 CPU 的访问速度。随机访问 RAM 中的数据具有相同的延迟。
_____________
[1]硬盘驱动器。https://en.wikipedia.org/wiki/Hard_disk_drive
[2]固态硬盘。【https://en.wikipedia.org/wiki/Solid-state_drive 号
结论
这个词汇表是根据几个来源汇编的。来源主要取自互联网网页链接,如维基百科、IBM、亚马逊、azure、redhat 等。
包含一个链接的概念是从该链接中指定的来源中提取的。
如果您想更深入地了解这些概念,首先考虑提供的参考资料。接下来,如果你想理解这里提出的概念,我强烈推荐你阅读下面的书。
- Martin Kleppman的《设计-数据密集型应用》(对于每个认真考虑数据工程的人来说都是必不可少的),
- 内森·马茨和詹姆斯·沃伦的《可扩展实时数据系统的大数据原则和最佳实践》
- Andrew Tanenbaum 的《分布式系统:原则和范例》
最后,这篇文章容易更新。当新概念出现时,我会更新它。不要犹豫,写信给我的概念,错过了包括。
Coursera 中的 16 门在线课程,开启您的数据科学生涯
Coursera 上关于数据分析、可视化和机器学习的最佳课程
在全球新冠肺炎疫情的阴影下,我们大多数人都有更多的时间来提高自己的技能,从而在工作环境中更具竞争力。
如果你想在数据科学道路上开始你的职业生涯,在线课程可能是最好的选择之一,因为它们通常成本低,按需定制,可以自定进度。最重要的是,我们可以远程学习。
在这篇文章中,我在 Coursera 上组织了一些课程,我认为这些课程会对想进入这个领域的人有所帮助。如果你已经是一名非常有经验的数据分析师/数据科学家/机器学习工程师,我相信大多数课程可能都有点肤浅。
为了方便起见,这些课程分为不同的类别。
- 基本的
- 程序设计语言
- 数据分析
- 数据可视化
- 机器学习
当然,我不会说这些课程你什么都要钉。根据个人需求和职业路径偏好,可能会挑选一部分给自己热身。
基本的
★ 大数据简介
加州大学圣地亚哥分校
由加州大学圣地亚哥分校提供。有兴趣增加您对大数据领域的了解吗?这个…
www.coursera.org](https://www.coursera.org/learn/big-data-introduction)
我相信你可能对数据库、SQL 等有所了解。然而,如今您需要知道什么是大数据,才能胜任大多数数据分析和数据科学任务。
本课程介绍了大数据的核心概念及其重要性。它还训练我们如何以可扩展的方式思考问题,这使我们在遇到与数据相关的问题时能够有更进一步的视野。
如果您对本课程感到满意,它也是一个系列,将继续沉浸在大数据的应用中,包括大数据中的机器学习,但它意味着更多的理论而不是大量的实践。
★ 数据科学家的工具箱
约翰·霍普金斯大学
由约翰霍普金斯大学提供。在本课程中,您将了解……中的主要工具和思想
www.coursera.org](https://www.coursera.org/learn/data-scientists-tools#syllabus)
如果你没有太多的编程背景,这个课程会很有帮助。它列出了“数据科学家的工具箱”中最受欢迎的东西,并进行了解释。
在本课程中,你将学习 R 等基础编程,以及 RStudio 等开发环境。此外,作为一名数据科学家,您需要知道如何在 Git 中与同事协作。
程序设计语言
★Python 交互式编程入门
莱斯大学
由莱斯大学提供。这两个部分的课程旨在帮助学生很少或没有计算…
www.coursera.org](https://www.coursera.org/learn/interactive-python-1)
你必须知道 Python 是数据科学领域最流行的编程语言。所以,如果你还没有开始使用它,这个课程将帮助你成为一名 Python 程序员。
本课程的预期受众是那些非计算机科学背景的人。所以,从基础做起。所以,如果你以前从未使用过编程语言,也不要担心会被卡住。另外值得一提的是,本课程的重点不是数据分析或机器学习,而是编程技能。
★ 应用数据科学与 Python 专业化
密歇根大学
由密歇根大学提供。密歇根大学专业的 5 门课程向学习者介绍了…
www.coursera.org](https://www.coursera.org/specializations/data-science-python)
请注意,这是一个专业化,这意味着它包含多个课程。
本课程面向那些已经拥有 Python 经验但从未使用它进行数据分析的人。事实上,我想说的是,当我使用 Python 来编写 web 服务和数据可视化应用程序时,情况有所不同。本课程将帮助您转换现有的编程技能,以适应您在 Python 中的数据分析/机器学习职业。
★ R 编程
约翰霍普金斯大学
由约翰霍普金斯大学提供。在这门课程中,你将学习如何用 R 编程,以及如何使用 R 进行有效的编程
www.coursera.org](https://www.coursera.org/learn/r-programming)
当然,Python 并不是数据分析和机器学习的唯一选择。当人们提到这些领域时,R 不能缺席。
如果你更喜欢用 R,完全没问题。在本课程中,您将从头到尾学习 R 编程,包括环境配置、在统计问题中应用 R、利用第三方库、调试等。还有一个好处是,这门课还提供了一些来自行业的数据分析实例,让你的技巧更加实用。
数据分析
由 PhotoMIX-Company 在 Pixabay 上拍摄的照片
★ 数据驱动型公司的业务指标
杜克大学
由杜克大学提供。在本课程中,您将学习如何使用数据分析进行任何…
www.coursera.org](https://www.coursera.org/learn/analytics-business-metrics)
如果你想学习目的驱动的数据分析,这个课程是最适合你的。它使用所有行业示例展示数据分析技能,不仅教您知识,还教您实践技能。
你将了解成为一名典型的数据分析师到底需要什么。如何使用数据分析在激烈的竞争中帮助您的公司。你会在这里找到答案。
★ 数据分析工具
卫斯理大学
卫斯理大学提供。在本课程中,您将开发并测试关于您的数据的假设。你会学到一个…
www.coursera.org](https://www.coursera.org/learn/data-analysis-tools)
如果你想深入研究那些流行的数据分析、数据挖掘和统计技术,这个课程会很有帮助。它侧重于统计技术,如假设检验,方差分析,卡方检验,皮尔逊相关等。
★ 在 Excel 中掌握数据分析
杜克大学
由杜克大学提供。重要:本课程的重点是数学,特别是数据分析的概念和…
www.coursera.org](https://www.coursera.org/learn/analytics-excel/)
我知道使用 Excel 听起来不是很酷,但我不得不说,有时它是一个不错的选择。例如,当您已经在 Excel 中获得数据,并且想要一些快速且一次性的结果时,它可能仍然是最佳选择。此外,如果你已经掌握了不错的 Excel 技能,本课程将帮助你探索 Excel 更多的可能性和潜力。
数据可视化
★Power BI 桌面入门
Amit Yadav,Coursera 项目网
由 Coursera 项目网提供。在这个 2 小时的项目课程中,您将学习使用电力的基本知识…
www.coursera.org](https://www.coursera.org/projects/power-bi-desktop)
作为最流行的数据可视化和 BI 前端工具之一,如果您的公司是微软商店,Power BI 是一个好的开始。
我强烈推荐这门课程来开始你的数据可视化之旅。这是 Coursera 指导的项目课程之一,这意味着它为您提供了一个在线工作空间,这是一个位于您浏览器中的云桌面,无需下载。然后,您可以与指导视频并排进行动手任务,非常方便,体验良好。
★ 数据可视化与交流与 Tableau
杜克大学
由杜克大学提供。出色的业务数据分析师的一项技能是能够…
www.coursera.org](https://www.coursera.org/learn/analytics-tableau)
Tableau 是另一个数据可视化工具,在这个市场中占有很大的比重。在本课程中,您将学习如何使用 Tableau 讲述数据故事,如何可视化数据分析或机器学习模型的结果,以及如何通过数据更好地与他人交流。
★ 数据可视化
伊利诺伊大学香槟分校
学习数据挖掘的一般概念以及基本方法和应用。然后深入一个子领域…
www.coursera.org](https://www.coursera.org/learn/datavisualization#syllabus)
本课程不是介绍数据可视化的具体工具,而是提供概念层面的指导。例如,在什么情况下应该使用什么样的数据可视化,对于数值和非数值数据有什么典型的数据可视化方法等等。
机器学习
★ 机器学习
吴恩达斯坦福大学
机器学习是让计算机在没有明确编程的情况下行动的科学。在过去的十年里…
www.coursera.org](https://www.coursera.org/learn/machine-learning)
这是有史以来最好的机器学习课程,没有之一。如果你希望我只为初学者推荐一门关于机器学习的课程,那就是这门课。到目前为止(2020 年 8 月),Coursera 上已经有超过 340 万的学习者注册了这门课程。
更重要的是,这门课已经在 Coursera 上免费了,虽然我觉得它值几千美元。
★ 应用数据科学与 Python 专业
密歇根大学
由密歇根大学提供。本课程将向学习者介绍应用机器学习,重点是…
www.coursera.org](https://www.coursera.org/learn/python-machine-learning)
如果你已经学习了吴恩达的课程,并想探索其他课程,这是一个不错的选择。内容与前者有很多重叠,但如果你想的话,有另一个来加强你的学习是很好的。
★ 推荐系统
明尼苏达大学
由明尼苏达大学提供。推荐系统是一个寻求预测用户偏好的过程。这个…
www.coursera.org](https://www.coursera.org/specializations/recommender-systems)
如果你已经有了机器学习的基础知识,想知道 ML 能做什么样的应用,这个课程是最好的之一。
推荐系统一直是并且仍然是机器学习最热门的应用领域之一。当你在 ebay.com 购物时,他们的推荐系统会“学习”你的偏好,并向你推荐其他你可能也会购买的商品。这是推荐系统的一个例子。
★ 回归模型
约翰霍普金斯大学
由约翰霍普金斯大学提供。线性模型,顾名思义,将一个结果与一组预测因素联系起来…
www.coursera.org](https://www.coursera.org/learn/regression-models)
回归是统计学习中最常用的技术之一。本课程着重于回归,并深入探讨各种不同的回归,如线性回归、逻辑回归、多变量回归、残差、泊松回归等。它还告诉你如何选择最佳的回归模型。
★ 神经网络与深度学习
吴恩达,deeplearning.ai
从 deeplearning.ai 学习神经网络和深度学习,如果你想打入前沿 ai,这门课…
www.coursera.org](https://www.coursera.org/learn/neural-networks-deep-learning)
如果你是一个科技爱好者,你一定知道 Alpha Go,这是一个打败过最优秀的人类围棋选手的 AI,其背后的技术是深度学习。
如果你想学习深度学习,这是来自吴恩达的最佳课程。别担心。它从浅层神经网络开始,因此对初学者来说相当友好,尽管我仍然建议初学者应该从本节的第一课开始。
摘要
由于新冠肺炎,每个人都被锁在家里,而有些人却在琐碎的事情上花费时间来“消磨”时间。然而,如果我们能够利用这段时间来提高我们的数据科学技能,我相信当一切恢复正常时,我们在就业市场上将更具竞争力。
不要浪费每一次危机!
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@qiuyujx/membership)
如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和成千上万的其他作者!(点击上面的链接)
关于机器学习算法的 16 个技巧
加深您对常见机器学习算法的了解
你可能听说过瑞士军刀。如果没有,就看看下图。它包含许多刀片和工具。每个人都专门从事一项特定的任务。在某些情况下,不同的刀片可以执行相同的任务,但性能程度不同。
图片来自 Pixabay
我认为机器学习算法是瑞士军刀。有许多不同的算法。某些任务需要使用特定的算法,而有些任务可以用许多不同的算法来完成。根据任务和数据的特征,性能可能会有所变化。
在这篇文章中,我将分享 16 个技巧,我认为它们会帮助你更好地理解算法。我的目标不是详细解释算法是如何工作的。我宁愿给出一些提示或细节。
一些技巧会更通用,而不是集中在某个特定的算法上。例如,日志损失是与所有分类算法相关的成本函数。
我假设你对算法有基本的了解。即使你不知道,你也可以挑选一些细节来帮助你。
我们开始吧。
1.支持向量机的 c 参数(SVM)
SVM 的 c 参数为每个错误分类的数据点增加了一个惩罚。如果 c 很小,则对误分类点的惩罚也很低,因此以更大数量的误分类为代价选择了具有大余量的决策边界。
如果 c 很大,SVM 试图最小化由于高惩罚导致的错误分类的例子的数量,这导致了具有较小裕度的决策边界。对于所有错误分类的例子,惩罚是不同的。它与到决策边界的距离成正比。
2.基于 RBF 核的 SVM 伽玛参数
RBF 核 SVM 的 Gamma 参数控制单个训练点的影响距离。低 gamma 值表示较大的相似性半径,这将导致更多的点被组合在一起。
对于高 gamma 值,这些点需要彼此非常接近,才能被视为在同一组(或类)中。因此,gamma 值非常大的模型往往会过度拟合。
3.什么使逻辑回归成为线性模型
逻辑回归的基础是逻辑函数,也称为 sigmoid 函数,它接受任何实数值并将其映射到 0 到 1 之间的值。
(图片由作者提供)
它是一个非线性函数,但逻辑回归是一个线性模型。
下面是我们如何从 sigmoid 函数得到一个线性方程:
(图片由作者提供)
取两侧的自然对数:
(图片由作者提供)
在等式(1)中,代替 x,我们可以使用线性等式 z :
(图片由作者提供)
那么等式(1)变成:
(图片由作者提供)
假设 y 是正类的概率。如果它是 0.5,那么上面等式的右边变成 0。
我们现在有一个线性方程要解。
4.主成分分析中的主要成分
PCA(主成分分析)是一种线性降维算法。PCA 的目标是在减少数据集的维数(特征数量)的同时保留尽可能多的信息。
信息量是用方差来衡量的。具有高方差的特征告诉我们关于数据的更多信息。
主成分是原始数据集特征的线性组合。
5.随机森林
随机森林是使用一种叫做装袋的方法建立的,其中每个决策树都被用作并行估计器。
随机森林的成功高度依赖于使用不相关的决策树。如果我们使用相同或非常相似的树,总体结果将不会比单个决策树的结果有太大的不同。随机森林通过自举和特征随机性实现不相关的决策树。
(图片由作者提供)
6.梯度推进决策树(GBDT)
GBDT 使用提升方法来组合个体决策树。Boosting 是指将一个学习算法串联起来,从许多顺序连接的弱学习器中实现一个强学习器。
每棵树都符合前一棵树的残差。与装袋不同,增压不涉及自举取样。每次添加新树时,它都适合初始数据集的修改版本。
(图片由作者提供)
7.增加随机森林和 GBDT 的树木数量
增加随机森林中的树木数量不会导致过度拟合。在某个点之后,模型的准确性不会因为添加更多的树而增加,但是也不会因为添加过多的树而受到负面影响。由于计算原因,您仍然不希望添加不必要数量的树,但是没有与随机森林中的树的数量相关联的过度拟合的风险。
然而,梯度提升决策树中的树的数量在过度拟合方面非常关键。添加太多的树会导致过度拟合,所以在某个时候停止添加树是很重要的。
8.层次聚类与 K-均值聚类
分层聚类不需要预先指定聚类的数量。必须为 k-means 算法指定聚类数。
它总是生成相同的聚类,而 k-means 聚类可能会根据质心(聚类中心)的初始化方式产生不同的聚类。
与 k-means 相比,层次聚类是一种较慢的算法。运行时间很长,尤其是对于大型数据集。
9.DBSCAN 算法的两个关键参数
DBSCAN 是一种聚类算法,适用于任意形状的聚类。这也是一种有效的检测异常值的算法。
DBSCAN 的两个关键参数:
- eps :指定邻域的距离。如果两点之间的距离小于或等于 eps,则认为这两点是相邻的。
- minPts: 定义一个聚类的最小个数据点。
10.DBSCAN 算法中的三种不同类型的点
基于 eps 和 minPts 参数,点被分类为核心点、边界点或异常点:
- **核心点:**如果一个点在其半径为 eps 的周边区域内至少有 minPts 个数的点(包括该点本身),则该点是核心点。
- **边界点:**如果一个点可以从一个核心点到达,并且其周围区域内的点数少于 minPts,那么这个点就是边界点。
- **离群点:**如果一个点不是核心点并且从任何核心点都不可达,那么这个点就是离群点。
在这种情况下,minPts 是 4。红色点是核心点,因为在其半径为 eps 的周围区域内至少有4 个点。该区域在图中用圆圈表示。黄色点是边界点,因为它们可以从核心点到达,并且其邻域内的点少于 4 个。可到达意味着在核心点的周围区域。点 B 和 C 在其邻域(即半径为 eps 的周围区域)内有两个点(包括点本身)。最后,N 是一个异常值,因为它不是一个核心点,不能从核心点到达。
11.朴素贝叶斯为什么叫朴素?
朴素贝叶斯算法假设特征是相互独立的,特征之间没有相关性。然而,现实生活中并非如此。这种特征不相关的天真假设是这种算法被称为“天真”的原因。
所有特征都是独立的假设使得朴素贝叶斯算法比复杂算法更快。在某些情况下,速度优先于更高的精度。
它可以很好地处理文本分类、垃圾邮件检测等高维数据。
12.什么是日志丢失?
对数损失(即交叉熵损失)是机器学习和深度学习模型的广泛使用的成本函数。
交叉熵量化了两个概率分布的比较。在监督学习任务中,我们有一个目标变量,我们试图预测。使用交叉熵比较目标变量的实际分布和我们的预测。结果是交叉熵损失,也称为对数损失。
13.原木损失是如何计算的?
对于每个预测,计算真实类的预测概率的负自然对数。所有这些值的总和给出了对数损耗。
这里有一个例子可以更好地解释这个计算。
我们有一个 4 类的分类问题。我们的模型对特定观测值的预测如下:
(图片由作者提供)
来自该特定观察(即数据点或行)的对数损失是-log(0.8) = 0.223。
14.为什么我们用 log loss 代替分类精度?
在计算对数损失时,我们取预测概率的自然对数的负值。我们对预测越有把握,测井损失就越低(假设预测是正确的)。
例如,-log(0.9)等于 0.10536,而-log(0.8)等于 0.22314。因此,90%的把握比 80%的把握会导致更低的测井损失。
传统的度量标准,如分类准确度、精确度和召回率,通过比较预测类和实际类来评估性能。
下表显示了两个不同模型对一个由 5 个观察值组成的相对较小的集合的预测。
(图片由作者提供)
两个模型都正确地对 5 个观察值中的 4 个进行了分类。因此,在分类精度方面,这些模型具有相同的性能。然而,概率揭示了模型 1 在预测中更确定。因此,总体而言,它的表现可能会更好。
对数损失(即交叉熵损失)提供了对分类模型的更稳健和准确的评估。
15.ROC 曲线和 AUC
ROC 曲线通过组合所有阈值处的混淆矩阵来总结性能。 AUC 将 ROC 曲线转化为二元分类器性能的数字表示。AUC 是 ROC 曲线下的面积,取 0 到 1 之间的值。AUC 表示一个模型在区分正类和负类方面有多成功。
16.精确度和召回率
精确度和召回率度量将分类准确性向前推进了一步,并允许我们获得对模型评估的更具体的理解。选择哪一个取决于任务和我们的目标。
Precision 衡量我们的模型在预测为正时有多好。精度的焦点是正面预测。它表明有多少积极的预测是正确的。
回忆测量我们的模型在正确预测积极类方面有多好。召回的重点是实际正班。它表示模型能够正确预测的阳性类别的数量。
结论
我们已经介绍了一些基本信息以及关于机器学习算法的一些细节。
有些点与多种算法有关,比如关于日志丢失的算法。这些也很重要,因为评估模型和实现它们一样重要。
所有的机器学习算法在某些任务中都是有用和有效的。根据你正在做的工作,你可以掌握其中的一些。
然而,了解这些算法的工作原理是很有价值的。
感谢您的阅读。如果您有任何反馈,请告诉我。
处理数据、大数据甚至更大数据的 17 种策略
加速 Python 代码的技巧和库
处理大数据可能很棘手。没有人喜欢内存不足的错误。☹️没有人喜欢等待代码运行。⏳没有人喜欢离开 Python。🐍
不要绝望!在本文中,我将提供一些技巧,并介绍一些新兴的库来帮助您高效地处理大数据。我还将向您介绍不适合内存的代码的解决方案。在使用 Python 的过程中。👍
我们到桥的另一边去吧!资料来源:pixabay.com
Python 是科学和数值计算最流行的语言。熊猫最受清理代码和探索性数据分析的欢迎。
与使用 Microsoft Excel 或 Google Sheets 相比,使用 pandas 和 Python 可以处理更多的数据。
SQL 数据库在存储数据方面非常受欢迎,但在表达性、测试、再现性以及快速执行数据分析、统计和机器学习的能力方面,Python 生态系统比 SQL 有许多优势。
不幸的是,如果您在本地工作,pandas 可以处理的数据量会受到您机器上内存量的限制。如果你在云中工作,更多的内存需要更多的钱。💵
不管你的代码在哪里运行,你都希望操作快速发生,这样你就可以 GSD(完成任务)!😀
总是要做的事情
如果你曾经听到或看到过关于加速代码的建议,你就会看到这个警告。⚠️ 不要过早优化! ⚠️
这是个好建议。但是了解一些技巧也是很聪明的,这样你就可以在第一时间写出干净快速的代码。🚀
去追它!资料来源:pixabay.com
以下是适用于任何规模数据集的三种良好编码实践。
- 尽可能避免嵌套循环。下面是关于 Big-O 符号和算法分析的简单介绍。嵌套在另一个
for
循环中的一个for
循环通常会导致多项式时间计算。如果你要搜索的项目不止一个,你可能要等一段时间。看到一个漂亮的图表和解释这里。 - 在 Python 中尽可能使用列表理解(和字典理解)。按需创建一个列表比重复加载和附加属性到一个列表要快得多——堆栈溢出的提示答案这里。然而,一般来说,不要为了速度而牺牲清晰性,所以要小心嵌套列表理解。⚠️
- 在 pandas 中,使用内置的矢量化函数。这个原理和列表和字典理解的原理是一样的。一次对整个数据结构应用一个函数比重复调用一个函数要快得多。
如果你发现自己伸手去拿apply
,想想你是否真的需要。apply
在行或列上循环。矢量化方法通常速度更快,代码更少,因此它们是多方面的胜利。🚀
同样,避免其他循环遍历数据的 pandas 系列和 DataFrame 方法,例如applymap
、itterrows
和ittertuples
。如果有意义的话,在 DataFrame 上使用map
或replace
方法,而不是其他任何方法,这样可以节省很多时间。
请注意,这些建议可能不适用于非常少量的数据,但在这种情况下,风险很低,所以谁在乎呢。😉
这给我们带来了最重要的规则
能留在熊猫就留在熊猫。🐼
这是一个快乐的地方。😀
如果没有问题,并且不希望数据或内存空间膨胀,就不要担心这些速度和内存问题。
但在某个时候,风暴云会聚集。⛈:你会遇到一个大数据集,然后你会想知道该怎么做。来看看一些小技巧吧。
与大量数据(大约数百万行)相关的事情
就像数百万颗沙粒。资料来源:pixabay.com
- 如果你在做机器学习,使用你的数据子集来探索、清理和制作一个基线模型。快速解决 90%的问题,节省时间和资源。这项技术可以帮助你更快地得到一个好的模型!⏳
- 当读入数据帧时,只加载需要使用
[usecols](https://pandas.pydata.org/pandas-docs/stable/user_guide/scale.html#load-less-data)
参数的列。少数据 in =赢! - 有效地使用数据类型。将数字列向下转换为对
pd.to_numeric()
有意义的最小数据类型。将基数低(只有几个值)的列转换为分类数据类型。这是一份关于高效类型的熊猫指南。 - scikit 中的并行模型培训-学习尽可能使用更多处理内核。默认情况下,scikit-learn 只使用您机器的一个内核。许多计算机都有 4 个或更多内核。通过传递关键字参数
n_jobs=-1
,您可以将它们全部用于可并行化的任务。 - 以羽毛或泡菜格式保存熊猫数据帧,以加快读写速度。向 Martin Skarzynski 致敬,他在这里链接到证据和代码。
- 使用
[pd.eval](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.eval.html#pandas.eval)
加速熊猫的行动。将您通常的代码以字符串形式传递给该函数。它的运算速度要快得多。这是一个 100 列数据框架的测试图表。
图片来自Tirthajyoti Sarkar关于该主题的这篇好文章
[df.query](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.query.html#pandas.DataFrame.query)
基本上与pd.eval
相同,但是作为一个 DataFrame 方法,而不是一个顶级的 pandas 函数。
查看文档,因为有一些问题。⚠️
熊猫正在引擎盖下使用 numexpr 。Numexpr 也可以和 NumPy 一起使用。Chris Conlan 在他的书 Fast Python 中为我指出了@Numexpr。Chris 的书是学习如何提高 Python 代码速度的绝佳读物。👍
事情与真正的大数据有关(大约几千万行或更多)
更多数据!资料来源:pixabay.com
- 使用数字巴。如果你在做数学计算,Numba 会大大提高你的速度。安装 numba 并导入它。然后,当您需要遍历 NumPy 数组并且不能使用矢量化方法时,使用
@numba.jit
decorator 函数。它只适用于 NumPy 数组。在 pandas 数据帧上使用.to_numpy()
将其转换为 NumPy 数组。 - 在有意义的时候使用稀疏矩阵。Scikit-learn 用一些转换器自动输出稀疏数组,比如 CountVectorizer。当您的数据大部分是 0 或缺少值时,您可以在 pandas 中将列转换为稀疏 dtypes。点击阅读更多。
- 使用 Dask 将数据集并行读取到 pandas 的数据块中。Dask 还可以在多台机器上并行处理数据操作。它模仿熊猫和 NumPy APIs 的子集。 Dask-ML 是一个姐妹包,用于在多台机器上并行化机器学习算法。它模仿 scikit-learn API。Dask 与其他流行的机器学习库(如 XGBoost、LightGBM、PyTorch 和 TensorFlow)配合得很好。
- 使用 PyTorch,不管有没有 GPU。在 GPU 上使用 PyTorch 可以获得很大的加速,我在这篇关于排序的文章中发现了这一点。
未来处理大数据时需要关注/尝试的事情
盯着他们!资料来源:pixabay.com
以下三个包是截至 2020 年年中的最新产品。预计配置问题和 API 变化。如果您在本地 CPU 上工作,这些包可能不适合您的需要。但是看起来都很有希望,值得关注。👀
- 您是否可以访问大量的 cpu 内核?您的数据是否超过 32 列(从 2020 年中期开始需要)?然后考虑摩丁。它模仿 pandas 库的子集来加速大型数据集的操作。它使用阿帕奇箭(通过射线)或引擎盖下的 Dask。Dask 后端是实验性的。在我的测试中,有些东西不是很快——例如从 NumPy 数组中读取数据很慢,内存管理是个问题。
- 可以用 jax 代替 NumPy。Jax 是一款开源的谷歌产品,非常前沿。它通过使用以下五种工具来加速操作:自动签名、XLA、JIT、矢量器和并行化器。Jax 在 CPU、GPU 或 TPU 上工作,可能比使用 PyTorch 或 TensorFlow 获得速度提升更简单。Jax 对深度学习也有好处。截至 2020 年中期,它适用于 NumPy,但不适用于熊猫。但是,您可以将 DataFrame 转换为 TensorFlow 或 NumPy 对象,然后使用 jax。点击阅读更多。
- Rapids cuDF 通过类似熊猫的 API 在 GPU 上使用 Apache Arrow。是 NVIDIA 的开源 Python 包。Rapids 与 Dask 配合得很好,因此您可以让多个 GPU 并行处理数据。对于最大的工作负载,它应该提供一个不错的提升。
关于代码速度和大数据的其他知识
计时操作
如果你想在 Jupyter 笔记本上为一个操作计时,你可以使用
%time
或%timeit
魔法命令。当单个%是前缀时,它们都在单行上工作;当双%%是前缀时,它们都在整个代码单元上工作。
%time
运行你的代码一次,%timeit
运行代码多次(默认为七次)。请务必查看文档以了解一些微妙之处。
如果您正在使用 Python 脚本或笔记本,您可以导入时间模块,检查运行代码前后的时间,并找出差异。
或者,您可以使用time.perf_counter
或time.process_time
。区别在堆栈溢出问题中讨论。
测试时间时,请注意不同的机器和软件版本会导致差异。此外,如果您正在进行重复测试,缓存有时会误导您。和所有的实验一样,保持你能保持不变的东西不变。👍
存储大数据
GitHub 的最大文件大小是 100MB 。如果你想用 GitHub 版本化大文件,你可以使用 Git 大文件存储扩展。
此外,确保你没有将文件自动上传到 Dropbox、iCloud 或其他自动备份服务,除非你想这样做。
想了解更多?
pandas 文档中有关于增强性能和扩展到大型数据集的章节。我的一些想法改编自那些章节。
有其他提示吗?我很想在推特上听到他们的声音。🎉
包装
您已经了解了如何编写更快的代码。您还看到了如何处理大数据和真正的大数据。最后,您看到了一些新的库,它们可能会继续变得更受欢迎,以处理大数据。
我希望这个指南对你有所帮助。如果你有,请在你最喜欢的社交媒体上分享,这样其他人也可以找到它。😀
我写关于 Python 、 SQL 、 Docker 和其他技术主题的文章。如果你对这些感兴趣,请注册我的邮件列表,那里有很棒的数据科学资源,点击这里阅读更多内容,帮助你提高技能。👍
资料来源:pixabay.com
大数据时代快乐!😀
清理和格式化数据的 17 个有用的 Ruby 字符串方法
你不写的每一行代码都是你不需要维护的一行代码
凯文·Ku 摄于 Pexels
大约两年前,当我开始使用 Ruby 时,我第一次知道了这个方法,自从我发现了它,我每天都用它来比较两个字符串。从那以后,我遇到了其他几种方法。我想在这里编译我最喜欢的——这些是最适合简化代码的。
字符串操作是程序员每天都要做的工作。从清理到格式化数据,再到分析字符串,各不相同。根据您的需要,您最终可能会采用以下一种、多种或所有方法。
在这篇文章中,我将讨论由 Ruby String 类提供的 17 种有效的字符串方法,它们将通过节省宝贵的时间使你的生活变得更加容易。
1.迭代字符串中的每个字符
我们经常需要遍历字符串来处理字符。例如,您可能想要打印所有元音。
str = "abcdeU"
temp = ""
str.each_char do |char|
puts char if ['a','e','i','o','u'].include? char.downcase
end
# a
# e
# U
我们可以加上with_index
得到字符的位置。
str = "abcdeU"
temp = ""
str.each_char.with_index do |char, i|
puts "#{i} #{char}" if ['a','e','i','o','u'].include? char.downcase
end
# 0 a
# 4 e
# 5 U
默认情况下,索引从零开始,但是您可以根据需要定义它。
str = "abcdeU"
temp = ""
str.each_char.with_index(100) do |char, i|
puts "#{i} #{char}" if ['a','e','i','o','u'].include? char.downcase
end
# 100 a
# 104 e
# 105 U
另一个有用的方法是str.each_byte
来获取单个字节。当你处理 ASCII 码的时候,这很有帮助。
str = "abcdeABCDE"
str.each_byte do |char|
puts char
end
# 97
# 98
# 99
# 100
# 101
# 65
# 66
# 67
# 68
# 69
2.将字符串转换为字符数组
要将字符串转换成数组,我们可以使用str.chars
,它是str.each_char.to_a
的简写。
char_array = "abcdeABCDE".chars
# ["a", "b", "c", "d", "e", "A", "B", "C", "D", "E"]
现在我们有了一个数组,我们可以使用任何数组方法!多酷啊!例如,join
方法将数组中的每个元素转换成一个字符串,由给定的分隔符分隔。通过公开数组方法,我们有更多的选项来操作字符串。
char_array.map { |c| c.downcase }.join(', ')
# "a, b, c, d, e, a, b, c, d, e"
3.获取字符串的长度
我认为这是有史以来最常用的方法。当您想在将字符串插入数据库表之前检查字符串长度时,这非常有用。我们也可以用size
,是同义词。根据你的喜好,你可以选择其中任何一个👍。我更喜欢用length
的方法,因为它更容易理解。
"HELLO World".length
# 11
"HELLO World".size
# 11
4.获取字符串的字符数
str.count
将一组或多组字符作为参数。之后,我们取这些集合的交集来得到最终的字符集。最后,这套用来统计str
中的人物。
"look up!".count("o")
# 2
"look up!".count("m")
# 0
"abcdef".count("a-c", "c-f")
# 1
我们可以用它来统计多个字符,所以我们来统计一下元音的个数。
"abcdeUUU".downcase.count("aeiou")
# 5
辅音怎么样?露比掩护你。^
符号是用来否定人物的。
"abcdeUUU".downcase.count("^aeiou")
# 3
以上两个例子并没有涵盖每一种情况,比如含有数字或特殊字符的字符串。
"^-12#abcdeUUU".downcase.count("^aeiou")
# 8
如果我们想更清楚地了解允许的字符集,我们可以使用下面的例子。这里的a-z
表示它们之间的所有字符。之后,我们排除元音。如果我们取第一个和第二个字符集的交集,我们就有了有效常量集。
"^-12#abcdeUUU".downcase.count("a-z", "^aeiou")
# 3
如果我们想在我们的字符集中包含^
或-
符号,我们需要使用反斜杠字符对它们进行转义。在这里,我们通过用反斜杠字符对符号进行转义来包含符号^
或-
。因此,最终的字符集将有^
、-
和0 to 9
。
"^-1234#".downcase.count("\\^\\-0-9")
# 6
5.反转一根绳子
反转字符串会很方便,例如,当你想检查一个字符串是否是回文时。
str = "Anna"
str.reverse
# "annA"
puts "palindrome" if str.downcase == str.downcase.reverse
# palindrome
# eql? is a synonym for ==
puts "palindrome" if str.downcase.eql?(str.downcase.reverse)
# palindrome
6 搜索字符串中的一个或多个字符
如果字符串或字符存在,则str.include?
返回 true,否则返回 false。
"hEllo wOrlD".include?("w")
# true
"hEllo wOrlD".include?("1")
# false
7.替换字符串中的字符
替换字符串中的一个或多个字符是清理或格式化数据的好方法。str.gsub
或全局替换用提供的字符串替换所有出现的内容。这里第一个参数表示我们想要替换的字符集,第二个参数是替换字符集。
"Red, Red and Blue".gsub("Red", "Orange")
"Orange, Orange and Blue"
如果您想替换第一次出现的,使用str.sub
。
"Red, Red and Blue".sub("Red", "Orange")
"Orange, Red and Blue"
str.gsub
也接受散列或块。
"organization".gsub("z", 'z' => 's')
# "organisation"
这里我们寻找数字,并在开头添加一个$
符号。
"Price of the phone is 1000 AUD".gsub(/\d+/) { |s| '$'+s }
# "Price of the phone is $1000 AUD"
8.拆开一根绳子
根据分隔符(默认为空格)或模式分割字符串。
sentence = "There Is No Spoon"
words = sentence.split
# ["There", "Is", "No", "Spoon"]
sentence = "There_Is_No_Spoon"
words = sentence.split("_")
# ["There", "Is", "No", "Spoon"]
?=
用于正向预测以查找大写字母。
sentence = "ThereIsNoSpoon"
words = sentence.split(/(?=[A-Z])/)
# ["There", "Is", "No", "Spoon"]
sentence = "a111b222c333"
words = sentence.split(/(?=[a-z])/)
# ["a111", "b222", "c333"]
您可以通过提供第二个参数来限制拆分的数量。
sentence = "June 27,June 26,June 25"
words = sentence.split(/,/, 2)
# ["June 27", "June 26,June 25"]
9.修剪绳子
str.trim
将删除以下任何前导和尾随字符:null("\x00")
、横线tab("\t")
、line feed(\n)
、vertical tab("\v")
、form feed(f)
、carriage return(\r)
、space(" ")
。
" hEllo WOrlD \n\t\v\r ".strip
# "hEllo WOrlD"
10.修剪字符串的最后一个字符
当给定记录分隔符或回车符(\n
、\r
和\r\n
)时,str.chomp
删除尾随字符。
"...hello...world...".chomp(".")
# "...hello...world.."
"...hello...world".chomp(".")
"...hello...world"
"...hello...world...\n".chomp(".")
# "...hello...world...\n"
"...hello...world...\n".chomp
# "...hello...world..."
"...hello...world...\r".chomp
# "...hello...world..."
"...hello...world...\r\n".chomp
# "...hello...world..."
"...hello...world...\n\r".chomp
"...hello...world...\n"
11.在另一个字符串之前添加一个字符串
将一个或多个字符追加到字符串的开头。
a = "world"
a.prepend("hello ")
# "hello world"
12.插入字符串
向字符串的特定位置添加一个或多个字符。
a = "hello"
a.insert(a.length, " world")
# "hello world"
13.更改字符串大小写的方法
str.downcase
会将字符串中的每个字符转换成小写。
"HELLO World".downcase
# "hello world"
str.upcase
会将字符串中的每个字符转换成大写。
"hello worlD".upcase
# "HELLO WORLD"
str.capitalize
将字符串的第一个字符转换成大写,其余的转换成小写。
"hEllo wOrlD".capitalize
# "Hello world"
str.swapcase
会将字符串中的大写字符转换成小写字符,并将小写字符转换成大写字符。
"hEllo WOrlD".swapcase
# "HeLLO woRLd"
14。添加字符串
一种常见的字符串操作是串联。为此,我们可以使用str.concat
或<<
。
str1 = "hello"
str2 = "world"
str1.concat(" ").concat(str2)
puts "#{str1}"
# "hello world"
# << is same as concat
str1 = "hello"
str2 = "world"
str1 << " " << str2
puts "#{str1}"
# "hello world"
15.获取子字符串
当您想要字符串的特定部分时,str.slice
方法是完美的;它返回一个子字符串,其中第一个索引是包含性的,第二个索引是排他性的。
str = "hello world"
puts "#{str.slice(0, 5)}"
# hello
16.查找带有给定前缀和后缀的字符串
我们可以检查一个字符串是以一个字符串开始还是结束。
str = "Mr. Leonardo"
str.start_with?("Mr.")
# true
str = "The quick brown fox jumps over the lazy dog."
str.end_with?(".")
# true
17.空字符串检查
大概另一个最常用的方法是str.empty
,可以用于数据验证。
output = ""
output.empty?
# true
output = " "
output.empty?
# false
包裹
像其他编程语言一样,Ruby 有自己的标准库方法,这些方法针对性能进行了优化。使用这 17 种方法,你可以直接解决问题,而不是花时间实现大量的帮助方法。永远记住,没有写的一行代码是你不必维护的代码。如果你有兴趣学习更多关于 Ruby 的知识,请阅读下面的初学者指南。编码快乐!
离写下你的下一件大事又近了一步
medium.com](https://medium.com/swlh/a-beginners-guide-to-ruby-810f230c53da)**