TowardsDataScience 博客中文翻译 2021(五百一十三)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

面向数据科学家的面向对象编程

原文:https://towardsdatascience.com/object-oriented-programming-for-data-scientists-8d4d976b6af8?source=collection_archive---------12-----------------------

转换如何使您的代码可以投入生产,如何降低代码复杂性,以及如何提高团队效率

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Joanna Reichert 的图片来自 Pixabay

在编程、数据分析、机器学习、人工智能、数学和数据科学的所有其他组成部分方面有如此多的东西要学,公平地说,当成为一名数据科学家时,概念的学习成为一件艰巨的事情。

数据科学家来自各种背景,其中许多人都不是基于计算机科学的,完全可以理解的是,一些计算机科学的原则被忽略了,有利于获得好的东西:完成数据分析。

其中一个概念是面向对象编程(OOP)。

当你询问当前的数据科学家对 OOP 的看法时,你可能会得到各种各样的答案。在某些情况下,OOP 对于降低复杂性和减少完成分析所需的时间非常有用。在其他情况下, OOP 会导致代码比你需要的还要多,甚至不知道该怎么处理。

根据您的情况或您正在进行的项目,您可能会发现切换到 OOP 方法是有益的,或者您可能会发现它阻碍了您的进展。

然而,有一件事是肯定的:作为一名数据科学家,在你最意想不到的时候拥有一项额外的技能可能会派上用场。换句话说,为什么不学一点 OOP,看看你或你的团队如何从它的原理中获益?

面向对象编程(OOP)快速入门。

像许多优秀的东西一样(仅举几个例子,经典摇滚、福特 GT40 和阿波罗 11 号太空任务),面向对象编程是在世纪之交之前开发的。从 20 世纪 60 年代开始,然后在 80 年代变得更加主流, OOP 成为管理大型程序复杂性的首选方法。

OOP 的目标是以一种可维护、易读、最重要的是可重用的方式组织代码。代码被组织成两种不同的结构,这两种结构一起工作,也称为对象和类。类是一段代码,它定义了可用于创建对象的特定属性和函数。把一个类想象成一个蓝图。对象是使用类创建的代码片段。每个对象都包含由类赋予它的属性,并且可以为每个属性分配唯一的值。换句话说,一个对象是一个类的唯一实例。想象一个物体,比如一个使用蓝图建造的房子(类)。

这里有一个使用狗的视觉例子:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

类和对象之间关系的例子。灵感来源:艾琳·多赫蒂

每只狗都是一样的,它们都有相同的品种、名字、生日、年龄和颜色。然而,我的狗是独一无二的。他对每个属性都有不同的值。因此,我创建了 Dog 类的唯一实例,并用它来描述我的狗。如果我购买了另一只狗,我可以创建该类的第二个实例来描述我的新狗。换句话说,我重用了为该类创建的代码,而不必再次键入它。

如上所述,类和对象也可以包含方法。对象将从它所源自的类中继承任何方法。然而,对象也可能包含没有出现在类中的唯一方法。比如,所有的狗都知道怎么坐。因此,Dog 类将包含 sit()方法。除了坐(),我还教我的狗呆(),说话()。因此,描述我的狗的对象将包含在其他任何地方都不会出现的独特方法。

这是它的视觉效果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从类到对象的方法继承的例子,向对象添加了两个最初不在类中出现的独特方法。灵感来源:艾琳·多赫蒂

然而,这是一个非常普通的例子。你明白这个想法,但是在数据科学的背景下不一定有意义。没问题。让我们从数据科学的角度来看一下这个问题。

Rose Day 在本文中描述了OOP 如何应用于数据科学,她对此做了最好的解释。她举了一个团队成员的例子,他使用一组特定的函数来清理数据,这些函数通常适用于团队使用的所有数据集。团队成员以面向对象的方式创建数据清理库,这允许其他团队成员使用相同的函数清理他们的代码,而不必从头开始编写代码。现在,任何想要使用这些函数来清理代码的团队成员都可以直接使用这个库,而不用每次都编写新的方法。

有关如何在数据科学环境中使用 OOP 的更多示例,请查看这篇文章,这篇文章通过示例和源代码,带您了解如何使用类和对象更好地处理数据:

为什么数据科学家需要 OOP?

面向对象程序设计的阴阳两极是函数式编程,这是一种编程方法,它通过以更加自由的方式创建变量和函数来避免类和对象的结构,从而避免了面向对象程序设计的共享状态特性。函数式编程依赖于纯函数(函数总是产生相同的结果,并且没有副作用)、递归(不使用 for 和 while 循环)、引用透明性(变量的值一旦定义就不能更改)和变量的不变性(变量一旦初始化就不能修改)。

对于数据科学中的许多实例来说,函数式编程会工作得非常好,许多数据科学家将花费他们的职业生涯来编写严格的函数式代码。取决于你问谁,你可能会在使用函数式编程的人和喜欢 OOP 的人之间得到截然不同的回答。此外,根据实例的不同,您甚至可以在这两者之间进行切换,这取决于您在给定时间正在进行的项目。

然而,有一些关键的原因可以解释为什么数据科学家至少应该对 OOP 有所了解。

  • 编程最佳实践的基石之一是 干原则(不要重复自己) **。**假设包含数据的文件名从“数据”变为“数据集”。如果您的代码是函数式编程的,您将需要一行一行地检查您的代码,并将“数据”的每个引用都更改为“数据集”。然而,如果你的数据被组织成类,你只需要改变一个对“数据”的引用,并且保证来自那个类的对象将继承这个改变。
  • 使用 OOP 原则编写代码可以确保你的代码更容易调试。当你看到一个 bug 突然出现在一个特定的对象中时,你知道它来自于它的类。此功能在故障排除或实施新功能时也会有所帮助。此外,当您在一个对象中对代码进行更改时,您知道它将会执行,而代码的其他部分则不受影响。因此,如果出现问题,会有更少的代码被破坏,问题也更容易被发现和解决。
  • **数据科学家经常与软件开发人员合作,开发出可投入生产的代码。**由于数据科学家和软件开发人员在创建生产代码时的常见合作关系,数据科学家开发一些 OOP 技能来帮助使过程顺利进行是有意义的。数据科学家来自多种背景,通常与计算机科学无关。正因为如此,面向对象的原则不一定会被使用。然而,OOP 对于软件开发人员来说是家常便饭。因此,学习这种语言有助于让团队合作变得容易和流畅。

简而言之,使用 OOP 将有助于提高团队效率,降低代码复杂性,并帮助您生成软件开发人员期待收到的生产就绪代码。

如何更好的掌握面向对象编程?

  • **只关注面向对象编程的四个原则。**对于数据科学家来说,理解 OOP 的四个基本原则往往就足够过得去了。理解除此之外的任何东西都是奇妙的,但因为它可能是如此抽象的概念,所以不要担心理解深层的黑暗细节,直到你真正需要它们。OOP 的四个原则是封装(将对象放入类中以保护它们不与其他对象交互)、抽象(隐藏特定的属性以使对象更容易处理)、继承(子类将从超类继承特征,对象将从它们所属的类继承特征)和多态(一个对象采取多种形式的能力)。我在这里更详细地解释这些概念
  • **用面向对象的方法建模一个现实世界的问题。**对狗的品种、汽车和房子建模是开始 OOP 的好方法,许多在线教程非常详细地介绍了这些基础知识。然而,这些概念比您在进行数据分析时可能要处理的概念更具体一些。所以我建议找一些现实世界的问题用 OOP 来解决。我特别建议遵循我在“面向对象编程快速入门”中链接的教程,因为它的数据争论本质。
  • 用强类型语言强迫自己使用 OOP。根据你问谁,你会得到各种各样的答案,当你问一个强类型编程语言的例子时,这些答案往往是自相矛盾的。因此,我建议在学习 OOP 时使用 Java(这似乎是唯一被认可的强类型语言)。使用 Java 将迫使你使用 OOP 来使你的代码工作,而使用另一种语言可能会让你逃脱不完全面向对象的惩罚。这将有助于巩固概念,并让您轻松地将它们转换到您选择的语言。

最后的想法。

如你所见,OOP 不仅仅是软件开发人员的专利——它还包含了许多数据科学家可以利用的优势。当你在考虑一个你想要高效完成的新项目时,或者当你在考虑一个你想要优化的旧项目时,在你的脑海中有一些 OOP 知识是没有坏处的。

此外,如果情况需要,谁不想编写生产就绪、不太复杂并且通过提高团队效率来完成的数据科学代码呢?

Python 中的面向对象编程(OOP)

原文:https://towardsdatascience.com/object-oriented-programming-oop-in-python-56b1f3229c0f?source=collection_archive---------15-----------------------

编程;编排

揭开类、对象、继承等等的神秘面纱

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:Undraw.co

OOP 是什么?

面向对象编程是一种通过将相关的属性和行为分组到单个对象中来组织程序的方法。OOP 的基本构建模块是对象

一个是一个创建对象的代码模板,我们可以把它想象成一个蓝图。它描述了某种类型的每个对象可能具有的状态和行为。例如,如果我们说“每个雇员都有名字和薪水,并且可以加薪”,那么我们就定义了一个类!

对象是存储关于某个实体的状态和行为的信息的数据结构,并且是一个类的实例。例如,一个代表雇员的对象可以有一些相关的属性,比如薪水和职位,以及加薪等行为。

对象=状态+行为

关于对象状态的信息包含在属性中,行为信息包含在方法中。此外,对象属性或状态由变量表示,如数字、字符串或元组。而对象方法或行为由函数来表示。

OOP 的显著特征是状态和行为捆绑在一起。这意味着,例如,我们不是将雇员数据与雇员行为分开考虑,而是将它们视为一个代表雇员的单元。这被称为封装,是面向对象编程的核心原则之一。

定义类别

如前所述,类是创建对象的蓝图。现在,让我们把我们的第一个蓝图变成现实。

class Employee:
   pass

Employee类现在没有太多的功能。我们将从添加所有Employee对象应该具有的一些属性开始。为了简单起见,我们只添加姓名和薪水属性。

将属性分配给类

所有Employee对象必须具有的属性在一个名为.__init__()的方法中定义,或者在构造器方法中定义。每次创建一个新的Employee对象时,构造函数方法都会被自动调用。

让我们用一个创建.name.salary属性的.__init__()方法来更新Employee类:

class Employee:
    def __init__(self, name, salary=0):
        self.name = name
        self.salary = salary

注意self在任何方法定义中都被用作第一个参数,包括我们的构造函数方法。另外,self.name = name创建了一个名为name的属性,并给它分配了参数name的值。对于 salary 属性也是如此,只是我们将默认的 salary 设置为 0。

实例属性与类属性

.__init__()中创建的属性被称为实例属性。实例属性的值特定于类的特定实例。所有的Employee对象都有一个名字和一份薪水,但是namesalary属性的值会根据Employee实例的不同而不同。

另一方面,类属性是对所有类实例具有相同值的属性。您可以通过在.__init__()之外给变量名赋值来定义一个类属性,如下所示:

class Employee:
   #Class attribute
   organization = "xxx" def __init__(self, name, salary=0):
        self.name = name
        self.salary = salary

总而言之,类属性用于定义每个类实例应该具有相同值的特征,而实例属性用于定义不同实例的不同属性。

将方法分配给类

实例方法

这些函数是在类内部定义的,只能从该类的实例中调用。就像构造函数方法一样,实例方法的第一个参数总是self。让我们演示如何通过构建前面的Employee类示例来编写实例方法。

class Employee:
   organization = "xxx" def __init__(self, name, salary=0):
        self.name = name
        self.salary = salary #Instance method
    def give_raise(self, amount):
        self.salary += amount
        return f"{self.name} has been given a {amount} raise"

如您所见,实例方法类似于常规函数,不同之处在于将self作为第一个参数。

类方法

类方法是绑定到类的方法,而不是类的对象。它们可以访问类的状态,因为它接受一个类参数,而不是典型的self,它指向类而不是对象实例。

要定义一个类方法,首先要有一个 class method 装饰器,然后是一个方法定义。唯一的区别是,现在第一个参数不是self,而是cls,引用类,就像 self 参数引用特定的实例一样。然后你把它写成任何其他函数,记住你不能在那个方法中引用任何实例属性。

因为类方法只能访问这个cls参数,所以它不能修改对象实例状态。这需要访问self。但是,类方法仍然可以修改应用于该类所有实例的类状态。

class MyClass: # instance method 
   def method(self):
        return 'instance method called', self

    @classmethod
    def classmethod(cls):
        return 'class method called', cls

class 方法的思想与 instance 方法非常相似,唯一的区别是,我们现在不是将实例作为第一个参数传递,而是将类本身作为第一个参数传递。因为我们只向方法传递一个类,所以不涉及实例。这意味着我们根本不需要实例,我们调用类方法就像调用静态函数一样:

MyClass.classmethod()

然而,如果我们想调用实例方法,我们必须先实例化一个对象,然后调用函数,如下所示:

object = MyClass()object.method()

如果您不确定实例化一个对象意味着什么,我们将在接下来讨论这个问题。

实例化一个对象

从一个类创建一个新对象叫做实例化一个对象。我们可以用如下属性实例化新的Employee对象:

e1 = Employee("yyy", 5000)
e2 = Employee("zzz", 8000)

您可以使用点符号访问属性,如下所示:

# access first employee's name attribute
e1.name# access second employee's salary attribute
e2.salary

类继承

类继承是一个类继承另一个类的属性和方法的机制。新形成的类称为子类,子类派生的类称为父类。子类拥有所有的父数据。

父类的属性和方法可以被子类覆盖或扩展。换句话说,子类继承其父类的所有属性和方法,但是它们也可以定义自己的属性和方法。

声明一个继承自父类的子类非常简单。

class Manager(Employee):
   pass

现在,即使我们没有定义构造函数,我们也可以创建一个Manager对象。

m1 = Manager("aaa", 13000)

通过继承定制功能

假设我们想给子类添加额外的属性。通过专门为我们的子类定制构造函数并调用父类的构造函数,我们可以很容易地做到这一点。

class Manager(Employee): def __init__(self, name, salary=0, department):
        Employee.__init__(self, name, salary=0)
        self.department = department

最佳实践

在使用类和对象时,有一些准则需要记住。

  • 要命名你的类,使用 camel case,这意味着如果你的类名包含几个单词,它们应该没有分隔符,每个单词应该以大写字母开头。
  • 对于方法和属性,情况正好相反——单词应该用下划线隔开,并以小写字母开头。
  • “自我”这个名字是约定俗成的。你实际上可以为一个方法的第一个变量使用任何名字,不管怎样,它总是被当作对象引用。尽管如此,最好还是坚持使用self
  • 不要忘记为你的类编写 docstrings,这样你的代码对潜在的合作者和未来的你来说更容易理解。

结论

总之,我们讨论了什么是 OOP、类和对象。我们还讨论了实例方法和类方法之间的区别,对于实例属性和类属性也是如此。我们还简要介绍了什么是类继承,以及使用类时的一些最佳实践。

就这样,我们找到了我们的向导。我希望你觉得这篇文章很有见地!如果你有,那么你可能会发现这些也很有趣。一如既往,我很乐意听到您的任何意见或问题。快乐学习!

使用 Python 观察脸书数据中的朋友悖论

原文:https://towardsdatascience.com/observe-the-friend-paradox-in-facebook-data-using-python-314c23fd49e4?source=collection_archive---------13-----------------------

平均来说,你的朋友比你的朋友多吗?

动机

平均来说,你的朋友比你的朋友多吗?如果你是一个普通人,很有可能你的 T4 朋友比你的朋友少。

这就是所谓的友谊悖论。这种现象表明,平均来说,大多数人的朋友比他们的朋友少。

在这篇文章中,我将展示为什么这样一个悖论存在,以及我们是否能在脸书数据中找到这个悖论。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GIF by Author —在这里与图形互动。

最小示例

为了理解朋友悖论为什么存在,让我们从一个最小的例子开始。我们将创建一个人际网络。两个人如果列在同一个 Python 元组里就是朋友。

现在我们将使用 Pyvis 来可视化网络。

pip install pyvis

如果你四处移动节点,你可以看到本是朋友圈的中心。

我们感兴趣的是发现这个网络中有多少人的朋友比他们的朋友平均少。我们将创建多个函数来帮助我们回答这个问题。这些功能是:

  • 获取特定人的朋友:

例如,劳伦的朋友是:

>>> get_friends(friends, "Lauren")
['Khuyen', 'Ben']
  • 获取特定人的朋友数量:
>>> get_friends(friends, "Lauren")
2
  • 获取某人朋友的好友数量:
>>> num_friends_map = get_num_friends_map(friends)
>>> get_num_friends_of_a_person_friends(friends, "Lauren",
...                                     num_friends_map)[3, 5]

结果显示 Khuyen 有 3 个朋友,Ben 有 5 个朋友。

  • 获取一个人的朋友平均拥有的朋友数量:
>>> get_average_friends_of_a_person_friends(friends, "Lauren")
4.0

输出显示 Lauren 的朋友平均有 4 个朋友,比她拥有的朋友数量多。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

如果我们仔细观察上面的图片,我们可以看到本的朋友数量增加了劳伦朋友的平均数量。

由于本有很多朋友,他的很多朋友也会和劳伦有类似的情况。换句话说,他们朋友的朋友数量平均高于他们的朋友数量,因为他们的一两个朋友是有影响力的人。

  • 获取网络中所有人的朋友数量

在上表中,

  • num_friends显示一个人有多少朋友。
  • avg_friends_of_friends显示了一个人的朋友平均拥有的朋友数量。
  • friends_have_more_friends一栏表示一个人的朋友是否平均比他/她自己有更多的朋友。

让我们找出网络中的朋友比他们的朋友平均少的人的百分比。

0.8333333333333334

从上表中我们可以看出,只有本的朋友比他的朋友平均多。是因为他是群体中的影响者。

分析脸书网络

脸书数据由来自脸书的朋友列表组成。脸书的数据是从调查参与者那里收集的,这些数据中的用户已经匿名。

你可以从这里下载数据。下载完数据后,解压保存为facebook_combined.txt

我们将使用前面的函数来获取人们在网络中拥有的朋友数量。

让我们找出网络中的朋友比他们的朋友平均少的人的百分比。

0.874721465709334

网络中 87%的人的朋友比他们的朋友平均少!

可视化影响者

网络中的影响者是哪些节点?让我们用 Pyvis 将它们可视化。

从向网络添加节点开始。

我们将影响者定义为那些比他们的朋友平均拥有更多朋友的人。我们将用红色标记被定义为影响者的节点。

添加边并显示网络图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GIF by Author —在这里与图形互动。

正如我们所看到的,红色节点(比他们的朋友平均拥有更多朋友的人)往往位于图表的中心。如果我们移动一个红色节点,许多蓝色节点也会跟着移动。这表明这些红色节点是网络中一个或两个子群的影响者。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GIF by Author —在这里与图表互动

结论

恭喜你!您刚刚学习了什么是朋友悖论,以及如何使用 Python 来观察脸书数据中的这种悖论。我希望这篇文章能给你动力,让你使用可视化和数据科学技术来观察你周围的其他悖论。

在这个回购中,您可以随意使用这篇文章的代码:

https://github.com/khuyentran1401/Data-science/blob/master/visualization/friend_paradox/facebook_network.ipynb

我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedIn 和 Twitter 上与我联系。

如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如:

[## 如何用 Excalidraw 勾画您的数据科学想法

towardsdatascience.com](/how-to-sketch-your-data-science-ideas-with-excalidraw-a993d049f55c)

参考

@misc{snapnets,
  author       = {Jure Leskovec and Andrej Krevl},
  title        = {{SNAP Datasets}: {Stanford} Large Network Dataset Collection},
  howpublished = {\url{http://snap.stanford.edu/data}},
  month        = jun,
  year         = 2014
}

通过非常简单的 web 编程获得历史和实时加密数据

原文:https://towardsdatascience.com/obtaining-historical-and-real-time-crypto-data-with-very-simple-web-programming-7b481f153630?source=collection_archive---------0-----------------------

在学习加密货币的过程中,我迫切需要可以操纵自己进行绘图和分析的数据。在这里,我将向您展示如何用最少的编程技巧在您的 web 浏览器中轻松获得实时和历史加密数据。包括源代码、链接和一些基本的图表和分析。

免责声明:你在这里找不到任何金融建议,我也不是加密货币、加密艺术、非金融交易及其交易等方面的专家。我只赠送免费的 HTML+JavaScript 代码,通过 API 调用 CryptoCompare.com 获取数据;我展示了一些从这些数据中得出的图表,还有一些我自己的主观看法。

…如果您需要任何临时工作,例如为您的问题量身定制的 web 应用程序,只需 联系我

我最近对加密货币、加密艺术、NFT 等感兴趣。自然,作为一名一直与数据打交道的科学家,我首先想做的事情之一就是自己玩加密货币数据。我在网站、新闻、app 上到处看到剧情;但是,我怎样才能得到实际的数据来玩它,做我自己的计划和调查呢?尤其是,我如何确保每次我请求它时它都是最新的?

具体来说,我首先想接触的是各种加密货币和法定货币之间的汇率。我发现 CryptoCompare.com 网站提供了一个很好的 API,少量的调用是免费的,允许从它的基础上编程访问数据。我还在网上找到了各种 JavaScript 代码,我把它们放在了两个非常简单的 web 应用程序中:一个用来每 10 秒钟更新一次 BTC 对美元的汇率;另一个是检索比特币历史上每分钟、每小时或每天的历史 BTC 兑美元汇率。请随意复制我提供的代码,并根据您自己的目标进行修改。

网络应用 1:实时获取任何交流信息

当然,你可以打开任何加密货币网站或应用程序,从那里获得这个数字,但假设你希望它总是在手边,并自动刷新,或者你可能希望它自动输入到你正在开发的计算系统中。

在 CryptoCompare 的 API 上简单访问此链接,就可以在您拨打电话时返回比特币(BTC)的美元汇率:

https://min-api.cryptocompare.com/data/price?fsym=BTC =美元

同样,另一个例子给出了调用时以太坊(ETH)对欧元的汇率:

https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms =欧元

很简单,不是吗?在此基础上,下面的代码每 10 秒钟返回一次您要求的任何换算(在本例中为 BTC 换算成美元),这是一个小网页,您可以将其设为私有,以便在自己的网站中跟踪您最喜欢的汇率:

<html><head>
    <title>Get crypto data in real time</title>
</head><body>
    <p id='info'></p>
    <p id='infotime'></p>
</body><script>
const getBtcData = async () => {
   fetch('https://min-api.cryptocompare.com/data/price?fsym=BTC&tsyms=USD')
  .then(response => response.json())
  .then(data => {
    console.log(data);
    document.getElementById("info").innerHTML = '<b>1 BTC = ' + data.USD + ' USD</b>'
  });
}getBtcData();tcount=setInterval(function(){
  tcount++
  if (tcount==10) {getBtcData(); tcount=0}
  document.getElementById("infotime").innerHTML = 'Next update in ' + (10-tcount) + ' seconds'
},1000);

</script>
</html>

您可以将这段代码复制粘贴到一个. html 文件中,然后用浏览器加载它,查看它的运行情况。或者,如果你觉得懒惰,只需在我的网站上打开这个演示示例:

https://lucianoabriata . alter vista . org/tests/cryptogames/get BTC-real time . html

您可以轻松地将其进一步开发成一个 web 应用程序,持续跟踪任何汇率,甚至将其存储在一个绘图中以便随时可视化,或者存储在一个变量中以供下载。

Web app 2:获取历史数据

但是如果你想在网页启动前获取数据呢?你可以去专门的网站下载这些数据。但是我发现好用的网站只提供部分数据。例如,雅虎财经的 BTC 数据始于 2014 年 9 月 17 日,其记录是每月、每周或每天,但不是每小时或每分钟。此外,如果您正在开发一个需要自动更新的系统,手动数据下载是不可能的…您需要编程访问。

幸运的是,CryptoCompare 的 API 包括以分钟、小时或天为单位检索历史数据的方法。不仅是汇率,还有其他指标,如交易量。要了解更多关于 API 的信息,请看它的文档并阅读下面的内容。

本例中的 API 调用将获取过去 20 小时的数据,每小时一次:

https://min-api.cryptocompare.com/data/v2/histohour?fsym = ETH&tsym = USD&limit = 20&toTs =-1&API _ key = YOURKEYHERE

输出可以用 JSON 格式进行解析。看起来是这样的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上面显示的 API 调用的输出示例。作者截图。

在 API 调用的 URL 中需要注意的几点(我们接下来将在 fetch() javascript 函数中使用):

  1. toTs=-1 表示您想要直到调用执行时的数据。
  2. 极限是你想要的行数。
  3. 您需要提供一个 API 密钥。

使用免费的 API 密钥(在文档页面获取;是的,您可以购买具有更高级功能的密钥)您可以拨打的电话总数有限,每次通话最多只能拨打 2000 次。例如,如果你想知道 BTC 以美元计算的每小时汇率,你将得到的最大值是从提示时间向后 2000 分钟,这意味着大约 33 个小时,也就是一天多一点。或者你要求每小时的数据,你最多会得到连续 83.33 天的数据,刚好不到 3 个月。然而,这并不是一个大问题,因为您可以根据需要多次向后重复 API,以覆盖您感兴趣的时间间隔。例如,要获得 BTC 的每日数据,直到它的起源,你需要截至 2021 年 8 月(写这篇文章时)的 4000 多点(天)。这意味着你只需要连续打 3 个电话。如果你想要同一时期的小时数据,你是在 98400 点左右,这是由 50 个连续调用覆盖的。

让我向您展示这个 web 应用程序,您可以使用它来查询对美元的任何汇率的每日历史数据:

<html>
<head><title>Get historical crypto data</title></head>
<body>
  <h2>Crypto data in your web browser:</h2>
  <table width=80%><tr><td valign=top width=40%>
    <button onclick='getBtcData()'>Get latest data</button>
    <p><br>
    <b>From:</b>
    <input id='fromTime' value='XXXX' size=10></input>
    <p id='fromInfo'></p>
    <br>
    <b>To:</b>
    <input id='toTime' value='XXXX' size=10></input>
    <p id='toInfo'></p>
    <br>
    <button onclick='getBtcDataPrevious()'>Get previous period</button>
    <p>
    <hr>
    <p>
    <button onclick='document.getElementById("txtout").value = ""; getBtcData()'>Restart with:</button>
    <input id='cryptoCurr' value='BTC' size=5></input> (in USD)  </td><td width=60%>
    <textarea id="txtout" cols=60 rows=20></textarea>
  </td></tr>
</table>
</body>
<script>
const getBtcData = async () => {
  const response = await fetch('https://min-api.cryptocompare.com/data/v2/histohour?fsym=' + document.getElementById('cryptoCurr').value + '&tsym=USD&limit=2000&toTs=-1&api_key=YOURAPIKEY');
  const json = await response.json();
  const data = json.Data.Data
  const times = data.map(obj => obj.time)
  const prices = data.map(obj => obj.high)
  var txt=""
  for (var i=0;i<times.length;i++)
  {
    txt = txt + times[i] + "\t" + serialDateToNiceDate(times[i]/3600/24).toString().substr(0,24) + "\t" + prices[i] + "\n"
  }
  document.getElementById("txtout").value = txt
  document.getElementById("fromTime").value = times[0]
  document.getElementById("toTime").value = times[times.length-1]
  document.getElementById("fromInfo").innerHTML = "<i>(" + serialDateToNiceDate(times[0]/3600/24).toString().substr(0,24) + ")</i>"
  document.getElementById("toInfo").innerHTML = "<i>(" + serialDateToNiceDate(times[times.length-1]/3600/24).toString().substr(0,24)+ ")</i>"}
const getBtcDataPrevious = async () => {
  const response = await fetch('https://min-api.cryptocompare.com/data/v2/histohour?fsym=' + document.getElementById('cryptoCurr').value + '&tsym=USD&limit=2000&toTs=' + document.getElementById('fromTime').value + '&api_key=YOURAPIKEY');
  const json = await response.json();  const data = json.Data.Data
  const times = data.map(obj => obj.time)  const prices = data.map(obj => obj.high)
  var txt=""  for (var i=0;i<times.length;i++)  {    txt = txt + times[i] + "\t" + serialDateToNiceDate(times[i]/3600/24).toString().substr(0,24) + "\t" + prices[i] + "\n"
  }
  tmp=document.getElementById("txtout").value
  document.getElementById("txtout").value = txt + tmp
  document.getElementById("fromTime").value = times[0]
  document.getElementById("toTime").value = times[times.length-1]
  document.getElementById("fromInfo").innerHTML = "<i>(" + serialDateToNiceDate(times[0]/3600/24).toString().substr(0,24) + ")</i>"
  document.getElementById("toInfo").innerHTML = "<i>(" + serialDateToNiceDate(times[times.length-1]/3600/24).toString().substr(0,24)+ ")</i>"
}getBtcData()function serialDateToNiceDate(date) {
  return new Date(Math.round((date)*86400*1000));
}</script></html>

代码可能看起来有点复杂,但它可以简单得多。这里的事情是,我创建了一个完整的界面,让用户选择在什么时间范围内获取数据,然后将后续调用的结果连接到一个文本框中,以便于复制:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

收集历史数据的界面,对应上面的代码。作者截图。

请注意,您必须调用 API 两次:一次是在调用直到执行时刻的数据条目列表的函数内部(getBtcData,当用户单击“Get latest data”时运行,并且在加载时自动运行),另一次是调用在给定时间之前返回数据的函数(getBtcDataPrevious)。还要注意,这些函数会自动更新 From 和 To 时间,这些时间以原始的串行格式显示,并通过 serialDateToNiceDate 函数转换为人类可读的形式。

加载页面或单击“获取最新数据”后,右侧的文本框将填充过去 2000 个小时的条目,并且“从”和“到”时间会更新。然后,您可以通过点击“获取前期”从前期请求 2000 行数据块。引入线将被添加到文本框中,保持历史顺序。

在看一些历史资料

正如我在介绍中所说的,我非常渴望获得自比特币诞生以来 BTC:美元兑换的时间演变数据。只需对上面显示的 web 应用程序稍加编辑(只需将“histohour”改为“histoday”),就可以得到一个返回每日记录的应用程序。然后点击三次“获取上一期”,你就可以获得比特币的每日数据,从 2010 年 7 月开始,一直到现在。

让我们画几幅这些数据的图。首先是汇率随时间的变化,这是你在大多数应用程序、网站和新闻中看到的图表:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

BTC 图:自 2012 年 8 月至 2021 年 8 月的美元汇率,数据来自上述修改为检索每日记录的应用程序版本。作者的情节和人物。

该图显示了五个关键的上升时间:一个在 2013 年底左右,一个在 2017 年底-2018 年初,然后是 2019 年的另一个,然后是 2021 年上半年的一个更强的上升,然后是现在正在发生的新的快速上升。

有趣的是,该图中观察到的最大值与 Google Trends 测量的长期兴趣大致相符:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2012 年 8 月至 2021 年 8 月搜索词“比特币”的谷歌趋势图。作者截图。

我们检索到的 BTC:美元汇率数据的另一个图表比我们上面的图表更有趣,它是以对数(此处 log in base 10)形式处理价格的图表:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

BTC 图:自比特币出现以来,美元汇率随时间的变化,数据来自检索每日记录的网络应用程序。作者图。

这个对数变换更清楚地指出上升阶段。检查从底部到顶部的相对峰高是否相差很大,并且似乎在缓慢衰减:第一个主峰需要大约 1.5 个数量级的增益(大约 30 倍);第二第三第四都在 1 个数量级左右(10 倍左右),最后一个只有 0.5 个数量级左右(3.2 倍左右)。因此,尽管历史最高值变得非常高,但对后来投资的人来说,获得巨额利润的机会正在逐渐减少。虽然那时用比特币发财已经太晚了,但 BTC:美元汇率的整体趋势似乎表明,它可能还会增长一段时间(不是告诉你在这里购买,只是天真地从情节中推断):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

与上面的图相同,用红色拟合二次函数。作者图。

这些日志图包含更多的数据,其他人已经在下面的博客文章中分析了这些数据。由于不是专家,我无法评价它们,但它们确实非常有趣:

https://medium.com/@100trillionUSD/modeling-bitcoins-value-with-scarcity-91fa0fc03e25 https://www.tradingview.com/chart/BLX/uYKn9Nrx-Bitcoin-longterm-chart/ https://www.lookintobitcoin.com/charts/bitcoin-logarithmic-growth-curve/ https://www.blockchaincenter.net/bitcoin-rainbow-chart/

结论和精选的进一步阅读

我希望你会喜欢使用这些和派生的脚本来获取和使用加密数据。这整个领域非常有趣,在过去两年里,在做我关于加密货币的研究时,我阅读了大量的论文、故事和帖子,我从中提取了这些内容,供您继续阅读,主要来自 Medium 及其相关出版物。

  • 在这篇文章发表几个月后添加:检查这个不需要密钥的替代 API:
  • 现在推荐文章:

https://medium.com/@hamzaahmad86/exploratory-data-analysis-of-cryptocurrency-historical-data-d8ec719641e7 https://medium.datadriveninvestor.com/python-for-finance-cryptocurrency-analysis-661ebd410fac https://medium.com/spreadstreet/how-to-perform-correlation-analysis-on-cryptocurrencies-in-google-sheets-640d45861dda [## 如何在 Google Sheets 中对加密货币进行相关性分析

medium.com](https://medium.com/spreadstreet/how-to-perform-correlation-analysis-on-cryptocurrencies-in-google-sheets-640d45861dda) https://medium.com/@eliquinox/cryptocurrency-data-analysis-part-ii-downloading-manipulating-and-analysing-bulk-data-e234a43e6259 https://medium.com/hackernoon/sentiment-analysis-in-cryptocurrency-9abb40005d15

喜欢这篇文章,想给我提示?【https://www.paypal.me/LAbriata】-谢谢!

我是一个自然、科学、技术、编程和 DIY 爱好者。生物技术专家和化学家,在潮湿的实验室和电脑前。我写我广泛兴趣范围内的一切。查看我的 列表 了解更多故事。 成为中等会员 访问其所有故事和 订阅获取我的新故事 通过电子邮件 (我为其获得小额收入的平台的原始附属链接,无需向您支付特殊费用)。 通过各种方式在这里捐赠。* 联系我这里 为任何一种查询。***

咨询关于小工作 (关于编程、biotech+bio info 项目评估、科学外联+交流、分子数据分析与设计、分子图形、摄影、私人课程与教程、私人课程、教学与辅导等。)查看我的 服务页面这里

使用 Webots 和 ROS2 绘制占用网格图

原文:https://towardsdatascience.com/occupancy-grid-mapping-with-webots-and-ros2-a6162a644fab?source=collection_archive---------11-----------------------

在 Webots 机器人模拟器上使用 ROS2 框架创建占位概率图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Webots 模拟器上的 e-puck2(图片由作者提供)

概观

自主机器人必须执行的许多任务之一是绘制环境地图。拥有一个环境图是很重要的,因为许多其他任务可能依赖于环境图作为先决条件。

对于一些机器人来说,地图是作为输入给出的,但对于许多其他机器人来说,这是不可能的。机器人必须通过探索来自主绘制环境地图。

地图也是一个先有鸡还是先有蛋的问题,通常被称为 SLAM(同步定位和地图),其中我们有两个相互关联的问题需要解决。定位需要地图来估计机器人的姿态,而映射需要精确的姿态来映射环境。

因为 SLAM 是一个更难解决的问题,所以在本文中我们假设姿态是准确的,这样我们就可以专注于贴图任务。

此外,读者必须对机器人和机器人操作系统版本 2 (ROS2)有基本的了解。

机器人模拟器

当我们想学习为机器人编写软件时,好的一面是我们不必拥有“真正的”机器人硬件,因为它们可能相当昂贵。此外,您可能需要一些硬件知识来设置它,并在出现问题时进行故障排除。

出于学习或测试的目的,我们可以使用机器人模拟器。有许多免费和开源的机器人模拟器可供我们使用。查看维基百科页面,了解它们:

https://en.wikipedia.org/wiki/Robotics_simulator

露台模拟器是机器人专家最常用的模拟器之一:

http://gazebosim.org/

但我发现 Webots 对初学者来说更容易,因为它提供了许多现成的商业机器人,并支持多种编程语言,尤其是 Python,这是一种很好的原型语言。

https://cyberbotics.com/

网络机器人

Webots 是本文中使用的开源三维移动机器人模拟器,因为它有许多可用的机器人可以用于我们的模拟,最重要的是,像 Gazebo 一样,它支持 ROS2。

ROS2

机器人操作系统版本 2 或简称 ROS2,是一个开源的机器人软件框架。

它并不像它的名字所暗示的那样是一个操作系统,而是一个由社区支持的框架集合。这使得为机器人编写软件变得很容易,更重要的是,有许多开源的 ROS2 可供我们在机器人软件应用中使用。

有了 ROS2,我们可以使用这些包来关注我们想要关注的领域,例如学习、研究等。

https://docs.ros.org/en/foxy/index.html

Webots ROS2 包

Webots ROS2 包是一个 ROS2 包,它提供了 ROS2 接口来模拟我们在 Webots 上的机器人和环境。

自主测绘任务

在我们开始写代码之前,我们应该在我们的系统上安装所有需要的软件。我们需要安装以下设备:

  • 网络机器人
  • ROS2(目前使用 foxy 发行版)
  • Webots ROS2 包

如何设置软件超出了本文的范围,在他们的网站上有很好的文档。

占用网格映射

假设姿态是已知的,占据栅格映射是关于从传感器测量数据创建环境的 2D 地图。该图被表示为均匀间隔的二进制(随机)变量的网格。True 或 1 表示位置被一些对象占用,False 或 0 表示自由空间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

入住网格图(图片由作者提供)

上图是一张 5x5 的占用网格图。我们的占用网格图具有以下属性:

  • 宽度
  • 高度
  • 解决
  • 数据

宽度和高度帮助我们读取数据,它通常是一个 1D 数组,分辨率是像元的大小,例如,如果像元的分辨率是 1x1 厘米,我们的地图的高度和宽度是 5 厘米。

占据概率图

占据概率图表示地图中的位置被占据的概率。所以不是 1 或 0,每个单元格代表它被占用的概率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

入住概率网格图(图片由作者提供)

该算法

这个算法来自巴斯蒂安·特龙、沃尔弗拉姆·伯格德和迪特尔·福克斯的《概率机器人学》一书。该算法是在给定数据的情况下计算地图上的后验:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

给定测量数据和姿势的地图概率(图片由作者提供)

然而,这种计算是很难的,因为一个地图可以包含大量的单元。因此,我们计算每个单元的后验概率,而不是图上的概率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

给定测量数据和姿态的细胞概率(图片由作者提供)

地图上的后部是其细胞的产物:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

后上方地图(图片由作者提供)

映射算法是:

Updata(map, range, pose):
 for cell in map:
  if cell in perceptual field:
   cell = cell + prob - prior
 return map

该算法采用机器人的当前地图、传感器测量和姿态。我们只对更新感知区域的细胞感兴趣,为此我们可以使用 Bresenham 的直线算法。所有小区的先验概率可以被设置为像 0.5 或其他值。行尾的单元格被占用,其他单元格是空闲空间(概率= 0)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

布雷森汉姆的台词(维基百科:【https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm】T2)

可以根据传感器制造商提供的传感器模型或我们自己的测量来计算被占用小区的概率。

ROS2 节点

为了实现自主绘图任务,我们需要三个组件(节点):

  • 制图人
  • 任务控制器
  • 随机保镖

以下视频展示了自主测绘任务的实际情况:

e-puck2 机器人通过弹跳自主绘制环境地图(视频由作者提供)

e-puck2 机器人通过弹跳自主绘制环境地图(视频由作者提供)

我已经实现了这三个节点,并在 Github 上提供了它们(见总结)。

任务控制器通过启动和停止随机弹跳器以及将地图转换为 PNG 文件并保存到给定的路径来控制整个任务。它控制任务应该运行多长时间。以上视频中任务的 PNG 文件如下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

生成的 PNG 文件—第一次任务(图片由作者提供)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

生成的 PNG 文件—第二次任务(图片由作者提供)

随机弹跳器通过设置线速度和角速度并从激光扫描中检测障碍物来移动机器人。

映射器接收传感器测量数据和变换来计算机器人的姿态,并创建和更新占据概率图并发布它。

如何安装和使用代码

要使用该代码,首先如上所述,您需要安装 Webots、ROS2 和 Webots ROS2 包。假设您已经安装了所有这些软件,那么您可以:

  • 克隆 git 存储库
  • 建设
  • 安装
cd /home/$USER/ros2_projects
colcon build --packages-select mapping_controller
. install/setup.bash

要运行它,您可以使用不同的参数执行启动文件:

ros2 launch mapping_controller mapping_controller_launch.py probability:=true rviz:=true mapping_time:=15 world:="test.wbt" path:="/home/$USER/Documents"
  • 概率:运行概率占用映射器
  • 运行 rviz
  • mapping_time:任务应该运行多长时间(分钟),默认为 5 分钟
  • 世界:网络机器人世界文件
  • 路径:保存 PNG 文件的位置

摘要和代码

我们在上面已经看到,我们可以使用开源软件来学习为机器人开发软件,并在模拟器上测试我们的软件。

我在这里展示的一个简单的例子是机器人的自主地图任务,它绘制环境地图以用于不同的目的,例如定位。

正如你从视频中看到的,随机反弹效率不高,因为它可能需要很长时间来映射甚至正常大小的房间。更智能的运动模式会好很多。

此外,你可能会注意到地图不是很准确,这主要是因为我们只对机器人姿态使用里程计,这容易随着时间的推移积累误差。我们需要 SLAM 来给我们一个更准确的姿势。除此之外,误差也是由传感器本身的特性引起的。

Github 上的代码

您可以通过在以下位置克隆我的存储库来尝试代码:

https://github.com/debbynirwan/mapping_controller

如果你感兴趣的话,试着改进它,提高你的公关水平。感谢阅读。

强迫症工具对浓缩咖啡不起作用

原文:https://towardsdatascience.com/ocd-tools-dont-work-for-espresso-5b2f988af495?source=collection_archive---------19-----------------------

咖啡数据科学

你把他们引向了错误的方向

最近,我发布了一个带有玻璃杯子的视频,显示这种强迫症类型的工具只影响地面的顶部。我直观地争辩道,这个工具没什么价值。强迫症患者中的每个人都认为我转错了方向。我认为我转的方向是对的(逆时针),因为反方向转除了把咖啡渣弄平之外,没什么作用。

在这篇短文中,我展示了顺时针转动 OCD 型分配器会使接地变平,但不会分配太多。逆时针旋转它会分配更多的地面,但就像在视频中一样,只有上半部分。如果你愿意,这里有一个链接到这个实验的短片。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所有图片由作者提供

没有一项研究显示 OCD 工具改善了浓缩咖啡的提取。事实上,在多项研究中,该工具降低了提取物的产量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实验设计

这个实验是为了观察有多少咖啡渣在上面移动。我决定用两根线,因为它们很容易拿出来放在同一个咖啡里,而不是用面粉、盐或糖来显示颜色对比。

此外,我用两根绳子与楔子排成一行。一根绳子在楔子的最深处,另一根在最浅处。

我的理论是,对于顺时针方向,楔子最深处的绳子不会移动太多,因为它会被捣得很好。另一根弦可能会移动一点。

我并不总是使用强迫症工具,但当我这样做时,我先逆时针再顺时针转动它。

顺时针方向的

我首先向下推,只是为了显示两根弦在哪里对齐。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后我翻了几下。楔子最深处的绳子几乎不动。另一根弦会轻微移动。实际上,当顺时针转动时,它就像一个调平器。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

左图:应用工具之前。右:顺时针应用工具后

逆时针方向

我使用了相同的设置,我期望琴弦移动得更多,但我没想到它们移动得这么多。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

左图:应用工具之前。右:逆时针应用工具后

OCD 或楔形工具可以在两个方向上工作:一个是分配,一个是调平。无论哪种方式,如果你仍然认为我在我的视频中转动的方式是错误的,你可以自己用绳子或其他东西做这个实验。如果你发现有趣的东西,请告诉我。也许这种测试有助于显示校平机的差异。对我来说,它只是另一个应用程序,其中数据(在这种情况下是视觉数据)显示实际发生的事情。

附注:我不使用强迫症工具,除非我看到数据显示它不仅仅是看起来很酷,否则我不会使用。

如果你愿意,可以在 Twitter 和 YouTube 上关注我,我会在那里发布不同机器上的浓缩咖啡视频和浓缩咖啡相关的东西。你也可以在 LinkedIn 上找到我。也可以关注我

我的进一步阅读:

浓缩咖啡系列文章

工作和学校故事集

个人故事和关注点

乐高故事启动页面

摄影启动页面

一款价格实惠、简单透明的意式浓缩咖啡过滤器

浓缩咖啡过程中粉末不会迁移

为浓缩咖啡捣固的收益递减

浓缩咖啡可以涡轮增压吗?

浓缩咖啡浸泡测试

【Kompresso 能得到 9 巴压力的浓缩咖啡吗?

浓缩咖啡透明移动式过滤器实验

浓缩咖啡预湿,而不是预浸

OCR 101:你所需要知道的

原文:https://towardsdatascience.com/ocr-101-all-you-need-to-know-e6a5c5d5875b?source=collection_archive---------4-----------------------

OCR 中的研究、工具和挑战

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

介绍

我爱 OCR(光学字符识别)。对我来说,它代表了数据科学,特别是计算机视觉的真正挑战。这是一个现实世界的问题,它有许多方法,它涉及计算机视觉,管道调整,甚至一些 NLP。这也需要大量的工程。它概括了数据科学中的许多问题:破坏稳健的基准,过度强调方法的复杂性和“新颖性”,而不是现实世界的进步。

两年前,我在发表了一篇关于 OCR 的文章。和我的大多数文章一样,它的目的是回顾这个领域——研究和实践,阐明你能做什么和不能做什么,如何做和为什么做,并提供实用的例子。

它的本质是——当时深度学习 OCR 是,但还不够。如今后来 OCR好多了。但还是不爽

然而,考虑到深度学习领域的活力,在我看来,它需要更新,甚至可能需要完全重写。这就是了。如果您到了这里,您可能对 OCR 感兴趣。要么是学生,要么是想研究这个领域的研究人员,要么是有商业兴趣。无论哪种方式,这篇文章应该让你跟上速度。

想了解更多?参观 Shibumi-ai.com

入门指南

首先,让我们理清我们的概念:

  • OCR光学字符识别。这是一个常用术语,主要指文档中的结构化文本。
  • STR场景文字识别。大多是指野外更有挑战性的文字。为了简单起见,我们将它们都称为 OCR。

如前所述,OCR 描述了深度学习和数据科学领域的许多成就和挑战。一方面,这是一个巨大的进步。也是一个令人印象深刻的年度改进。但是 OCR 还是没有解决

仍然有一些非常令人讨厌的失败案例被解释为不同的原因,其中大多数都源于标准的深度学习根本原因——缺乏泛化能力,对噪声的敏感性,等等。因此,即使模型可以处理许多情况(不同的字体、方向、角度、曲线、背景),也有一些偏差是行不通的(只要它们不是手动引入到训练集中):不流行的字体、符号、背景等等。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

任意形状的文本-来自 ICDAR 2019 数据集

此外,已经出现了一个伟大而有用的库— Easy OCR ,它设定了一个目标,使最先进的 OCR 方法在开放源代码中易于访问和使用。作为额外的奖励,这个库还解决了 OCR 中的多语言问题(目前包括大约 80 种语言和更多语言)和模型的速度(仍处于早期阶段)。这个库并不完美,但它确实是一个很好的解决方案。稍后将详细介绍。

所以事不宜迟,让我们检查一下 OCR 的状态。

值得注意的研究

与往常一样,数据科学任务的边界通过研究得到扩展,而实践在创新方面落后,但在稳健性方面领先。

在我之前的文章中,我回顾了 3 种方法:

  1. 经典计算机视觉的流行方法。
  2. 通用深度学习方法,检测和识别,高效易用。
  3. 用于 OCR 的特定深度学习方法,如 CRNNSTN 达到了良好的结果,但“太新而不可信”。

在这篇文章中,我们可以说特定的深度学习方法已经成熟,并成为研究和实践中的主导方法。

任务

在之前的帖子中,我们使用了一些在当前状态下看起来很简单的例子:车牌识别验证码识别等等。今天的模型更加有效,我们可以讨论更加困难的任务,例如:

  • 解析截图
  • 解析商业手册
  • 数字媒体解析
  • 街道文本检测

管道

在 OCR 上应用标准的对象检测和分割方法后,方法开始变得更加具体,并且适合文本属性:

  • 文本是同质的——文本的每个子部分仍然是文本。
  • 可以在不同级别中检测文本——字符、单词、句子、段落等。

因此,现代 OCR 方法“隔离”特定的文本特征,并使用不同模型的管道来处理它们。

这里,我们将重点关注某个设置,实际上是一个模型管道,除了视觉模型(特征提取器),还有一些更有用的组件:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

管线图—来自(1)

  1. 流水线的第部分是正文检测——最直观的拆分。很明显,如果您要使用不同的部分,在识别实际字符之前检测文本的位置可能是一个好主意。这部分与其他部分分开训练。
  2. 管道的第二部分是可选的——转换层。它的目标是处理各种扭曲的文本,并将其转换成更“规则”的设置(见管道图)
  3. 第三个部分是视觉特征提取器,可以是你最喜欢的深度模型(不过好老的 ResNet 当然效果最好)。
  4. 流水线的第四个部分是 RNN,用于学习重复出现的文本序列。
  5. 第五个也是最后一个部分是 CTC 损失。最近的作品换成了关注

除了检测部分之外,该流水线大部分是端到端训练的,以降低复杂性。

管道“疾病”

拥有不同组件的管道是一个好主意,但是它也有一些缺点。每个组件都有自己的一组偏差和超参数,这导致了管道中另一个层次的复杂性。

数据集

众所周知,所有好的数据科学工作的基础是数据集,而在 OCR 中,数据集是至关重要的:结果受到所选择的训练和测试数据集的严重影响。多年来,OCR 任务在大约十几个不同的数据集中得到了磨练。然而,他们中的大多数没有包括超过几千张带注释的图片,这似乎不足以扩大规模。另一方面,OCR 任务是最容易使用的合成数据之一。

让我们看看有哪些突出的数据集可用:

“真实”数据集

一些数据集利用了谷歌街景的大规模覆盖。这些数据集可以根据它们对规则或不规则(扭曲、有角度、圆形)文本的关注来划分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自(1)

SVHN——街景数字,我们在上一篇文章中用作例子。

SVT —街景文本—来自谷歌街景的文本图像

ICDAR (2003,2013,2015,2019)——一些为 ICDAR 大会和竞赛创建的数据集,侧重点不同。例如,2019 数据集被称为“任意形状的文本”,这意味着,尽管它变得不规则。

合成数据集

有两个流行的合成数据集,在大多数 OCR 工作中使用。不一致的使用使得作品之间的比较具有挑战性。

【MJ Synth】—包括相对简单的单词组成。数据集本身包含约 900 万张图像。

Synth****text—一种更精细的机制,它在第一阶段应用图像的分割和深度估计,然后在推断的表面上应用“植物”文本。数据集本身包含约 550 万张图片。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自(1)

DALL-E——有点不确定,但文本图像生成(或许还有 OCR)的未来似乎更加无人监管。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自https://openai.com/blog/dall-e/

合成数据集还擅长生成不同的语言,甚至是困难的语言,如中文、希伯来文和阿拉伯文。

韵律学

在处理具体的研究论文之前,我们需要确定成功的衡量标准。显然不止一个选择。

首先,让我们把文本检测放在一边:它可以使用对象检测的标准度量,比如平均精度,甚至标准精度和召回率。

现在是有趣的部分——认知。主要有两个指标:单词级准确率和字符级准确率。特定任务可能使用更高的准确度(例如文本块准确度)。当前最先进的方法在具有挑战性的数据集上的准确率超过 80%(我们将在后面讨论)。

字符级别本身由“标准化编辑距离”包裹,该距离测量单词之间相似字符的比率。

研究论文

在本帖中,我们将重点放在最佳实践上,而不是提出想法。关于想法,我建议你去参加这两个调查中的一个,在那里你会发现有很多方法让你很难做出选择。

场景文字识别有什么问题?

这个非常有趣的作品有一个有点不寻常的名字,而作品本身也很出色。这是一种主动调查,它:

  • 定义统一的训练和测试集(经过一些优化)。
  • 测试和基准测试数据集上的最佳实践。
  • 从逻辑上构建方法,并“帮助”读者理解使用什么。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

根据(1)对恒定测试集上的 OCR 管道进行分类

因此,本文的要点是:

  1. OCR 的训练数据集(可能被认为是“最好的”)是两个合成数据集— MJ 和 Synthtext。此外,重要的特征不是数量,而是多样性(减少数据量不会对模型的性能造成太大影响,但删除一个数据集会造成影响)
  2. 测试数据集是大约 5 个真实世界的数据集。
  3. 论文展示了每次管道更新后结果的逐步改善。从 60%到 80%的准确率的最显著的改进是将特征提取器从 VGG 改进为 ResNet。接下来增加的 RNN 和归一化将模型提高到 83%。CTC 对注意力的更新增加了 1%的准确率,但是增加了三倍的推断时间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自(1)

文本检测

在本文的大部分内容中,我们讨论了文本识别,但是您可能还记得,管道的第一部分是文本检测。达到当前一代的文本检测模型有点棘手。以前,文本检测被直观地认为是对象检测的一个分支。但是,对象检测有一些设置是通用的对象,如汽车,人脸等。当引入文本检测时需要一些重要的更新。

其实质是,文本既是同质的,又以其局部性为特征。这意味着,一方面,文本的每一部分都是单独的文本,另一方面,文本子项应该统一成更大的项(例如,字符到单词)。因此,基于分割的方法将比对象分割更适合文本检测。

飞船

我们最喜欢的对象检测方法,也被集成到 easy OCR 中,被称为工艺 —用于文本检测的字符区域意识。这种方法应用了一个简单的分割网络,很好地使用了真实图像和合成图像,以及字符和单词级别的注释。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

工艺模型方案—图片来自(2)

这个模型产生了大约 80%的 H-mean(在 P 和 R 上)和大多数数据集,并且在单词分离方面也做得非常好,使识别模型更容易。

实际例子

我们已经到了实用阶段。你应该用什么?所以我们在前面已经回答了这个问题(简单的 OCR…),但是让我们检查一些流行的解决方案

开放源码

值得注意的一件非常重要的事情是,虽然 OCR 受到学术界缺乏鲁棒性的影响,但它享受着开源软件的蓬勃发展,这使得研究人员和从业者可以建立在彼此的工作基础上。以前的开源工具(例如 Tesseract,见下文)都是从数据收集和开发开始。最近的软件包,如 easy OCR,拥有一套构建模块,从数据生成,通过所有管道模型和更多的调整。

工具

宇宙魔方

在很长一段时间里,Tesseract OCR 是领先的开源 OCR 工具(不考虑偶尔与纸张相关的存储库)。然而,这个工具是作为经典的计算机视觉工具构建的,并没有很好地过渡到深度学习。

原料药

OCR 是大型云提供商——谷歌、亚马逊和微软——的一些早期计算机视觉 API。这些 API 不共享它们能力的任何基准,所以测试就成了我们的责任

轻松 OCR

在某种程度上,Easy OCR 包是这篇文章的驱动力。从不同的构建块构建一个开源的、最先进的工具的能力是令人着迷的。

它是这样工作的:

  1. 使用 MJ-Synth 包生成数据。
  2. 工艺模型(见上图)用于检测。
  3. 训练一个基于“什么是错的”论文的微调管道,(见上文)用于文本识别。
  4. 其他优化。
  5. 多语言:如前所述,OCR 包含一些 NLP 元素。因此,处理不同的语言有差异,但我们可以从 CRAFT 模型(可能还有其他检测模型)中受益的相似之处是多语言。识别模型是特定于语言的,但是训练过程是相同的,有些是相同的(例如希伯来语和阿拉伯语是 rtl 语,而不是从左到右)

这个难题的最后一块,也是使其成为现阶段“走向 OCR 技术”的一块,是性能。你可以在下面看到,它们甚至比付费的 API 结果还要好。

Easy OCR 需要改进的一点是调整能力:虽然语言选择很容易,但可以根据不同的目的改变模型和重新训练。在我们的下一篇文章中,我们将展示如何做到这一点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自https://github.com/JaidedAI/EasyOCR

运行时呢?

OCR 的推断可能很慢,这并不奇怪。检测模型是一个标准的深度学习模型,在 GPU 上运行约 1 秒(每张图像),而识别模型在检测中反复运行。一个有很多项目的图像,在 GPU 上可能要几十秒,更不用说 CPU 了。如果你想在手机或 PC 应用上运行 OCR,使用较弱的硬件会怎样?

简单的 OCR 可以帮你解决这个问题:首先,这个库归纳了一些技巧来加快推理速度(例如,更紧密的图像切片形状来识别物体)。此外,由于是模块化的,有可能(目前有一些代码调整)集成您自己的模型,这些模型可以更小、更快。

代码示例

所以在讨论了不同的套餐和模式之后,是时候见证实际效果了。去这个 colab 笔记本试试 Easy OCR vs Google OCR vs Tesseract。我选择了两张图片:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“PDF”——图片来自(1)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“挑战的形象”——作者笔下的形象

一个是常见的 OCR 案例—来自文档的标准结构化文本,第二个是具有挑战性的书籍封面集合:许多字体、背景、方向(没有那么多)等等。

我们将尝试三种变体:Easy OCR、Google OCR API(被认为是大型技术云 API 中最好的)和传统的 Tesseract。

便携文档格式

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

PDF 结果

在这类文本上,好的 ole’ TesseractGoogle OCR 表现堪称完美。这是有道理的,因为谷歌 OCR 可能在某种程度上基于宇宙魔方。

注意 google OCR 对这类文本有一个特殊的模式——DOCUMENT _ TEXT_DETECTION,应该应用这个模式而不是标准的 TEXT _ DETECTION。

Easy OCR 的准确率在 95%左右。

挑战形象

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

:谷歌 OCR — — — :简易 OCR

一般来说,简单的 OCR 结果是最好的。具体来说,检测组件捕获了大约 80%的项目,包括非常具有挑战性的对角线项目。

谷歌的 OCR 更差,大约 60%。

在认知度上,他们大致相当——大约 70%在字符水平上,这使得他们在单词或书籍水平上不那么好。看起来 Google OCR 对一本书不是 100%正确,而 Easy OCR 有一些。

我注意到的另一件事是,虽然 Easy OCR 在字符方面更好,但谷歌 OCR 在单词方面更好——这让我觉得它可能在幕后使用了 s dictionary。

总结与未来

我希望你喜欢这篇文章。

我们已经看到,虽然已经做了很多工作,但 OCR 也遇到了深度学习的相同泛化问题,并且可能会继续遇到这种问题,直到一些范式发生变化。

最近的开放人工智能模型——Clip 和 Dall-e,显示了一些“无监督”的 OCR 理解

在接下来的文章中,我们将卷起袖子:

  • 了解如何根据我们的目的定制简易 OCR 框架
  • 为我们的目的训练一个定制的 OCR 引擎。

敬请期待!

参考资料:

  1. 场景文本识别模型对比有什么问题?数据集和模型分析— Baek 等人。
  2. 用于文本检测的字符区域意识。
  3. https://github.com/PaddlePaddle/PaddleOCR——这个 OCR 包最近在 GitHub 上流行,但是我们还没有机会测试它。
  4. 我之前关于 OCR 的帖子

想了解更多?结账Shibumi-ai.com

十月版:数据科学遇上运动

原文:https://towardsdatascience.com/october-edition-data-science-meets-sports-e66514480c62?source=collection_archive---------17-----------------------

月刊

探索体育界最容易接受数据科学解决方案的领域

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

张秀坤·库恩Unsplash 上拍摄的照片

数据科学是一个不断扩展到新行业的广阔领域,提供了大量有价值的产品和服务。体育产业——一个非常有利可图的产业——不能错过这个机会。

从体育数据中提取有意义的见解并不是最近的事。数据分析早在 20 世纪 90 年代初就进入了体育领域,从那时起,每个人——从运动员个人到大联盟——都在使用它来服务于表现、营销和其他目标。如今,当尖端技术以及最先进的机器和深度学习模型被广泛利用时,体育数据分析有时会承诺太多。尽管如此,到 2022 年底,它有望成长为一个 40 亿美元的产业!

为了更好地描述数据科学在体育领域的应用,我们可以将该领域分为两个主要领域:

  1. 数据分析 —操纵大量数据集的广阔领域,以生成关于比赛结果和球员转会等统计数据的有意义的见解。它主要由俱乐部、独立分析师甚至大学进行,服务于俱乐部本身或球迷(在博彩的背景下)。
  2. 体育科学——一个特殊的领域,汇集了许多有助于提高俱乐部和运动员效率的应用。在这里,我们观察优化球队打法(球员位置等)的技巧。)、球员能力(如任意球)、健康或体能(如伤病预测)。所有这些都指向同一个目标:降低成本或收益最大化。

亲爱的 TDS 读者:这是你下一个项目的一些思考材料😉),可以使用机器学习算法的一些典型情况包括:

  1. 分类

将比赛相关数据的数据集加载到分类器(可能是神经网络)中,以预测未来比赛的结果(赢、输、平)——这本质上是一个多标签分类问题。

2.回归

操纵基于球员的数据集,解释他们的任何能力(如加速),并预测其在比赛中各自的水平。球队的医疗和训练人员经常使用这种算法,以便更好地监控球员并制定他们的训练方案。

3.集群

聚集比赛中球员表现的数据集(例如,在足球比赛中,这可能意味着传球的准确性、覆盖的距离等。),通过仅保留获胜实例来对其进行分段,并以最佳样本包含在一个或两个聚类中的方式对其进行聚类。在现在聚类的数据集上,训练分类器来预测任何感兴趣的玩家的过去游戏的标签。那些其性能将他们分配到最佳集群的人可以被认为是交易的主要目标!

4.计算机视觉

这一切都是为了让计算机能够从数字图像或视频中获得高层次的理解。作为一个相当新的跨学科科学领域,它几乎没有现有的文献,直到最近。但是大量的新论文处理这种类型的复杂事件识别。在体育领域,我们可以看到算法被用来检测球员在球场上的位置和动作,并推断出如何构建进攻和防守策略的见解。

总而言之,数据和体育是齐头并进的:球员、经理、教练和球迷基于分析做出决策。这就是为什么近年来出现了大量以体育为导向的数据工作(即体育分析师、数据球探等。)有一个共同的目标:揭开这个利润丰厚的行业的神秘面纱,一次一个数据集…

这里有一些你能在 TDS 档案中找到的最好的体育和数据相关的帖子。

Gerasimos PlegasTDS 的志愿编辑助理

AI 能让你成为更好的运动员吗?

利用机器学习分析网球发球和点球

戴尔·马科维茨 — 11 分钟

使用自然语言处理嵌入足球语言

使用最先进的 NLP 算法构建体育分析领域未来机器学习解决方案的表示

Ofir Magdaci — 13 分钟

用 SQL 为 2021 年东京奥运会做准备

用 Python 查询 PostgreSQL 数据库,用 Pandas 显示结果,用 Matplotlib 可视化

塞加尔·杜瓦 — 18 分钟

使用 Python Pandas、Keras、Flask、Docker 和 Heroku 的端到端机器学习项目

预测体育比分,从数据争论到模型部署

瑞安·兰姆 — 7 分钟

数据科学家能代替 NBA 球探吗?最佳转会建议的 ML 应用程序开发

使用 NBA API 创建自己的 ML 模型并预测最佳球员交易

Gerasimos Plegas — 12 分钟

棒球迷统计:投球版

一名数据科学家表示,作为一名普通球迷,ERA 是最重要的统计数据

由考特尼·佩里戈——10 分钟

如何用 Python 可视化数据中的隐藏关系——分析 NBA 辅助

使用交互式快照、气泡图和桑基图操纵和可视化数据,通过 Plotly 获得洞察力(代码和数据在我的 GitLab repo 中)

JP Hwang — 12 分钟

通过数据分析理解网球比赛中一发的重要性

我们能根据一个网球运动员的第一次发球来判断他的表现吗?

安德里亚·卡扎罗 — 9 分钟

体育分析:国际足球比赛的探索性分析——第一部分

有可能通过强大的分析工具研究体育市场是一个巨大的附加值。

瓦伦蒂娜·阿尔托 — 9 分钟

羽毛球比赛中的发球、得分领先和连续得分

特定指标如何影响羽毛球运动员的心态和表现

马潇湘 — 8 分钟

美丽的游戏

用随机模型预测英超联赛

作者:Tuan Nguyen Doan — 7 分钟

使用 Python 在 Peloton 中踩踏板

使用基础数据分析对环法自行车赛进行分析

到了威尔·克劳利 — 12 分钟

最后,这是一个欢迎所有在过去一个月加入我们的优秀作家的伟大时刻——有你加入 TDS 真是太好了!他们包括迪维娅·戈皮纳特乔伊塔·巴塔查里亚妮娜·斯威尼阔克·蒂恩奥米兰·伦纳德大卫·恩杜克武博士凯丽·哈里里阿肖克·奇拉卡帕蒂丹尼尔·赫尔克特丹尼尔·古兹曼 https://medium.com/u/8c7d2efa99b?source=post_page-----e66514480c62-------------------------------- 杰西卡·达弗伦克里斯·贝克特埃米尔·里肯克利斯朵夫·布莱法里克莱夫·西维欧阿努克·杜特尔埃尼费西米·阿德莫耶莉莉·吴托马斯·鲍姆加特纳拉韦娜·贾亚季耶夫 我们邀请你看看他们的简介,看看他们的工作。

赔率!=概率

原文:https://towardsdatascience.com/odds-probability-c9cf80405027?source=collection_archive---------11-----------------------

所以很多人觉得他们是一回事。这就是为什么它们非常不同,以及你需要注意的地方

许多人交替使用“odds”和“probability”两个词。这两个术语都意味着对可能性或机会的估计。对于外行人来说,我可以理解这一点,但我经常看到数据科学家和统计学家也混淆了这些概念,这很遗憾,因为从数学上来说,它们意味着不同的东西。

虽然它们都是相关的,但赔率和概率在规模和意义上是非常不同的。当在错误的环境中混淆时,这可能导致对机会的错误估计,从而导致错误的决策。

在这篇文章中,我想说明这些区别是什么,以及混淆这两者会如何影响分析和研究。

概率和赔率有什么区别?

想象你把手放进一个黑色的包里。在那个包里有五个红色的球,三个蓝色的球和两个黄色的球。

一个概率被定义为某一事件发生的次数,用所有可能发生的事件的*的比例来表示。*在我们的黑色袋子里有三个蓝色球,但总共有十个球,所以你抽出一个蓝色球的概率是三除以十,即 30%或 0.3。

几率定义为某一事件发生的次数,表示为该事件未发生次数与的比例。在我们的黑色袋子里有三个蓝色的球,但是有七个球不是蓝色的,所以抽到一个蓝色球的几率是 3:7。赔率通常表示为,在这种情况下是 3 除以 7,约为 43%或 0.43,或者是 7 除以 3,约为 233%或 2.33。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1:以事件概率的函数表示的事件概率(作者生成)

赔率和概率有什么关系?

赔率和概率之间的转换并不难,这里有两个简单的转换公式——看看你是否能理解为什么这些公式基于我上面给出的简单例子:

  • 如果某件事发生的概率是 P ,那么它发生的几率就是 P/(1 — P) 。参见图 1 中的图表。
  • 如果某事发生的几率是 *O,*那么它发生的概率是 O/(1 + O)

思考赔率和概率在属性上的不同也很有帮助:

  • 概率有一个从零到一的有限范围。赔率的范围是无限的。
  • 某事发生的概率总是小于它发生的几率(假设概率非零)。
  • 概率越小,相似的概率和赔率就越多。比如英国国家彩票中奖概率是 0.0000000221938762。几率是 0.000000221938767。
  • 概率越大,与赔率的差异越大。大概率有天文数字的赔率。90%的概率等于 900%的几率,99%等于 9,900%,99.999%等于 9,999,900%。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2:赔率增加 5%、50%和 95%对事件概率的影响(作者生成)

为什么这很重要?

这可能导致理解上的重大错误的一个领域是当逻辑回归被用于研究一个问题时。逻辑回归用于模拟某些输入变量如何影响二元(或多类)结果(例如是或否,组成员或非组成员)。例如,逻辑回归可用于确定许多生活方式因素如何影响疾病的五年生存结果。

逻辑回归模型使用优势比来量化给定输入变量的影响程度。优势比描述了基于输入变量增加一个单位的结果优势的百分比变化。例如,你可能会计算出,一个人每增加一公斤额外的体重,患病的几率就会增加 5%。

这并不意味着“体重每增加 1 公斤,患病的可能性就会增加 5%”。这完全取决于首先得这种病的概率是多少。赔率增加的影响根据事件的先验概率而减小。图 2 说明了这一点。

量化变量的影响时,要注意的主要事情是混淆几率和概率。一般来说(除了完全确定或完全不可能的情况),增加的几率意味着增加的可能性——通常术语可能性被用来包含两者。因此,在谈论方向效果时,将这些术语作为同义词使用通常是安全的。当你量化这些影响时,你必须小心你的语言。

最初我是一名纯粹的数学家,后来我成为了一名心理计量学家和数据科学家。我热衷于将所有这些学科的严谨性应用到复杂的人的问题上。我也是一个编码极客和日本 RPG 的超级粉丝。在 LinkedIn 或 Twitter 上找到我。也可以看看我关于drkeithmcnulty.com的博客或者我的 关于人物分析的教科书

反事实和假设

原文:https://towardsdatascience.com/of-counterfactuals-and-hypotheticals-6dacc6cd4871?source=collection_archive---------30-----------------------

理解综合控制方法背后的直觉——它的用途、优点和局限性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

MediaPRO 上的照片

作为人类,我们总是倾向于在大脑中创造假设的场景。我们通常通过与做出相反决定的假想时间线进行比较来衡量任何决定的影响。因此,没过多久,政策制定者就开始通过提出几个“如果”来衡量政策干预的效果。场景。一种通过创造这种反事实情景来评估政策干预效果的技术是综合控制方法(SCM)。由 Abadie 和 Gardeazabal 开发的,经济展望杂志将其描述为*“可以说是过去 15 年政策评估文献中最重要的创新”。*

但是为了更好地理解这一点,我们来看一个案例研究

1.99 号道具

1988 年,加州通过了一项名为 99 号提案的烟草控制计划。到 1990 年,加州人的烟草消费显著下降。对这一突然下降的天真解释可以归因于该方案。但是当如此大规模的干预被执行时,结果很少只有一个原因。一个更怀疑的人会强调其他因素-

  1. 甚至在该政策颁布之前,加州的吸烟率就已经在下降。
  2. 更加重视健康教育方案和其他此类活动,这可能有助于稳步下降。

因此,一个简单的之前和之后的故事不会帮助我们充分理解“道具-99”的效果。对我们有帮助的是创造一个从未实施 Prop-99 的替代场景——而合成控制恰恰做到了这一点。它的正式定义如下-

这是一种在比较性病例研究中评估治疗效果的统计方法。它通过对控制组中的变量和观察值进行加权来创建处理单元的合成版本。

让我们将它分解并应用到我们的案例中:

1.首先,选择一批潜在候选人作为对照组(即没有实施这种烟草控制方案的其他州)。

2.在这些潜在的候选人之外,通过将干预前的结果和直接影响结果的其他变量(即香烟销售)与目标地区(即加利福尼亚)干预前时期的相同变量相匹配,形成一个合适的捐献者库。

3.该捐助者池+目标区域用于建立一个“合成州”,该州与政策干预前的加州烟草消费非常相似,并在政策颁布后作为目标区域的控制。

最终输出可以用如下图形表示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

[1]人均卷烟销售趋势:加利福尼亚州与美国其他地区

现在,使用这种技术,我们可以回答怀疑论者之前提出的问题。

  1. 由于我们的捐助者群体由没有实施此类政策干预的州组成,因此很少有机会通过外推法来证明我们的反事实结果变量的合理性。
  2. 由于合成状态是由从候选池中选择的供体区域的加权和构成的,因此在选择控制状态时没有偏差,这可能是传统差异中的差异方法的缺点之一。
  3. 该模型的有效性反映在合成状态如何紧密地跟随政策干预之前的治疗状态的结果趋势线。

2.什么时候用?

  1. 从上面的案例可以看出,供应链管理的实施通常发生在一个集合的层次上:国家、州、地区等。
  2. 它适用于不存在合适比较的区域。举个例子,如果 A 和 B 是两个单位,A 实施了一些干预。我们可以比较干预对 B 组的影响,并找到感兴趣的反事实。但是,在没有 B 组的情况下,我们使用 SCM。
  3. 只有一个治疗病例和几个对照病例。

3。局限性

很容易理解为什么我们更喜欢使用这种技术来创建一个模型,该模型可以在总体水平上估计政策干预的效果。但是它也有自己的局限性。

供应链管理的主要挑战之一是在缺乏协变量信息的情况下选择合适的供体库——特别是对于可能需要大量领域专业知识的问题。因此,麻省理工学院的研究人员开发了鲁棒综合控制(RSC) ,这可以解释为一种更一般化的 SCM 方法

与 SCM 相比,使用 RSC 的主要优势是

  1. 通过奇异值阈值对数据矩阵去噪;顾名思义,这使得它在多个因素上“稳健”。
  2. 它会自动选择一个合适的供体库,因此我们只需要在没有足够的协变量信息的情况下关于结果变量的数据。
  3. 因此,在使用 RSC 时,领域专业知识几乎成了一种奢侈品,而不是必需品。

更多阅读,我推荐你查看以下链接-

  1. https://www . urban . org/research/publication/synthetic-control-method-tool-understand-state-policy
  2. http://peerunreviewed . blogspot . com/2019/11/a-short-tutorial-on-robust-synthetic . html

参考文献-

阿尔贝托·阿巴迪,亚历克西斯·戴蒙德,延斯·海因米勒。美国统计协会杂志。2010 年 6 月 1 日,105(490):493–505。doi:10.1198/jasa.2009.ap08746

2021 NHL 赛季官方预告

原文:https://towardsdatascience.com/official-2021-nhl-season-previews-8c093f2898a0?source=collection_archive---------49-----------------------

赛季开始前你最后一分钟的冰球修正

我最近为 2021 年 NHL 赛季建立了一个投影模型。在这里可以找到这个模型的高层次概述,但它的要点是,我使用回归来确定每个 NHL 球员在他们所做的每件事情上有多好,以及他们会为他们的团队做多少事情,在团队层面上汇总这些值以确定每个团队在这些事情上的表现,然后模拟赛季 10,000 次以确定赛季最可能的结果。最终模拟将于 2021 年 1 月 6 日进行,届时将更新名册。

首先,对于那些喜欢图表的人来说:这里是所有球队按照他们预计的积分和进入季后赛的概率划分的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这些团队是按各自的部门划分的吗:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你可能会注意到的一个主题是,北部赛区的球队比北部赛区以外的球队更有可能进入季后赛,后者预计会获得类似的分数。这是因为北赛区只有 7 支球队。

目录

北师

西师

中央分部

东师

北师

这些分区彼此非常接近,有 7 支球队的分区不可避免地会是最容易进入季后赛的分区,但正巧北部分区也是球队实力最弱的分区。这个部门的弱点始于底层。这个分区的季后赛平均得分是 60.63 分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

渥太华 13%的概率进入季后赛不是任何球队的最低估计,但这主要是由于加拿大分部的结构,因为渥太华确实是 NHL 中最差的球队。这应该不会让任何人感到惊讶,但有一部分人会不同意,因为渥太华在休赛期取得了进步。我强烈反对渥太华提高了他们的球队到足够好的程度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

渥太华的名单上散落着可怕的深度球员,他们努力推动比赛,他们成功的希望很大程度上取决于三名球员:马特·穆雷,布雷迪·特卡丘克和托马斯·查博特。当穆雷作为新秀技术上赢得了两次斯坦利杯时,他看起来是 NHL 的下一个年轻的超级明星守门员,但从那以后就跌落悬崖,并且是 NHL 去年最差的守门员之一,这使得他作为一个大致普通的守门员的计划对他来说几乎感觉太好了。布雷迪·特卡丘克(Brady Tkachuk)已经巩固了自己作为 NHL 最有危险的进攻得分机会的车手之一的地位——当你考虑到他在实现这一壮举时所效力的球队的质量时,这一壮举变得更加令人印象深刻——但他在防守上给予了一些回报,更重要的是,他是 NHL 中最差的射手之一。有一个论点是,他创造的机会的危险被我的数据高估了,这反过来意味着他的投篮被低估了,但无论如何,结论仍然大致相同:他没有对他的球队的得分率产生重大的积极影响。尽管打了联盟中最艰难的几分钟(就冰上时间而言),但托马斯·查博特在非常年轻的时候就已经是一名出色的进攻防守者,但他也在防守方面做出了很多贡献,除非他设法解决这个问题或将他的进攻带到另一个水平,否则他不能被认为是一名真正的精英进攻防守者。

如果没有这三名球员的出色表现,很难想象这支球队会有一条通往季后赛的道路。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于一支刚刚晋级 16 支球队季后赛,然后在附加赛中淘汰了斯坦利杯卫冕冠军的球队来说,这可能感觉很低。但这是一支在常规赛中表现平平的球队,失去了他们的首发守门员雅各布·马克斯特罗姆,许多球迷和媒体认为他是他们的 MVP。(我个人认为埃利亚斯·彼得森是他们的 MVP,但事实仍然是马克斯特罗姆也非常有价值。)此外,虽然他们光明正大地赢得了对圣路易斯的系列赛,并因此获得了荣誉,但有理由认为,尽管他们被大量淘汰出局,但他们还是有点幸运,我们不应该拿乔丹·宾宁顿是最大因素的六场比赛样本来说明这一切。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我个人喜欢温哥华做出的让 Markstrom 走人的决定,以及用 Braden Holtby 取代他的决定,即使他的表现像我预测的那样差,或者即使他的表现和上赛季一样差,他的合同也存在很小的风险。但在短期内,霍尔特比应该比马克斯特罗姆差得多,事实仍然是,这支球队存在重大的防守问题,他们的大多数球员预计会对他们球队的预期失球率产生负面影响。他们更擅长进攻而不是防守,但他们也不擅长防守。

这支球队有很大的机会进入季后赛——他们无论如何都不会死在水里——但即使我们认为埃利亚斯·彼得森将连续第三年在冰上取得另一个疯狂的投篮命中率,他们也需要霍尔特比恢复到韦齐纳的状态,德姆科恢复到 5-7 对拉斯维加斯的状态,或者如果他们想成为斯坦利杯的竞争者,他们整个球队的防守都需要迈出大步。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在他们的球队以 96 分的成绩完成 2019-2020 赛季常规赛后,Oilers 的球迷可能会觉得这个预测太低了,如果整个赛季都以传统的 16 支球队的形式进入季后赛,大约有 90%的机会,但如果更深入地看一看去年的表现,就会发现原因令人担忧。石油人享受了联盟最好的力量比赛——自 70 年代以来 NHL 看到的最好的比赛——和联盟第二好的点球。比赛的这些方面都不像力量比赛那样可重复,他们的净胜球差-16 是水牛城军刀队(-6)的两倍多,而领先洛杉矶国王队(-20)。那不是好伙伴。此外,未来的预测是建立在不止一个赛季的基础上的,埃德蒙顿有一个比去年弱得多的团队的记录。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

名单上的每个球员都被认为是擅长投篮的,德雷塞特被认为是联盟中最好的射手。他们也有一些球员预计将对权力游戏产生非常强烈的影响,所以尽管他们极不可能复制去年 29.5%的纪录,但他们也可能在权力游戏中远远高于平均水平。他们的前两名球员是联盟中最好的两名球员,虽然他们两个如果在防守上努力的话会更好,但埃德蒙顿的其余问题是他们阵容的其余部分。他们的守门员组合上赛季表现一般,但他们都比这差,而且他们现在大了一岁。山本和纽金特-霍普金斯都是优秀的球员——山本甚至可能在更大的样本量中被证明是伟大的——但与其他参赛球队的第三和第四名最佳前锋相比,他们远低于平均水平,而且他们在这四名之外的前锋非常弱。他们的防守不是联盟中最差的,但也远低于平均水平,如果冰上时间分配得更合理一点,情况可能会更糟。

这支球队很有可能进入季后赛,这要归功于他们的两名顶级球员和他们所在的球队,但他们很难做出任何真正的破坏。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

很明显,温尼伯在 2017-2018 年进入联盟决赛时所拥有的魔力早已不复存在,几乎他们的整个防守军团也是如此,但我不相信他们像上赛季一样糟糕,在上赛季他们仅以比底特律更高的 5 对 5 xGF%结束了赛季,并在康纳·埃莱比克的一个巨大的、赢得维兹纳和值得哈特的赛季的支持下被带到了泡沫中。这并不是说他们也是一支优秀的球队——我会称他们为平均水平——但在 NHL 最弱的分区,如果他们错过了季后赛,那将是令人失望的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

保罗·斯塔斯蒂尼上赛季可能没有得到很多分,他也不会成为一个伟大的射手,但他的潜在影响仍然很强,让他担任二线中锋应该对温尼伯的比赛有很大帮助。他们的倒数第六名在转换得分机会方面很挣扎,但他们在创造这些机会方面做得很好,他们作为一个整体实际上防守很强,所以我不认为他们是一个问题,或者至少不是温尼伯最大的问题。温尼伯最大的问题在于他们的防守队员不是迪伦·德梅洛,以及他们顶线的防守。

如果他们的顶线可以回到典型的防守差的第一线的水平,而不是像去年那样绝对的轮胎火,他们的总经理可以设法抓住一个半体面的防守者或两个弃权,这可能是一支相当不错的球队。如果这些事情没有发生,这支球队将不得不依靠康纳埃莱比克的另一个哈特奖杯级别的赛季。如果他们也没有得到,他们就有大麻烦了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个赛季卡尔加里以积分百分比排名西部第八,并在对温尼伯的泡沫系列赛中获胜,这充分说明了这一点,这被认为是一个巨大的失望。这不是一支性感的冰球队,我不认为艾伯塔省的任何人对他们本赛季的斯坦利杯赔率感到非常兴奋。但他们也不是一支糟糕的曲棍球队,在比赛的几乎每个方面都表现平平,这与他们去年的表现大致一致,尽管他们的大多数顶级球员今年都有所下降。在联盟中最差的分区,作为一个普通的球队应该足以让卡尔加里火焰队在不到 2/3 的时间里进入季后赛。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

守门员在过去几年里一直是卡尔加里的一个问题,但雅各布·马克斯特罗姆的加入意味着这可能会成为他们的对手前进的一个问题。这支球队的顶级球员上赛季后退了一步,可能永远不会达到他们在 2018-2019 年达到的巅峰水平,但他们仍然表现良好,卡尔加里阵容的底部通常由驾驶技术相当好的球员组成,如果他们的顶线能够达到收支平衡,这应该会让他们在竞争中占据优势。

他们的防守不怎么样,但是如果迈克尔·斯通换成一个还算不错的人,并且奥利弗·凯林顿能够向前迈进一步的话,他们会看起来更好。最终,这个团队的天花板看起来并不太高,但是地板看起来也不太低。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我的预测不是唯一的,因为我对蒙特利尔的排名远远高于他们在过去几个赛季的实际排名。在很大程度上,每个人的预测大致反映了前几个赛季的团队表现,这些赛季中量化和权衡表现的方式决定了谁的预测比其他人更准确,每个人的预测都相当准确。那么为什么蒙特利尔的每个人都比过去的实际排名高那么多呢?我怀疑是替补守门员和一球比赛的糟糕记录。蒙特利尔在过去两个赛季的净胜球只有-2,这表明他们更像是一支普通的球队,而不是一支真正糟糕的球队。但更重要的是,这个数字被替补门将压得很低;他们比凯里·普莱斯的样本高出 33 分。值得注意的是,如果你只计算他们在比赛中表现最好的守门员的净胜球,大多数球队会看起来更好,但蒙特利尔的情况差异是惊人的。此外,他们在这个样本上 5 对 5 的潜在指标与所有没有被评为全美曲棍球联合会第二好的拉斯维加斯队相匹敌。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不像蒙特利尔在过去几年中使用的替补守门员,杰克艾伦去年表现很好,预计明年也会很好。如果这能让凯里·普莱斯得到更多的休息,并在他首发的比赛中打得更好,那将是一件大事。但是除了守门之外,这个名单的其他部分都很不错。尽管仅仅由于低动力比赛冰上时间和这些分钟内的糟糕表现而导致的总积分令人印象深刻,但鞑靼-达诺-加拉格尔线已经花了整整两个赛季面对 NHL 中最激烈的竞争,并通过各种措施(包括进球)消灭了他们。他们名单的其余部分有不少问号,但他们的两个新成员泰勒·托弗利和乔什·安德森都是强大的球员,他们的总得分因冰上投篮不佳而下降,他们的倒数第六名表现良好,他们的防守也是优秀的进攻球员。

如果本·基亚罗、乔尔·埃德蒙森和乔纳森·德鲁因能够拿出符合蒙特利尔管理层对他们的看法的结果,或者克劳德·朱利安能够限制他们的冰上时间,这支球队就可以制造一些严重的噪音。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

说到被替补守门员和一球不佳记录拖累的球队:见见多伦多枫叶队。在过去的两个赛季中,他们与弗雷德里克安德森的净胜球差为+72。这可能有点刺激,因为多伦多通常在背靠背的上半场让安德森首发,并把他们的替补晾在一边,但这仍然清楚地证明了这是一支强大的球队,只要他们的守门员表现出色。我在上面列出的这个 90%的数字是所有团队中最高的,这理所当然地在 Leaf Nation 中引发乐观和兴奋。但需要注意的是,这是一把双刃剑,另一面写着,如果多伦多真的无缘本赛区季后赛,甚至在前两轮中的一轮失利,他们就没有更多的借口可以制造了。这是连续三年在第一轮面对波士顿和华盛顿这样的球队的 180 度大转弯;在这里,失败的可能性较低,但如果失败真的发生,那么由此产生的羞辱和自我反省会高得多。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

虽然这支球队的防守多年来一直被视为一个主要问题,但布罗迪的加入和特拉维斯·德莫特的出现意味着这六个人的防守应该高于平均水平,即使摩根·里利在冰上领先他们。然而,由于他们前锋的弱点,球队整体防守仍然低于平均水平。但防御不是成功的先决条件;这支球队的守门能力很强,他们的进攻接近联盟顶级,预计得分最多(部分原因是他们部门的弱点,但主要是因为他们的技术)。

这是一个非常强大的阵容,如果不是因为令人费解的决定,以七位数的工资增加韦恩西蒙兹和扎克博格斯安的替补球员,并给予他们一个名单上的位置,这将是一个更加领先的阵容。如果年轻人能够尽早占据这些位置,即使在最糟糕的情况下也能保持体面,这支球队可能会更好。

西区分局

西部赛区头重脚轻,形成了独特的平衡,三支优秀的球队在顶端,三支弱队在底端,两支平庸的球队在中间。这个赛区可能不是整体上最好的,但肯定是防守最强的,斯坦利杯冠军代表的赛区最聪明的选择可能就是这个。这个分区的季后赛平均得分是 62.34 分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

洛杉矶国王队并不是 NHL 中最差的球队,但由于他们所在的分区,他们进入季后赛的概率最低。他们的未来看起来肯定是光明的,许多人认为他们的前景池是继中锋昆顿·拜菲尔德之后 NHL 中最好的。但截至目前,这支球队进入季后赛的概率非常渺茫;他们的进攻和防守都非常糟糕,无论是进球数还是进球数都接近联盟垫底。托德·麦克勒朗似乎总是从他的球队那里得到比他应该得到的更多的东西,因此我可以看到这支球队在推动比赛方面比我预计的要好一些,但很难看到他们在这方面甚至是平均水平,即使他们是,他们的守门员和射门仍然应该是一个主要问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于德鲁·多尔蒂和乔纳森·奎克可能会反弹,因此很容易忽视这些预测;两者在 2017-2018 年都是强劲的参与者。但预测是基于结果的,尽管使用了 3 年的样本,但他们两人都预测如此之差的事实恰恰表明,在过去两年中,他们对他们的团队造成了多么可怕的伤害。

Anze Kopitar 仍然很强大,但即使他保持这种状态,并且前面提到的二人组在本赛季回到了令人尊敬的水平,这份名单仍然很弱,很难想象今年会有任何形式的破坏。如果这支球队能增加一个像样的第六防守队员,也许还有一个第五防守队员来代替库尔提斯·麦克德米德,然后让多尔蒂休息几分钟,这也会有所帮助;这也可能帮助他变得更好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

圣何塞鲨鱼队被认为是本赛季的反弹候选人,这是有充分理由的:他们一直是一支强大的球队,有理由相信去年是一个异数,而不是证明他们是什么。此外,他们预计是一个大致平均的比赛驱动团队,他们最大的弱点是他们的守门员和他们的投篮;每年最不可重复的组件。然而,这个团队的上限也不是很高;由于运动员的年龄,他们的比赛驱动力更有可能下降而不是提高,他们已经失去了一些两年前使他们成为主导比赛驱动团队的人才,几乎他们保留的每一个球员都预计会比他们当年的表现差得多。人们很容易陷入这样一个陷阱,即这支球队的上升空间应该与他们两年前的水平大致相当,但事实是它要低很多。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

与普遍的看法相反,圣何塞鲨鱼队上赛季最大的问题实际上并不是守门;他们的滑冰运动员表现异常糟糕。道格·威尔逊(Doug Wilson)尽了最大努力,确保圣何塞的滑手们明年不会成为他们最大的问题,当时他解雇了亚伦·戴尔(Aaron Dell),他无疑是圣何塞上赛季的最佳守门员,也可以说是他们的 MVP(这是糟糕的一年),并从明尼苏达获得了德文·杜布尼克(Devan Dubnyk)。决定离开戴尔的一个像样的替补,并在 Dubnyk 加入联盟中最差的守门员之一,以一支已经有琼斯联盟中最差守门员之一的球队,几乎可以肯定的是,糟糕的守门员管理将比他们潜在的半像样的滑球员群体更难拖垮这支球队。

现在,任何时候任何人谈论守门,应该注意的是守门是足够随机的,甚至没有超出一个合理的可能性范围,其中一个家伙有一个赛季。但即使在守门员之外,这个名单也相当令人印象深刻,这支球队需要他们的守门员进行一场维兹纳式的运动,才能制造任何真正的噪音。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

阿纳海姆鸭队计划成为一支还算过得去的防守球队,尽管允许高射门量,但在守门和预期进球防守方面的排名略高于平均水平。他们被建造来放弃大量的投篮而不放弃大量的进球,并在反击中获得足够的分数来赢得相当多的比赛。这是另一支很可能没有潜力在季后赛中制造任何严重噪音的球队,但这绝对可以在短暂的 56 场比赛样本中取代一支优秀的球队,并有可能在季后赛中淘汰另一支优秀的球队。他们本赛季的目标可能是重建,这可能是将要发生的事情,但他们也是一支令人讨厌的球队,赢得比他们应该的更多。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在经历了一个艰难的 2019-2020 赛季后,约翰·吉布森仍然预计将高于平均水平,但人们不得不怀疑去年在筋疲力尽后是否更像是一个侥幸,他多年来作为一名真正的精英守门员更像是他真正的样子。如果是这样的话,这支球队会比平时更让人讨厌。他们的进攻很糟糕;当你上下看看他们的花名册,盯着他们花名册上几乎每个成员糟糕的进攻驱动时,你不会看到他们的排名如此之低。

但有可能他们的一些年轻球员,即马克斯·孔托伊斯、伊萨克·伦德斯特伦和萨姆·斯蒂尔,都可以显著提高他们的进攻能力,并将阿纳海姆提升到一个令人尊敬的团队水平。在他们过去两个赛季的表现之后,很容易忘记阿纳海姆,但他们远不是联盟中最差的球队,季后赛也不是完全的白日梦。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

亚利桑那郊狼队的概况基本上是一个富人版的阿纳海姆鸭队:他们在进攻方面很糟糕,他们放弃了大量的投篮,但大多数都是低质量的,他们的守门员是精英,他们的射手足够体面,可以在反击中得分。富人版的烂冰球队仍然是烂冰球队,但就像阿纳海姆一样,这支球队生来就是让人讨厌的,赢了一堆他们不该赢的比赛,而且这些比赛的百分比比阿纳海姆略高。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

理论上,这支球队的守门能力就像你能建立的守门组合一样完美:两个都是精英的家伙将会以大约 50/50 的比例分担比赛。但是曲棍球不是纸上谈兵,Raanta 和 Kuemper 都在过去与伤病作斗争,这可能会损害他们在比赛中的表现,或者更有可能迫使第三个守门员代替他们比赛,如果他们错过时间的话。这支球队的其他球员甚至不能应付守门员的一般表现,所以如果他们不能有出色的表现,他们就会有麻烦。

他们的滑冰运动员还有进步的空间;像克莱顿·凯勒和劳森·克劳斯这样的年轻球员可以设法改善他们过去的比赛方式,被低估的#7D 伊利亚·柳布什金可以抢走乔丹·奥斯特勒的首发位置,如果他们有强大的守门员,这两件事应该足以推动这支球队进入季后赛。但是这支球队的生死取决于他们的守门员,如果他们得不到,他们就完蛋了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

明尼苏达州野生动物比赛所在地 Xcel 能源中心的记分员显示出一种趋势,即错误地报告击球距离球网比实际距离更远,这一点我已经详细写过。这导致他们允许拍摄和拍摄的照片质量被低估。但即使建立了一个模型来调整这一点,我仍然得出结论,这是一支精英防守球队,进攻糟糕,投篮一般。这听起来像是一支还算过得去的季后赛球队的完美配方,直到你开始谈论他们最大的弱点:守门。他们上赛季的守门员组合是联盟中最差的,如果他们只是接受了一般的联盟守门员,他们就会成为真正的季后赛球队和斯坦利杯的竞争者。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于亚历克斯·斯塔洛克的受伤和德文·杜邦克的交易,明尼苏达将更换上赛季的两名守门员——他们最大的两个问题——但他们增加的球员并不比他们失去的球员好多少。然而,在他们之外,这份名单看起来相当不错。前锋擅长预测对手的屈服,这在他们的防守中表现出来,他们的蓝线可以说是联盟中最好的。(如果 Greg Pateryn 和 Matt Dumba 恢复前几年的良好状态,不会有任何人提出异议。尼克·博尼诺的分析是一个迷因,但据我所知,明尼苏达队从纳什维尔得到了一个非常好的全能前锋,同时用第二轮选秀权交换了卢克·库宁。

再加上基里尔·卡普里佐夫,你会看到一支有潜力成为斯坦利杯黑马竞争者的球队,如果他们的守门员还算过得去的话,考虑到这个位置的波动性,这并不是很长远。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

圣路易斯队在 2019 年斯坦利杯之后,在常规赛中领先西部联盟。他们确实在泡沫时期的 6 场比赛中输给了温哥华,但这更多的是 PDO 的侥幸,而不是他们能力的真实指标,甚至不是他们在那些比赛中的表现。通常,我刚才说的一切都表明我在谈论一个真正的斯坦利杯竞争者,他有超过 80%的季后赛赔率,应该在 82 场比赛的赛季中至少得到 100 分。而这个团队还是该死的好。但他们不是完成这些壮举的同一支队伍。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

亚历克斯·皮特兰杰洛的离去已经引起了很多人的关注,球迷和媒体这样做没有什么不对;他是一个优秀的防守者,联盟中最好的之一,失去他会伤害圣路易斯。但是亚历克斯·斯汀和杰克·艾伦的损失,他们两人去年都非常出色,也会对这支球队造成一点伤害。迈克·霍夫曼和托雷·克鲁格都是很好的球员,他们会增加很多价值,但如果圣路易斯想从他们身上提取尽可能多的价值,他们需要他们集中力量打球并在那里取得成功,这说起来容易做起来难,如果没有足够的冰球,他们有可能走向南方;他们实际上并不是强大的进攻球员,这是这支球队的普遍弱点。

这应该仍然是一支优秀的防守球队,有一个强大的守门员在大部分时间里发挥出色,但如果宾宁顿的表现更像他在泡沫中的表现,或者维尔·胡索的表现低于他预计的联盟平均水平,他们可能会发现自己处于危险之中,因为在一个强大的防守部门中,作为一个弱进攻球队总是有一些风险。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对科罗拉多州雪崩队的合理预期是,他们本赛季的排名会有所下降,这将源于他们联盟领先的 PDO 队比上赛季的下降。但后来乔·萨基奇用尼基塔·扎多罗夫和两个第二轮选秀权换来了布兰登·萨德和德文·托尤斯(在两次单独的交易中)。现在这支队伍是 NHL 中从上到下最强、最平衡的队伍之一,在比赛的每个方面都排名前十。守门被认为是这支球队的一个问题——显然我不同意这一点,因为我已经把他们排在了第十位——但这支球队在各个方面都足够强大,他们有足够的装备来管理联盟中最差的守门,如果他们有这种能力的话。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

科罗拉多队的名单由内森·麦金农打头阵,这位超级巨星中锋只是有点落后于联盟中真正的最佳球员,但与两年前不同的是,这绝不是他一个人的独角戏。这份名单在董事会上下都非常强大;甚至第五防守队员和第九前锋瓦列里·尼丘什金·伊恩·科尔也是优秀的双向球员。当你看到排名第十的守门员背后的名字时,就更容易理解为什么人们会关注两个有伤病困扰的家伙,并把他们的成绩放在更容易的位置上,但我仍然觉得恐惧是被误导了。

在我看来,这支球队最大的问题不是守门,而是他们的两名顶级防守队员。塞缪尔·吉拉德对联盟中任何球员的点球差异都有最好的影响,这个模型中忽略的点球肯定低估了他,但仍然令人担忧的是科罗拉多预计将把最多的冰上时间给一个净消极比赛驱动的防守队员。把吉拉尔和约翰逊的上场时间换成托沃斯和马卡也许会让这支球队更有统治力。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

维加斯可能不会像他们预计的那样赢得总统奖杯,但有些事情将会严重出错,他们不会超过绝大多数对手,他们的投篮不会比他们允许的投篮更靠近球网。这是他们在过去的两年里所做的,在他们从第一个赛季的良好的比赛驱动和精英转型进攻团队转型后。但不管出于什么原因,这种方法并没有转化为实际目标或反对目标,也没有转化为预期目标。在过去的两个赛季中,他们的净胜球仍然很高,但相对于他们在预期净胜球中的排名,他们的得分低得令人怀疑。对阵的进球可以用糟糕的守门员来解释——马克-安德烈·弗勒里有点下滑,他们的替补都很糟糕——但射门是一件更复杂的事情。有可能预期目标模型低估了他们在繁重的预检中创造的机会的质量,从而低估了他们排名第 21 的投篮。底线是,这无疑是一支非常强大的球队,但如果他们不能抓住危险的机会,他们可能无法达到精英球队的预期。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

除了几名球员之外,这支球队的阵容上下非常均衡。他们最差的球员看起来是科迪·格拉斯,他去年在一个小样本中挣扎,但仍然年轻,有潜力成为一名普通球员,其他球员看起来最差也不错。这支球队即使在糟糕的守门员和投篮的情况下也能进入季后赛;他们已经这样做了几年,现在只是增加了一个诺里斯奖杯口径的防守球员亚历克斯·皮特兰杰洛。

但是,如果罗宾·莱纳能够击败马克-安德烈·弗勒里预计要参加的一些比赛,并在过去几个赛季中表现出色,这支球队应该可以轻松进入季后赛,并有可能赢得总统奖杯,即使他们很难转换得分机会。如果他们能够设法以正常的速度转换得分机会,这将是 NHL 中最好的球队——无与伦比。

中央分部

中部赛区有去年的斯坦利杯冠军,去年最差的球队,还有一支更差的球队,以及其他四支都有机会进入季后赛的球队。这个分区的季后赛平均得分是 62.11 分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

底特律灾难性的 2019-2020 赛季使人们很难调和他们有 1.5%的机会进入季后赛的想法,更不用说有 15%的机会进入季后赛和 1%的机会赢得分区冠军。但这支球队上赛季最大的问题是吉米霍华德,他走了,他们采取了许多其他措施来改善他们的球队。没有人说他们是一支优秀的球队——嗯,我不是——但他们肯定没有去年那么差,我也不认为他们有想象的那么差。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以理解的是,在去年灾难性赛季的混乱中失去了一些积极因素:当三人都健康时,贝尔图齐-拉金-曼塔线的强劲表现,帕特里克·内梅特的强劲防守,以及乔纳森·伯尼尔的不太好的守门员表现。在一个理想的世界里,内梅特并不是你蓝线上最激动人心的名字,但是一个刚刚经历了几十年来最糟糕赛季的球队必须在他们能得到的地方接受积极的东西。

底特律季后赛的渺茫希望取决于像扎迪娜这样潜力巨大但在 NHL 水平上表现不佳的球员的进步,山姆·加格纳、乔恩·梅里尔和托马斯·格雷斯这样低调的球员的强劲表现,以及他们上赛季保持或建立在这种表现基础上的几个亮点。这可能又会是痛苦的一年,但是我们会看到的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

感觉芝加哥黑鹰队这个赛季并没有真的想要赢,我也不能真的责怪他们。Jonathan Toews 和 Kirby Dach 将错过本赛季的大部分或全部比赛,他们的守门技术预计将是联盟中最差的。如果这两件事不是真的,他们可能真的有泡沫球队的素质,但他们不能控制这些伤病,获得良好的守门员是可能的,但说起来容易做起来难。对这支球队来说,最好的行动可能是让赛季结束,然后在交易截止日期决定球队想要采取的长期方向,这正是管理层似乎满意做的事情。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

张秀坤·库巴利克在 24 岁时进入 NHL,从第一天起就将联盟撕裂,以每小时 5 对 5 的进球领先 NHL,并拥有强大的基础指标。我预计他明年的个人投篮不会那么幸运,但如果他仍然不是一个该死的好球员,我会感到震惊。他也不是名单上唯一有趣的年轻球员;博奎斯特和德布林卡特现在都是好球员,他们都有很高的潜力。

不幸的是,对于黑鹰队来说,他们名单上的其他人相当弱,他们唯一的 NHL 守门员是一个历史记录在联盟中最差的家伙。完全有可能苏班或科林迪利亚(他们预计的替补)在网上组织了一场像样的比赛,这对这支球队来说还有很长的路要走,但他们要成为下赛季的合法竞争者还需要更多的努力。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

佛罗里达黑豹队确实是一支奇怪的队伍。每年,都有很多人预测这一年他们会向前迈进一步,成为一支季后赛球队,但这似乎永远不会发生。公平地说,他们通常比最后一名更接近季后赛,所以这些预测在任何一年都不会严重失误,也不会产生于一个糟糕的过程。如果有人在 2019-2020 赛季之前告诉我,他们认为谢尔盖·博布罗夫斯基(Sergei Bobrovsky)将创造一个体面的赛季,我不一定会说他们是白痴,因为这没有发生。有时一个好的猜测是错误的,公平地说,这支球队现在已经准备好向前迈出一步了。他们是一支进攻很强的球队,投篮很好,但是糟糕的防守和糟糕的守门能力意味着他们今年只有 44%的机会向前迈进,进入季后赛。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

失去迈克·霍夫曼和叶夫根尼·达多诺夫令人伤心,但比尔·济托收购了姚一奇·伊诺斯特罗萨、帕特里克·霍恩奎斯特、卡特·维尔海吉和拉德科·古达斯,这对他的球队有利,并减轻了这些损失带来的损害。总的来说,这应该是一支强大的进攻团队,他们如入无人之境地埋葬着自己的机会。谢尔盖·博布罗夫斯基(Sergei Bobrovsky)距离 2017-2018 赛季不远,在那里他可以说是美国曲棍球联合会(NHL)最好的守门员,甚至在 2018-2019 赛季,他仍然很稳定。他的良好记录意味着他得到了怀疑的好处,尽管去年很糟糕,但预计下赛季他只会比平均水平低一点。克里斯·德里杰上赛季只首发了 11 场比赛,但他在这些比赛中足够强大,他预计下赛季在替补席上会做得很好。

如果 Driedger 可以偷走 Bobrovsky 的一些时间,并保持这种表现,或者 Bobrovsky 可以反弹到他过去的水平,这支球队有很大的机会进入季后赛,但他们的防守缺陷可能会使他们成为真正的竞争者,即使真的发生了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

去年的哥伦布蓝夹克队与佛罗里达黑豹队在过去几年的表现有些相反:每个人都预测他们会在无数个赛季后错过季后赛,但他们还是做到了。约翰·托托雷拉驾驶着一个平庸的球员名单达到了预期的进球份额,远远高于平均水平,理所当然地获得了杰克·亚当斯奖杯。这是可能的,甚至很有可能,托托雷拉的影响是“烤”成这种预测的方式名册充满了平均最好的发挥司机看起来明显高于平均水平。但这支球队缺乏天赋,这一点在他们的守门员和投篮的估计影响中表现出来,这两项都低于平均水平。他们的优势和劣势相互平衡,创造了一支有机会进入季后赛的球队,这在我看来是完全正确的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每当“赛斯·琼斯的分析”这个话题出现时,我总是听到人们说哥伦布的系统不利于良好的高级统计。这一直困扰着我,因为根据分析,哥伦布防守队员像萨瓦德,加夫里科夫和库坎在历史上都是非常优秀的球员。他们前锋的防守也很受重视。鉴于尤纳斯·科尔皮萨洛在《泡沫》中的表现,守门员预测可能很难协调,但他在过去几个常规赛季中实际上是一个相当糟糕的守门员,这代表了一个更大的样本,应该给予更多的重视。即使今年他们的守门水平有所提高,达到联盟平均水平,这支球队仍然存在其他问题。他们的投篮预计是最差的,尽管我提到过托托雷拉效应,但他们的比赛驾驶预计不会远高于平均水平。

他们很有可能进入季后赛,但感觉这支球队并没有太多的上升空间成为真正的斯坦利杯竞争者。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

纳什维尔掠夺者队让我想起了卡尔加里火焰队,他们都以积分百分比排名联盟前 8,他们都被谈论着,就像他们刚刚度过了糟糕的一年。这并不是因为这些赛季真的很糟糕,而是因为人们对这些球队的期望更高,因为他们在过去一直都是这样。就目前的情况来看,纳什维尔在比赛的各个方面都比平均水平高一点点,除了守门员以外。这对于 62 分的预计得分和 56%的季后赛概率来说已经足够好了,但对于一支在任何一点上都不是精英的老龄名单来说,很难对斯坦利杯的机会过于兴奋。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我早些时候提到过,明尼苏达州的野生动物可能拥有 NHL 中最好的蓝线。我被迫使用可能这个词的原因是因为纳什维尔掠夺者蓝线也存在。由卫冕诺里斯杯冠军罗曼·乔西率领,由两名可以说比他更好的防守队员支持,这是一条优秀的蓝线,正在争夺最佳,如果 Dante Fabbro 能够找出他可怕的进攻影响,就可以轻松地抢到那个位置。不幸的是,前锋有点低于平均水平,因为失去了被低估的倒数第六名克雷格·史密斯和尼克·博尼诺,他们上赛季与罗科·马尔迪一起轻松得分。

这是另一支球队,他们的大部分球员已经达到或超过了他们传统上的巅峰年龄,所以很难看到他们会从哪里迈出另一大步并成为竞争者。但最坏的情况是,他们仍然有机会进入季后赛——如果朱尔斯·萨洛斯能获得 53%以上的首发,他们会很轻松。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

达拉斯明星队去年进入了斯坦利杯决赛,他们今年怎么只有 60%的机会进入季后赛?答案是双重的:他们的阵容已经被伤病摧毁,更重要的是,他们从一开始就没有那么好。抛开花哨的数据不谈,他们以+4 的净胜球结束了常规赛,以+1 的净胜球结束了季后赛(不包括循环赛)。在平均竞争更加激烈的季后赛中挤掉一球比赛并达到收支平衡是有道理的,但这些仍然不是一支精英球队的标志。公平地说,他们的一些糟糕的成绩是由于上赛季不走运的投篮,但这大致被精英守门员抵消了,没有理由相信如果运气真的“正常化”,这支球队甚至会有平均的投篮成绩,因为他们预计下赛季将是第 28 名。这绝对是一支优秀的球队,这反映在他们尽管受伤,但仍有 60%的概率进入季后赛,但他们远不如你所相信的那样好,如果你听到的只是他们去年进入了杯赛决赛。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不管是因为他们的比赛体系还是因为这些球员拥有的天赋,这份名单上有相当数量的球员,他们的防守效果在下赛季预计会很好。但是除了他们的前三名前锋和顶级防守队员之外,名单上几乎没有多少球员的进攻效果是积极的。这部分可以归咎于泰勒·塞古因的缺席,如果不是因为手术,他将缺席整个赛季,他将会打很多分钟,并很好地推动进攻。但不管怎样,这支球队的进攻并不好,尽管他们可能会减轻这些痛苦,如果他们改变他们的系统,让他们的前锋更多地投篮,因为他们的防守队员比前锋差得多。

最后,虽然在过去的几年里这是一个优势,并且预计将成为这里的优势,但守门是一个很大的问号。安东·胡多宾预计会非常出色,这是有道理的,因为他在过去几年中一直非常出色,但他的出色表现总是出现在替补角色中。他是一个 34 岁的小守门员,很难说他会在首发位置上做得如何,更不用说杰克·厄廷格在他第一次看到 NHL 比赛时会做得如何。如果这些人真的在挣扎,这支队伍可能会从外面往里看。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

经过多年的分析社区声嘶力竭地尖叫,卡罗莱纳飓风队已经准备好成为一支优秀的曲棍球队,他们终于在 2018-2019 年做到了,并在 2019-2020 年证明了这不是侥幸。现在是时候让这支球队迈出下一步,证明他们不仅仅是一支优秀的冰球队,而是一支伟大的球队。如果他们能提高他们的投篮命中率,他们才有可能达到这些高度,目前他们的投篮命中率预计是联盟中最差的。有一种观点认为,像拉斯维加斯一样,他们实际上并不擅长投篮(或擅长进攻),因为预期的进球模型和原始投篮次数高估了他们的投篮质量。这可能是事实,但不管怎样,这是一支真正的好球队,他们仍然能够产生足够好的实际进球,有超过 2/3 的机会进入季后赛。如果他们真的成功了,他们还可以避免他们的氪石,波士顿布鲁因斯,至少两个回合,这对他们来说是个好兆头。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个图表没有添加任何上一个图表没有明确的新信息;这支球队有不错的守门技术,出色的进攻战术,不错的防守战术,和糟糕的投篮。即使像杰克·加德纳和尼诺·尼德雷特这样去年没有得到很多分数的恶意球员也仍然被认为是高于平均水平的球员。具有讽刺意味的是,这支球队投篮如此糟糕的很大一部分原因是新球员布雷迪·斯克杰和文森特·特罗切特在历史上一直很差。他们有一些在这方面也很糟糕的留任者,如乔丹·斯塔尔、布洛克·麦吉恩和乔丹·马丁努克,但有趣的是,他们两个新的大人物的加入只会让他们在他们已经陷入困境的游戏的一个方面变得更糟。投篮是相当随机的,所以也许这两个人的投篮会有所不同,或者一旦卡罗莱纳的体系控制了他们的球棍,情况只会变得更糟。

守门员是这个名单中最有趣的部分,因为赖默在今年之前一直很差,然后在有限的时间里表现出色。他仍然表现得一般,但如果他恢复到糟糕的水平,这支球队可能会有麻烦。另一方面,如果赖默保持他的强势,这支球队最终以与预期目标相似的速度取得实际进球,他们是斯坦利杯的合法竞争者。不管怎样,他们可能是一体的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

NHL 中有多少球队可能失去他们整个赛季的最佳球员,但仍有 41%的机会进入季后赛?也许十个?现在考虑坦帕湾闪电队没有 41%的机会进入季后赛;他们有 41%的机会赢得分区冠军,有 87%的机会进入季后赛。2019-2020 斯坦利杯冠军在每个人都健康的情况下,就团队实力而言,他们有一个自己的岛屿,即使没有他们最好的球员,他们也有一个最佳球队的合理论点。他们是防守精英,他们的守门员最终取得了几乎与其声誉相符的结果,他们的进攻没有产生大量的数量,但用质量和射门弥补了这一点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

安德烈·瓦西里夫斯基多年来一直被吹捧为联盟的顶级守门员之一,但直到最近,分析才支持了一个接近那个的结论。不过,现在最重要的是,他和麦克尔希尼有望组成一对前五的守门员组合。这个名单最大的优势在于它的投篮天赋,布雷登点和史蒂文斯塔姆科斯作为联盟最好的射手领先。我有一部分想知道,如果没有尼基塔·库切罗夫的努力,这两个人和名单上的其他人是否会努力取得超出预期的成绩,但即使他们没有达到过去的水平,他们也应该非常出色。同样令人印象深刻的是这支球队的防守;从上到下,他们都是优秀的防守球员。如果他们设法签下一个比卢克·谢恩好一点的人,用泰勒·约翰逊交换你的典型替补级别的前锋,他不是泰勒·约翰逊,在防守上,他们会和明尼苏达竞争全国曲棍球联盟最好的防守球队。就目前的情况来看,他们还没有完全达到目标,但由于他们的守门能力,他们最终可能会丢更少的球。

这支球队可能会发生很多不同的事情,但是很难想象一个赛季他们不是联盟中最好的球队之一。

东区

最后但肯定不是最不重要的——实际上是最好的——是东区。这是 NHL 最强的部门,它的设计完美地创造了一场血战,将一些渴望季后赛经验的年轻球队排除在外。这个分区的季后赛平均得分是 62.09 分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

毫无疑问:这是一支糟糕的曲棍球队。但这不是一支糟糕的冰球队,更重要的是这是一支年轻的球队,有很大的成长空间。20%的机会进入季后赛足以激励这支球队去拼搏,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如我在介绍中提到的,这份名单包括不会上场的科里·克劳福德,不包括会上场的萨米·瓦塔宁。我想吸收这些球员会稍微改变一些事情,对球队造成伤害,但不会到极端的程度。不管怎样,如果他们的球员能保持他们的表现,这支球队应该有强大的特殊球队,但即使是在实力上,他们的进攻应该很差,他们的防守应该很糟糕,因为有很多防守拖后腿的球员,如帕维尔·扎哈,迈尔斯·伍德,P.K .苏班,康纳·卡里克,尼基塔·古塞夫和杰克·休斯。休斯的新秀赛季尤其有趣;他是联盟中最差的射手之一,防守很糟糕,但实际上进攻很好。他不是进攻的精英,但即使在 18 岁的时候在一个矮小的框架下做得很好,也预示着他的长期发展。然而,我们并没有在这里进行超长期的工作,明年他预计会像今年一样表现出色,成为一个强大的进攻发动者,但由于他糟糕的投篮和防守,他的净负面影响很大。

总的来说,这不是一个性感的花名册,但如果麦肯齐·布莱克伍德能够在一个合法的首发角色中匹配去年的表现,他们可以制造一些噪音。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本赛季对水牛城军刀队的宣传与预计只领先新泽西魔鬼队一分的球队不匹配,我相信这是因为宣传是建立在看似合理的场景上,而预测是建立在过去实际发生的事情上。也许泰勒霍尔可以回到他的哈特奖杯形式,而拉斯穆斯达林向前迈出一步,成为一个高于平均水平的防守队员,但这两件事也可能不会发生,这支球队真的站在斗争,如果是这样的话,这是目前没有预计到的。此外,这支球队增加了一些预计会对他们的球队造成重大伤害的球员。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

新加入的泰勒·霍尔预计将为这支球队做很多好事,这太棒了。但是新加入的科迪·埃金和托拜厄斯·里德预计会造成同样大的伤害。如果这些名单上的位置只是交给像乔什·何桑或阿图·鲁特索莱宁这样未经证实的赌博,我会对这支球队更加乐观,但把这些位置交给这些球员是一个问题。这种防守也非常丑陋,六个防守者中有五个预计会产生负面影响。如果这种预测与现实相符,这真的会损害他们前锋的进球输出。说到前锋,很少有人能提供任何防御价值。大部分都远低于平均水平。如果你可以忍受这种进攻驱动的弱点,但是在这支球队的情况下,这两种情况都不会发生。

我可以看到一些球员迈出了巨大的步伐:泰勒·霍尔,拉斯穆斯·达林,莱纳斯·乌尔马克,甚至拉斯穆斯·里斯托莱宁,仅举几例。曲棍球很奇怪,Ristolainen 完全可以将他的物理工具转化为像样的冰上成绩。但是,除非这些主要的进步中的一个,或者最好是几个,被真正采取,这支球队将会为季后赛席位进行一场艰苦的战斗。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为什么流浪者队预计会在分区中接近最后一名而不是季后赛席位?团队防守。成为 NHL 中防守最差的球队并进入季后赛是非常困难的。你可能会说流浪者去年做到了,但我会反驳说,他们去年并不是最差的,当赛季结束时,他们并没有进入季后赛,他们在附加赛中被横扫,最重要的是,当他们失去了杰斯珀·法斯特和杰克·约翰森时,他们变得更差了。尽管事实上他们有着阿尔特米·帕纳林和米卡·齐巴内贾德难以置信的幸运赛季,但这两位球员都不可能复制前进。另一方面,防守是最容易改进的地方,他们在赛季后期确实表现出了一些改进的迹象。这支队伍有足够的乐观空间,但可能需要谨慎。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我知道流浪者队已经与健康的挠痒杰克·约翰森调情,在他们的粉丝群中引发了兴奋,但基于每支 NHL 球队都向他们支付七位数薪水的老兵防守队员的方式,我非常怀疑他们真的会这样做——至少在新赛季开始时。如果我错了,约翰逊从来没有打过一场比赛,他们应该会有很大的进步;他目前预计会打很长时间,并在其中造成很大的伤害。此外,几乎不可避免的是,卡卡波将在他灾难性的新秀赛季中有所改善,但这将被亚当·福克斯从他自己出色的新秀赛季中崩溃所抵消,他的新秀赛季完全违背了相反的方向。也有可能谢斯特金推出了一个精英新秀赛季,并开始了比预期更大比例的比赛,甚至没有预测的亚历克西斯·拉弗雷尼埃最终组建了一个精英考尔德队。

但在这个团队中,每当我发现一些值得乐观的事情时,我就会眨眼,并在旁边发现一些值得悲观的事情,比如齐巴内贾德和帕纳林更有可能低于他们的预计投篮命中率。对于这支球队来说,事情可能会有很多方式,无论如何,它们都会让一些人看起来非常愚蠢。但球迷们可以感到安慰的是,这支球队不久前宣布了他们重建的意图,他们已经提前完成了计划。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这支纽约岛民队两年前成为了分析界的敌人,当时他们出乎意料地连续两年进入季后赛,第一次赢了一轮,第二次赢了两轮。事实上,没有人指望他们第一次就能成功,也很少有人指望他们第二次能重复,但现在事情已经发生了变化,分析已经意识到这是一支强大的防守球队,可以在这里或那里取得一些进球。很难看到这支球队的优势比他们刚刚享受的进入西部决赛的运气更高,即使这听起来像是一个非常高的标准,但它保证这支球队在每晚的比赛中都将是一个痛苦的屁股。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不管你怎么说卢·拉莫里洛和他的倒数第六名前锋的合同期限,但现在他们仍然是非常强大的防守球员,每晚都预测对手的表现。德文·托尤斯的离开,我相信会真正伤害到这支球队,特别是如果他的大部分时间都被尼克·莱迪占用,但在莱迪之外,这种防守在他们自己的一端是相当深入和有能力的。前 6 名还拥有强大的射手,所以如果他们能够调整他们的系统,让他们的前锋获得更大比例的投篮机会,并且瓦拉莫夫能够像预计的那样打球(或者更好,就像他去年在米奇·科恩的第一年所做的那样),这支球队将赢得一系列比赛,他们在这些比赛中得分超过对手。

不过,最终,这种策略在季后赛中并不能战胜顶级球队;对坦帕没有成功,对卡罗莱纳也没有成功。如果岛民们想赢得斯坦利杯,他们需要想出一个办法把比赛打得更好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

华盛顿首都队不如连续赢得总统奖杯以及次年赢得斯坦利杯的球队。在某些方面,他们实际上更好。他们大多更差,因为他们的守门项目低于平均水平,他们的投篮项目仅排在第五位。(以他们的标准来看,这是很低的。)但这支球队比他们的对手有更好的机会射门,并获得更高质量的射门,根据公众预期的进球模型,这是他们在 Trotz 时代的后期没有做到的事情。让他们如此成功的比赛风格的转变可能更多的是出于需要,而不是有意识的决定,他们最终变得更差,但有趣的是看到他们被描述为一个高于平均水平的比赛驱动团队。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

亚历克斯·奥韦奇金仍然是一名优秀的射手,即使在力量和力量上也是一名非常好的进攻发动者。只是不要问他(或叶夫根尼·库兹涅佐夫或约翰·卡尔森或贾斯汀·舒尔茨)如何以均匀的力量防守,你很可能会和一个非常可靠的防守球员交谈。这支球队充满了他们,以他们的精英点球手的数量,如果他们没有被这四个打大分钟的人拖累,他们可能会和明尼苏达在一起。但是他们作为一个整体仍然是一支强大的防守球队。他们的弱点在网上,这可能会因为伊利亚·萨姆索诺夫比他预计的更多地参加他们的比赛而得到缓解。然而,失去亨里克·伦德奎斯特无论如何都会受到伤害,因为克雷格·安德森在他这个年龄不太可能甚至还算过得去。

这个队有他们的长处和短处。他们坚持了一个梦想,这个梦想他们已经坚持了 15 年,并且实现了一次。考虑到这一点,他们实际上建设得相当好——在联盟最艰难的分区有 56%的机会进入季后赛不是开玩笑的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

费城飞人队活着就是为了挫败数据科学家。每隔一年,他们以大约 95-100 分进入季后赛,第二年,他们以大约 85-90 分错过了季后赛。在某种程度上,你可能会认为一个聪明的人会说“奇数年,传单会很糟糕”并抢劫世界各地的赔率制造者,但我还没有足够的信心这样做。相反,我估计飞人队有 60%的概率进入季后赛,并且应该以平均 62 分结束。他们是一个奇怪的团队,他们在创造投篮数量方面很弱,但在创造投篮质量方面很棒,相反,他们在抑制投篮质量方面很弱,但在创造投篮数量方面很棒。总的来说,他们看起来在进攻和防守上略高于平均水平,在一个艰难的分区中,只有 60%的机会进入季后赛。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从一开始,我就很清楚 Ivan Provorov 不应该成为第一号权力游戏的四分卫。也许这就是埃里克·古斯塔夫松的签约目的,如果是这样,他真的可以在那里有所帮助——但不足以抵消他在均匀强度下的粗略影响。另一个可以改善这支球队的阵容决定是给卡特哈特比过去更多的首发机会;布赖恩·埃利奥特不是一个可怕的替补,但他肯定不好,58%对像哈特这样的年轻明星来说是不够的。即使在这些阵容决定之外,像乔尔·法拉比、摩根·弗罗斯特、菲利普·迈尔斯这样的球员也有更大的进步空间,他们可以效仿伊万·普罗沃罗夫和特拉维斯·科尼克尼的道路,在早期发布糟糕的结果,然后在后来提高。Shayne Gostisbehere 也有一个反弹赛季的空间,但我认为更有可能的是,他最终会有一个健康的刮痕,并最终被交易,因为他似乎不适合 Alain Vigneault 的体系。

从乐观的另一面来看,这是费城飞人队在奇数年的表现,他们不再有阿兰·维格诺特的新教练带来的强劲势头。Flyers 的球迷完全有权利对他们的球队保持谨慎乐观,特别是在他们去年常规赛表现出来之后,但这支球队无论如何都不是成功的保证。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

匹兹堡企鹅队在附加赛中尴尬的输给了蒙特利尔加拿大人队。但他们的得分率在联盟排名第七,这意味着如果他们在西部,他们甚至不会打一场附加赛,更重要的是,奇怪的事情发生在 4 场比赛的样本量中。上赛季,在一半队员受伤之前,他们有着优秀的基本指标,即使在遭受这些伤害之后,他们也有着强大的基本指标。他们是一支非常好的曲棍球队,在淡季摆脱了他们最大的问题,虽然他们的顶级球员不是毛头小子,但他们仍然是精英球员,应该期待这支球队不低于竞争。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你可能会注意到,我对企鹅的评价比数据显示的要高一些。这完全是因为他们的守门员。特里斯坦·贾里(Tristan Jarry)在 2017-2018 和 2019-2020 赛季表现良好,但在 2018-2019 赛季的两场比赛中表现糟糕。这真的拖累了他的预测——大大超过了预期。这已经发生的事实表明,我可能应该根据冰上时间或未来玩的游戏来衡量我的回归。我没有做出任何武断的决定来改变任何人的预测,但我为 Jarry 测试了这样做,并从他的样本中删除了 2018-2019,企鹅平均跳了大约 3 点。我对企鹅队的官方预测是 64 分,但如果他们最终得到 67 分,我保留说我告诉过你的权利。

然而,在贾里之外,你可以看到是什么让这个阵容如此之好。我并不喜欢他们的新成员卡斯佩里·卡帕宁、科迪·颜后君和迈克·马西森,但如果你把他们放在杰克·约翰森旁边,我也绝对喜欢这三位球员,我也喜欢贾森·祖克。我认为这是一支去年被伤病拖垮的好球队,我认为他们变得更好了。但最终,他们不会因新人而生或死;他们将由冈泽、克罗斯比、马尔金、马里诺、唐乐和杜穆林决定生死;我认为他们都很优秀。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

很多人似乎对波士顿布鲁因斯队在所有球队中赢得分区冠军的概率最高感到惊讶,但当你赢得总统奖杯,然后带来一支比赢得奖杯的球队更好的球队时,就会发生这种情况。是的,波士顿就是这么做的。去年他们的特点是精英守门员,精英团队防守,精英力量型打法,强有力的投篮,但在平均实力上相当平庸的进攻。今年,他们已经做了一些改进,并且做得足够成功,以至于他们过去最大的弱点是他们现在排名第九的领域。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

说布鲁因斯变得更好似乎有些过火,但我很乐意为它辩护。前锋比防守更重要,翁德雷·卡斯和克雷格·史密斯是比兹德诺·查拉和托雷·克鲁格更好的冰球运动员。关于他们失去的球员,最大的担忧是,没有托雷·克鲁格,权力游戏将难以进行,尽管我的回归分析表明,克鲁格实际上对权力游戏并不那么重要,但我仍然认为这种担忧是完全合理的。曲棍球中的力量比赛不仅仅是插上球员的 RAPM xGF/60 并以那样的速度发动进攻那么简单,我可以看到帕斯特拉克和贝吉龙的表现受到克鲁格的损失超过了回归分析所表明的。

也就是说,这支球队可以在比赛的某些方面受到一两次打击,但仍然表现出色。它们构造得太好了。他们的防守可能看起来很肤浅,但这是由联盟中可以说是最好的防守队员组成的,并由一个被低估的宝石 Grzelyck 支持,他的作用肯定会增加。这支球队错过季后赛需要他们联盟最好的守门员掉下悬崖,一些糟糕的投篮运气,以及可能在一个真正的灾难赛季中的一些伤病。与此同时,几乎没有什么不可能的事需要去做,使这支球队成为一个真正的斯坦利杯竞争者。

结论

正如纯粹主义者常说的,曲棍球不是在电子表格上玩的。(或者更准确地说,是在 r 的戴尔上。)随着新冠肺炎在美国肆虐,这一季的疫苗时间表刚刚出炉,没有人能保证这一季会完成并结束。见鬼,这些模拟是用一个已经推迟了几场比赛的时间表来运行的。

这一切只是增加了这些预测的不确定性。曲棍球的部分魅力在于,即使是最强大的、最精细的预测也可能被纯粹的运气力量完全否定。即使你尊重并相信我的预测,你也不应该停止观看你最喜欢的球队,直到他们被数学淘汰,不管我说什么。

我希望你喜欢读这篇文章。不管你是否同意或不同意我的预测和我用来创建它们的方法,让我们都希望每个人都有一个有趣、健康的 2021 NHL 赛季!

哦,我的 dbt(数据构建工具)

原文:https://towardsdatascience.com/oh-my-dbt-data-build-tool-ba43e67d2531?source=collection_archive---------8-----------------------

我的经验和使用这个超级工具一个月的一些注意事项

介绍

我一生都在和数据打交道。不知何故,当我这么说的时候,听起来很戏剧化。基本上,作为一名业务分析师,我已经用 SQL 做了一些分析和基本工作,但是没有需要模板的地方。所谓的 BI 生涯我是从 2013 年开始的。作为一名顾问,并且在多个类似的项目中主要使用 MSSQL,如果有 dbt 这样的东西(或者至少在那个时候了解 Jinja)会是一件幸事;就当是经验不足吧。

有趣的是,我现在才尝试 dbt。老实说,我已经用了~个月了,所以请记住我不是专家,只是传播知识和分享我的发现。您可以找到许多关于某些细节的其他媒体文章,或者直接找到 dbt 的来源。

先决条件

首先,要实现这一点,你需要 Docker。如果你不熟悉 docker,我将推广我不久前写的关于 docker 的旧的博客文章。当在 docker 创建的环境中工作时,我更喜欢使用带有 dev 容器选项的 VSCode,它基本上创建了一个包含我的所有配置、挂载等的隔离环境。如果您对现有的 docker 映像进行了任何更改,您可以选择 rebuild image 选项,它将为您合成并打开包含所有更改的映像。如果你正在开发东西,可以跳过手工编写 docker-compose ,这将非常方便。

在我的 docker 映像中,我创建了一个特定的 docker-compose 文件,包含两个组件——简单的 postgres:13-alpine 和 python 3.8。选择 python 3.8.11 而不是 3.9 —由于兼容性问题,在尝试安装 dbt 时遇到了一些问题。我还使用 docker-compose 文件中的 mount 选项来为这个特定项目传递正确的 profiles.yml 文件。

Postgres Dockerfile 文件:

FROM postgres:13-alpine
ENV POSTGRES_PASSWORD=nopswd
ENV POSTGRES_DB db
COPY init.sql /docker-entrypoint-initdb.d/

init.sql 文件中,我刚刚创建了一个名为 db 的数据库。

Python Dockerfile 文件:

FROM python:3.8
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

没有什么花哨的要求,只是 dbt 库。

如果您已经有了一个使用 dbt 的生产环境,并且正在设置一个本地环境,那么请始终使用与生产环境中相同的 dbt 版本。在 dbt run 上遇到了麻烦,但我的同事没有。根本原因—每个人都在使用 0.19.0,我当时安装了最新的 0.19.2,我们在 packages.yml 文件中的 dbt deps 出现了一些兼容性问题。

正如我提到的,Docker-compose 有更多的东西,但没有什么新奇的东西:

您可能想知道为什么我要打开 8001 端口——稍后您将看到一些 dbt 特性需要它。

dbt 入门

好的,你可能想知道这个 dbt 是什么。基本上,它是一个令人惊叹的工具,可以简化 ELT 流程中的转换部分,如果中间某个模型中的一些底层数据发生了变化,它可以为您提供数据沿袭、文档和对数据刷新的完全控制。我真的不想(通常也不喜欢)谈论产品细节,因为我是一个更技术性的人,而不是一个产品专家。

好的,dbt 中有几个重要的文件。

  • profiles.yml —设置所有连接以及如何使用它们的文件
  • dbt-project.yml —包含该文件的特定 dbt 项目的特定配置。

让我们看一下 profiles.yml 文件:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们必须有一个默认的配置文件;如果没有指定其他内容,这将是运行所有内容的地方。不同的概要文件将允许您在不同的环境中轻松测试管道(即测试和生产):

# Running on default:
dbt run# Running on prod:
dbt run --profile prod# Running on default with specified profile:
dbt run --profile default

在使用 VSCode 打开开发容器中我的文件夹后,有趣的是看看是否一切都如预期的那样工作。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如您所见,我们在 dbt_project.yml 上有一个错误。让我们修复它。

为了简单和保持原来的 dbt 结构,我们可以初始化它。为此,让我们运行以下命令:

dbt init MY_DBT_PROJECT_NAME

现在我们可以看到 dbt 期望我们采用什么样的结构,以及它是如何工作的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

已初始化 dbt 项目结构。作者图片

让我们检查一下这个文件夹和正确创建的 profiles.yml 中的其他内容是否正常

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

dbt 调试结果。作者图片

大获成功!我们的环境功能齐全,随时可以检查一切。

让我们尝试在默认概要文件上运行 dbt:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

dbt 在默认配置文件上运行。作者图片

我们看到我们有两个模型(分别对应两个名为 my_first_dbt_model.sql 和 my_second_dbt_model.sql 的文件),但是这些测试是什么呢?他们从哪里来?让我们更深入地研究模型的文件夹。

我们可以看到 schema.yml 文件包含内容

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Schema.yml 文件。作者图片

我们可以看到,我们描述了两个列和测试——一个列必须是惟一的,不能为空。

我发现我的同事正在为每个模型创建一个 yml 文件。在我看来,这是一个更好的选择:

  • 视觉上看起来更清晰
  • 没有合并冲突,因为最有可能的是,每个模型有一个开发人员!

如果我们看看他们的查询直截了当。创建一个包含 1 和 null 的表,从 id = 1 的第一个表中创建一个视图。但是等等——我们的测试并没有说我们失败了。我们有一个空值!这是因为它没有任何数据可以测试。所以在我们运行模型之后,我们需要测试它。

要运行测试:

dbt test --model example

控制台中的输出如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

测试失败。作者图片

显然,我们可以看到我们这边存在一些问题,我们需要解决它们。

修复很容易。让我们从 null 转换到某个数字,然后再测试一次。如果我们在修复后直接运行“dbt test ”,我们仍然会看到相同的状态。我们没有运行模型,所以底层数据没有改变。我们需要运行并测试它。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

终端中的 dbt 运行和 dbt 测试视图。作者图片

万岁,我们刚刚成功地修复并运行了我们的模型!

如果我们在 dev/default 和 prod 上运行 dbt run,我们会在 DB 中看到所有这些

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在默认和生产模式下运行 dbt 后的数据库视图。作者图片

dbt 细节

目标文件夹

在我们的 **dbt 运行之后,**我们创建了这个文件夹。其内容:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

目标文件夹结构。作者图片

对我来说,有趣的文件都在编译/运行目录下。如果我们深入兔子洞,我们可以发现我们的 SQL 查询被解析。

我们还可以通过执行以下命令来编译我们的文件:

dbt compile

运行会在编译的运行的文件夹中创建或更新文件。您还将编译测试 SQL,这样您就可以了解在您指定的测试中运行了什么。

日志

如果出现任何问题,并且不太清楚是什么,请检查 logs/dbt.log。例如,在工作中,我得到“数据库错误:数据库 x 的权限被拒绝”。我不知道我缺少什么权限。得到一个 dbt 的调试页面链接,同事说查日志。从那里,我找到了我所缺少的权限。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

日志文件的片段。作者图片

增量模型

假设我们有这样一种情况,驻留在数据库中的数据很大,我们希望增加负载。一般来说,如果一个表存在,我们就编写一个脚本—从头开始创建它,否则—插入和(或)更新它。所以基本上,我们有重复的代码部分,我们必须在两个地方维护它。不符合干(不重复自己)。幸运的是,dbt 有一个惊人的特性,比如增量加载。为此,我们将使用 Mockaroo 创建一个额外的源表。我已经在本地 Postgres 数据库上执行了 01_mock_users_data.sql。我还做了一个小小的改动,将 created_at 列转换为时间戳列,而不是日期。

创建了一个简单的模型来使用 is_incremental 宏:

如果我们现在运行它并检查目标/运行:

create  table "db"."dbt_dev"."mock_users"
as (
select  * from "db"."operational_db"."mock_users_data"
);

让我们运行02 _ more _ mock _ users _ data . SQL并再次运行 dbt。在目标/运行中,我们可以看到不同的输出!

select  * from "db"."operational_db"."mock_users_data"
-- this filter will only be applied on an incremental run
where created_at >= (select max(created_at) from "db"."dbt_dev"."mock_users")

虽然这里的细微差别是,它将完全按照您指定的过滤器运行。第一轮将是所有的历史;下一次运行将只针对新行。最初的查询甚至可能没有完成,或者在执行过程中遇到一些其他问题(超时、对查询运行时间的一些硬性限制,等等。).因此,您可以创建一个上限过滤器,只需几天/几周/几个月,就可以轻松地分几批刷新。虽然这很乏味,而且您必须手动运行它才能赶上进度。

宏+按周期插入

免责声明: insert_by_period 仅适用于红移,dbt-vault 创建的 vault_insert_by_period 适用于雪花。所以基本上,我只是在解释我的旅程,我一路上尝试和检查了什么。

我在增量加载中提到了“宏”,您可能想知道它是什么?这是一些自定义代码,执行这些代码是为了添加一些缺失的功能或更复杂的逻辑。即在冗长的增量加载之前提到的。在我们的例子中,是一个简单的条件插入,它将在多个批次中加载我们的初始数据。你可以在最初关于这个宏的讨论中查看这里。总而言之,它被捆绑在 dbt-utils 包中。我们可以通过在 packages.yml 文件中指定它来导入。版本 0.7.0 与我的 dbt 版本 0.19.2 不兼容(我要求的是 0.20,在我写这篇博文的时候这只是一个候选版本),所以我使用了 0.6.4。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

packages.yml 内容。作者图片

我们可以安装依赖项

dbt deps

如果我们遵循 Postgres 用例版本的所有信息,它将不起作用,因为正如注释中所写的——它只适合红移!在这之后,我进入兔子洞,检查 dbt-vault ,做一些调整,并在 GitHub 中使用注释创建自己的宏。但是我想我对宏这个高级话题太陌生了,我不能让它工作。我将不得不深入研究这个问题。

快照模型

它的名字并不能真正解释它的作用。至少对我来说,快照意味着数据的当前状态。虽然在 dbt 的情况下,如果我们创建一个快照模型(他们建议将它放在“快照”文件夹中),我们将拥有 SCD 类型 2(顺便说一下,我前段时间在 spark 上写了一篇关于 SCD2 的文章,其中涵盖了什么是 SCD)。

因此,让我们在这个例子中使用相同的模拟用户数据。让我们添加 updated_at 列,并使其与 created_at 列(03_update_at.sql)相匹配。让我们按照 dbt 文档中的基本示例,运行 dbt 快照。我们可以看到快照的样子(只对新添加的列感兴趣):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

模拟用户数据的 SCD 类型 2。作者图片

我们可以看到我们有 dbt_scd_iddbt_valid_fromdbt_valid_to ,对应于变更。让我们执行 04_change_some_names.sql 并运行 dbt 快照。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

SCD 类型 2。作者图片

好的,所以基本上,我们只是设置了什么是独特的,dbt 负责剩下的。对我来说,这已经方便很多次了。在目标/运行/快照文件夹中,我们可以看到我们的快照代码也是为我们生成的!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所以基本上,我们可以看到它创建了一个临时表,然后为我们进行了所有的比较!

生成文档

数据沿袭和文档。如果您在 yml 文件中指定了所有相关的元数据,并使用了对模型和源的引用,那么您就可以生成文档了!

dbt docs generate

这个方法将在您的目标目录中生成一个 catalog.json 文件。要检查它在 web 上的外观:

dbt docs serve --port 8001 // or any other port you prefer

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

dbt 生成的文档页面。作者图片

如果我们点击右下角的绿色图标,我们会看到血统!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据血统!作者图片

请记住,这里我展示的是基础知识。官方 dbt 页面上有很多东西( dbt-docs 页面)!

摘要

所以我们涵盖了大部分基本的东西(我发现了一个感兴趣的领域->宏)。强烈建议任何使用 ELT 方法的人尝试 dbt。这将允许您充分利用它:完全刷新、下游重新运行、文档和数据沿袭。

你可以在我的 GitHub repo 里找到我的代码。

咖啡中总溶解固体(TDS)读数的油分析

原文:https://towardsdatascience.com/oil-analysis-for-tds-readings-in-coffee-23279b4d7551?source=collection_archive---------46-----------------------

咖啡数据科学

寻求理解

在一些关于在测量总溶解固体(TDS)之前过滤样品的讨论中,出现了浓缩咖啡中油的话题。TDS 用于计算提取率(EY),是量化咖啡提取的主要工具。咖啡中的油可能会改变 TDS 的测量方式,因为 TDS 是使用折射仪测量的,而油与水的折射率不同。为了有更深入的了解,我收集了一些数据,我很惊讶。

之前我看了别人的数据,显示滤波导致线性偏移约 0.5%。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从那以后,我一直主张不要对 TDS 样品使用过滤器,因为它们很贵,而且根据现有的数据,它们如何影响样品还不确定。离心机很可能将油从水中分离出来,这就是为什么测量结果接近注射过滤样品。

如果过滤样品改变了 TDS 读数,可能是过滤器将油从样品中分离出来。这很容易测试,只需在同一个样品中加入一些油,看起来与过滤样品相反。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所有图片由作者提供

我开始在过滤水中放一些油,然后逐渐增加油和水的比例。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

起初,读数略有下降。然后突然,读数达到最大值(HHH),这意味着折光仪读数超过 24% TDS。

所以我收集了更多的数据,但是只用了少量的油。这是一滴。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

左图:一滴油。右图:加入几滴水

少量的油仍然会溢出,一旦你加入一两滴水,读数就会达到 LLL,这意味着没有足够的液体来获取有效读数。

更多数据

我看着重复,我改变了油和水。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后,我在咖啡中加入油,以了解油被过滤后会发生什么。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

gTDS 是地面加少量水的 TDS

我预计一些油会稍微改变读数,但我没想到读数会变化如此剧烈或非常小。我不确定注射器过滤器是否过滤掉了油或微粒或其他东西,但我确定油会导致数字折光率仪的测量结果失真。

如果你愿意,可以在推特、 YouTubeInstagram 上关注我,我会在那里发布不同机器上的浓缩咖啡照片和浓缩咖啡相关的视频。你也可以在 LinkedIn 上找到我。也可以关注我在订阅

我的进一步阅读:

我未来的书

浓缩咖啡系列文章

工作和学校故事集

个人故事和关注点

乐高故事启动页面

摄影飞溅页面

改善浓缩咖啡

断奏生活方式概述

测量咖啡磨粒分布

浓缩咖啡中的粉末迁移

咖啡萃取

咖啡烘焙

咖啡豆

浓缩咖啡用纸质过滤器

浓缩咖啡篮及相关主题

意式咖啡观点

透明 Portafilter 实验

杠杆机维护

咖啡评论和想法

咖啡实验

基于机器学习的钻井数据油田岩性预测

原文:https://towardsdatascience.com/oilfield-lithology-prediction-from-drilling-data-with-machine-learning-520ee9ff6e7c?source=collection_archive---------23-----------------------

实际工作流程和经验教训

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

丹尼尔·史密斯在 Unsplash 上的照片

最近,在石油和天然气行业,我们发现了相当多的机器学习应用。我去年写了另一篇关于声波测井预测的文章,令人惊讶的是获得了如此多的回应,这项工作传播非常迅速。另一个 ML 应用是岩性预测。岩性是指岩石的类型。例如,岩性分为砂岩、粘土岩、泥灰岩、石灰石和白云石。

通常根据地球物理测井预测岩性,因为这些测井直接代表岩性。在这个应用领域已经有了无数的作品,甚至已经有了两个公开的比赛这里 (2016)和这里 (2020)。

在本文中,我们想做一些不同的事情,即从钻井数据预测岩性**。这是不同的,因为岩性和钻井测量值(如扭矩、钻头转速或泵冲程)之间的关系仍未得到很好的理解。**

基于钻井数据的岩性预测将有助于石油和天然气行业的实时地质导向。地质导向是一种控制定向钻井的过程,以使其保持在产油层中,产油层是地下的一个区域,具有作为碳氢化合物生产者的经济价值。这需要了解钻头周围的岩性。实际上,这些信息可以通过随钻测井(LWD)来提供。然而,在通过 LWD 的测量和钻头的当前位置之间存在深度滞后,并且 LWD 传递到地面存在时间延迟。因此,我们需要一个准确实时的岩性描述。

现在,让我们把手弄脏。

本文提供了源代码以供复制。访问它 这里

数据概述

我们使用 Equinor 为公众提供的 Volve 字段的数据集。我们将要使用的数据集已经过预处理。在这里找到数据。来自特定井的数据集有 33 列;2 列(深度和时间)被称为标识符,因为我们实时获得每个深度的测量值,30 列是从钻井数据获得的被测变量,在 ML 术语中我们称之为特征,最后 1 列是从泥浆测井数据获得的岩性标签。

在岩性栏中有 5 个岩性类别:砂岩、粘土岩、泥灰岩、石灰石和白云石。由于石灰石和白云石的观察次数最少,我们将只使用砂岩、粘土岩和泥灰岩进行分类。此外,请注意观察数量的不平衡。在这种情况下,我们有一个不平衡的分类。稍后,我们将在做出预测之前先处理这个问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

岩性分类分布— Yohanes Nuwara

你可能会对这些钻井数据中的大量被测变量感到惊讶。所有这些被测变量都是缩写的,但我们不会逐一描述每个被测变量是什么,因为当然,**我们不需要所有这 30 个特征来进行预测!**它们中的一些是错误的和无用的,这就是为什么我们将进行特征选择。

特征选择

当我们进行机器学习时,我们会尽最大努力减少过多特征的数量,因为较少的特征可以使我们的预测模型训练得更快。基本上,我们有两种方法可以做:移除错误特征和移除冗余特征。

1.埃罗纽斯特征

一个错误的特征不能帮助我们对目标进行分类。它包含常量或统一值。同样,当我们对水果进行分类时,例如,苹果、橘子和西瓜,仅用“形状”作为预测指标是不够的。所有这些水果当然都是“圆形”的。如果有 1000 个观察值被标记为苹果、桔子或西瓜,那么我们的“形状”列中的所有值都将是“圆形”。在这种情况下,我们需要一个更鲜明的预测因子,比如“颜色”。

水果分类时的错误特征示例

然而,错误的特征并不总是由常量值引起的。有时,特征上可能有常量值,因为该特定特征是一个注释

在某些情况下,我们不需要删除某个特征。由于任何数据都容易出现测量误差,因此异常值会使要素看起来不正确。通常,我们可以使用我们的领域知识发现异常值。如果这个特性看起来仍然有用,我们可以只移除离群值,而保留它,而不是

我们需要明智地发现错误的特征。

有一些方法可以识别。第一,汇总统计。在 Pandas 中,我们使用dataframe.describe()来打印汇总统计数据。以下是一些功能的精选摘要统计数据。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

钻井数据的错误特征

RigActivityCodeDXC 都具有恒定值,因为平均值、最小值、最大值和百分位数相等。这些功能是错误的,因此不能使用。我们看到“RigActivityCode”只是一个没有任何意义的注释。接下来, MWIN 显示所有相等的百分位数和最大值,而 LAGMTDIFF 显示所有相等的百分位数和最小值。我们可以得出结论,这两个也是错误的。

现在,看看 WOB。百分位数看起来不错,但是最小值是负的,最大值非常大。由于 WOB 是钻压,负的钻压不可能是真的。此外,非常大的最大值意味着存在异常值。然而,我们保留 WOB,而不是,因为我们可以仅移除异常值,即移除 WOB 小于 0 且小于 1,000,000 的数据部分。

另一种发现错误特征的方法是识别具有零的数据的百分比**。这里,我们计算了百分比。**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据中零的百分比

在上面的计算结果中,lagwdiff有 81%的值为零。这也是我们需要放弃这个特性的一个重要原因。

2.冗余功能

冗余特征具有在它们之间具有高相关性的特征。我们可以绘制出这些变量之间相互关系的热图。使用了斯皮尔曼相关性。我们的特征选择规则是高度相关的特征将不被使用**。**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Spearman 相关特征的热图——yo hanes nu wara

在发现一些高度相关的特征之后,我们现在可以移除这些特征。

但是请记住,我们需要使用我们的领域知识来证明为什么我们需要删除它。

SURF_RPM(表面上每分钟的转数)与 BIT_RPM(钻头上每分钟的转数)相关,因为当我们使用钻头时,钻头上测得的转数将总是等于表面上测得的转数。我们将移除 SURF_RPM** 。**

我们还移除了 MUDRETDEPTH、BIT_DIST、ONBOTTOM_TIME** ,因为这三者都是相关的。**

流入(泥浆流入)与 STRATESUM(泵总冲程速率)相关,因为当泥浆流入时,钻井工程师会获得泵的测量值。我们选择移除流入**。**

然而,我们看到流出量(泥浆流出量)与 STRATESUM 不相关,因为泥浆流出量不受泥浆流入量的控制。所以,我们保留这两个**。**

3.选定的功能

令人惊讶的是,经过紧张的试镜,我们已经将 30 个特征减少到只有 9 个!功能如下:

  • 扭矩:平均表面扭矩(N.m)
  • STRATESUM:泵总冲程速率(Hz)
  • BIT_RPM:钻头每分钟的转数(c/s)
  • 泵:泵压(Pa)
  • 流出量:泥浆流出量(m3/s)
  • ROP_AVG:深度平均每分钟转数(米/秒)
  • TOTGAS:总气体含量(ppm)
  • WOB:钻压(N)
  • ECDBIT:钻头有效循环密度(kg/m3)

我们希望这些特征有助于对砂岩、粘土岩和泥灰岩岩性进行分类。以下是我们减少特征后的数据。

我们可以以日志的形式显示数据,x 轴为特征,y 轴为深度。右边的日志是岩性栏;红色是泥灰岩,绿色是粘土岩,紫色是砂岩。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

测井显示中的钻井数据和岩性图— Yohanes Nuwara

Pairplot 也是一种有用的探索性数据分析技术。下面是使用seaborn库的所有特征的配对图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

钻井数据特征对绘图——yo hanes nu wara

对不平衡类进行过采样

我们知道我们班的观测数是不平衡的。有一个不平衡的类将使我们的预测模型具有高精度但低召回率。为了纠正这一点,我们需要对数据进行重新采样。许多重采样技术中有 3 种;欠采样、过采样以及两者的组合。

这篇文章中,Boaz Shmueli 博士更深入地解释了精度和召回,而另一篇文章解释了为什么我们应该关注不平衡类以及上述技术。

这里,我们将使用imblearn Python 库中提供的 SMOTE (合成少数过采样技术)进行过采样。最初,我们有 219:30:17 的砂岩、粘土岩和泥灰岩样品。击杀后,我们将拥有所有 219:219:219。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Zaki Jefferson 对 SMOTE 过采样过程的说明

预言;预测;预告

我们以 30%的测试规模执行训练和测试数据分割,其中train_test_splitscikit-learn中。注意,我们应该通过定义stratify参数来使用分层抽样而不是随机抽样**,因为分层对于不平衡的情况是有用的。然后我们应用标准化来转换数据。这里,标准缩放技术用于归一化。最后,我们使用 AdaBoost 分类器训练数据。**

为了简化我们的训练过程,我们构建了一个包含StandardScaler归一化、SMOTE过采样器和AdaBoostClassifier模型的流水线。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

管道结构——约哈内斯努瓦拉

我们需要评估我们的分类器的性能,所以我们将做交叉验证(CV)。在这几种 CV 中,我们选择使用 10 次分割和 3 次重复的重复分层 K-Fold CV。再次,分层。

正如我们已经讨论过的,我们使用准确度、精确度和召回率作为我们的衡量标准。使用 AdaBoost 分类器,我们实现了 96%的准确度、86%的精确度和 89%的召回率。这是一个很好的性能,因为这些指标表明该模型可以很好地预测每个类别。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们还绘制了混淆矩阵,以帮助我们了解 AdaBoost 模型对来自我们的测试集的每个真实类和每个预测类的分类情况。我们看到 65 个样本中的 61 个粘土岩、60 个泥灰岩和 64 个砂岩样本被成功预测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

混淆矩阵——约哈内斯·努瓦拉

以下是我们的分类报告,显示了每个类别的指标。这表明该模型对每个类别的预测都一样好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

模型的可解释性也很重要。这里,我们制作了 AdaBoost 预测中使用的所有特征的特征重要性图。只有 ECDBIT、TOTGAS 和 ROP_AVG 这三个功能表现突出,重要性几乎相当,分别为 30%和 35%。这意味着这三个特征对预测岩性的能力贡献最大。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

特征重要性图— Yohanes Nuwara

总结和结论

我们的数据集包括钻井测量值和来自泥浆测井的岩性。我们通过剔除错误和冗余的功能,经过严格选择,将 30 个功能减少到 9 个。我们数据中的岩性类别不平衡,砂岩是主要类别,因此我们使用 SMOTE 进行过采样。数据集以分层的方式分成 30%的测试集。在流水线中,我们从标准缩放归一化、SMOTE 和 AdaBoost 模型开始。接下来,我们进行分层重复 K-Fold 交叉验证,并拟合我们的数据。事实证明,我们的 AdaBoost 模型可以预测砂岩、粘土岩和泥灰岩岩性,准确率为 86%,召回率为 89%。在解释我们的模型后,3 个特征,ECDBIT、TOTGAS 和 ROP_AVG 对预测贡献最大,同等重要性为 30%至 35%。

我们试图从钻井数据中预测岩性,这仅仅是利用更多数据创建更强大的预测模型的更令人兴奋的机会的开始。如前所述,基于钻井数据的岩性预测可以应用于实时地质导向。每当来自钻井的测量值到来时,模型就预测岩性。机会向我们所有人开放。所以,请让我知道,如果你有任何想法来改善这项工作!再见!

****领英:【https://www.linkedin.com/in/yohanesnuwara/】T2

GitHub:https://github.com/yohanesnuwara

论贝叶斯几何

原文:https://towardsdatascience.com/on-bayesian-geometry-7755abf9f4d2?source=collection_archive---------27-----------------------

概率分布的几何解释

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Unsplash 上的 Shubham Dhage 拍摄的照片

贝叶斯推断的基础是我们往往不知道数据的底层分布,所以我们需要建立一个模型,然后随着数据的增多而迭代调整。在参数贝叶斯推理中,你从选择概率分布的一般形式f(x;θ) 由参数 θ 定义。一个很好的分布例子是具有两个参数 μσ^2 的正态分布。假设独立数据示例,假设分布下的数据概率为:

这个函数叫做似然函数。参数 θ 本身是一个随机变量,其概率分布可以用贝叶斯定理求出:

这里 p(θ) 称为后验分布π(θ)先验分布,表达了我们在看到任何数据之前对参数 θ 的信念。分母中的术语称为证据,代表数据的概率。更容易把它想成一个归一化常数,以确保 p(θ) 是一个有效的分布。

贝叶斯几何

贝叶斯几何背后的思想很简单:如果我们将参数空间中的任何函数表示为某个向量空间中的向量,会怎么样。这些函数的例子可以是先验和后验分布以及似然函数。然后,我们可以在该空间上定义一个内积 ,这将帮助我们计算两个分布之间的角度,并将该角度解释为分布彼此相差多少的度量。在我关于这个主题的讨论中,我将遵循 de Carvalho 等人【1】的一篇论文以及这个幻灯片组

参数空间中两个函数之间的内积定义为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源https://sheffieldmlnet . github . io/downloads/decarvalho-geometric-aspects-Bayesian-inference-slides . pdf

函数的范数是:

我们把函数的选择限制在存在规范的函数上。这种情况通常是不能保证的,因为有一些概率分布的范数是发散的。

有一点我们可以立即看出,上面定义的证据是先验分布和可能性之间的内积。下面是先验分布、似然性和后验分布之间相互作用的示意图。先验分布和似然性之间的大角度表明先验分布具有较差的数据对齐。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:https://sheffieldmlnet . github . io/downloads/decarvalho-geometric-aspects-Bayesian-inference-slides . pdf

[1]中的主要贡献叫做相容性,可以解释为参数空间中两个函数之间夹角的余弦:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:https://sheffieldmlnet . github . io/downloads/decarvalho-geometric-aspects-Bayesian-inference-slides . pdf

相容性是介于 0 和 1 之间的值,可用于判断先验分布与似然性、两个先验分布、两个似然性等的对齐程度。对于某些情况,它可以以封闭形式计算,对于更复杂的分布,它可以使用马尔可夫链蒙特卡罗算法计算。

讨论

关于这种方法,我想讨论几个方面:

  1. 本文在参数空间的函数上定义了一个希尔伯特空间。这意味着两个函数的线性组合也属于希尔伯特空间。这种线性组合被解释为两种概率分布的混合。然而,为了成为合适的分布,必须对其进行归一化,使得所有参数值的积分为 1:

非规格化混合物有什么意义吗?顺便说一下,似然函数不需要归一化。

2.关于概率分布的标准化概念,可能会出现一些混乱。为了正确,需要使用上面的等式进行归一化。然而,希尔伯特空间增加了额外的范数,它不是 PDF 的积分,而是其平方的积分。除了支持与希尔伯特空间相关的构造,我很难理解第二个规范的任何意义。

3.可能性不是一个加法值,而是一个乘法值。如果我有一批可能性为 L1 的数据和另一批(独立的)可能性为 L2 的数据,那么 4 个组合的可能性是 L1 和 L2 的乘积,而不是它们的和。这让我相信,也许更好的方法是在对数域中引入一个向量空间,或者使用比希尔伯特空间更复杂的代数结构。

参考

[1]德卡瓦略,m .,佩奇,G. L .,&巴尼,B. J. (2019)。贝叶斯推理的几何学。贝叶斯分析14 (4)。【https://doi.org/10.1214/18-BA1112

成为一名数据工程师

原文:https://towardsdatascience.com/on-becoming-a-data-engineer-80e791e63485?source=collection_archive---------24-----------------------

所有数据工程师所需的基本技能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

马库斯·斯皮斯克在 Unsplash 上的照片

商业环境中数据量和吞吐量的爆炸式增长已将公司引向数据驱动的决策制定方向。从历史上看,数据科学家已经从这一新发现的方向中获益。然而,随着数据科学家的角色缩小,一个新的角色正走向数据领域的前沿。

什么是数据工程?

数据工程是一个相对较新的术语,因此,它还没有在各种行业中标准化其定义。一些公司将雇用一名数据工程师,其职责更类似于数据库管理员,而其他公司则希望数据工程师具备数据科学能力。为了确保我们讨论的是同一个定义,当我提到数据工程师时,我有以下定义:

数据工程是软件工程的一个专业,专注于原始和/或处理过的数据的存储和流动。

让我们稍微分解一下这个定义:

“…软件工程中的专业化” :我发现强调数据工程是软件工程中的专业化很重要。作为一名数据工程师,您正在解决数据空间中的软件问题。当处理数据工程问题时,通才软件工程师用来解决问题的思维模式是必需的。数据工程师仍然需要理解他们面试循环的数据结构和算法,这是有原因的。然而,除了数据结构和算法,数据工程师还与数据库、微服务、第三方 API、流技术等进行交互。扎实的软件工程基础对于成为一名成功的数据工程师至关重要。

“…专注于存储和流动”:大多数工程师感兴趣的两个领域是数据的存储及其流动或移动。数据工程师专注于将数据从数据源移动到数据接收器。因此,理解存储和移动过程对数据工程师的成功至关重要,因为这将是日常任务的主要焦点。

“…以其原始和/或经过处理的形式”:数据在其生命周期中有许多不同的形式。无论数据以何种形式出现,数据工程师都应该处理这些数据。数据的结构无关紧要;数据工程师应该拥有完成手头任务所需的工具集。

既然我们已经就定义达成一致,让我们开始讨论如何成为一名数据工程师吧!

如何成为一名数据工程师

技能 1:了解计算机科学的基础知识

由于数据工程是计算机科学的一个专业,所以你需要彻底理解基础知识是不足为奇的。以我的经验来看,你不需要对操作系统或编译器有深入的了解,但是你应该能够就一个解决方案对可伸缩性的影响进行明智的对话。

示例技能包括:数据结构、算法、并行处理等。

技能 2:存储、存储、存储

对存储系统的理解是所有数据工程师的必备技能;毕竟,除非可以检索数据进行分析,否则数据是没有用的。熟悉各种数据库技术(关系数据库、NoSQL 数据库、数据仓库等)。)和他们的差异。了解如何对各种数据集建模,以及使用一种技术优于另一种技术的利弊。最重要的是,了解如何与数据库(提示:通常是 SQL 或 SQL 变体)交互来检索数据。数据存储是数据工程角色的重要组成部分,因此您对数据存储了解得越多越好。

示例技能包括:Cassandra、PostgreSQL、Hive 等。

技能 3:数据移动

与存储一样,数据移动是所有数据工程师的必备技能。数据工程师主要负责将数据从 A 点移动到 b 点。我们通常称之为提取、转换和加载(ETL)流程:

提取:从数据源中抓取或提取数据

转换:根据一组业务逻辑改变数据的形式

Load :将数据放入或加载到数据接收器中

:如果加载步骤发生在转换步骤之前,这有时可以称为 ELT。

数据移动有点微妙。“如何做”因公司而异。一些公司更喜欢构建自己的内部软件来管理数据移动,而其他公司则依赖第三方软件。然而,大多数公司,无论是否使用第三方软件,都要求数据工程师具备扎实的 python/bash 基础。

示例技能包括:python、bash、Scala、Talend、Informatica 等。

技能 4:编排

新数据不断产生,因此数据工程师需要一种方法来“刷新”陈旧数据。一种方法是通过实时处理。然而,更常见的方法(至少现在)是批处理。通常,数据工程师不希望手动运行此管道,因此会安排批处理作业。一个批处理作业实际上可能包括多个相互依赖的数据管道,因此编排变得至关重要。数据编排通常是一种调度软件,它允许工程师定义相互依赖关系,以便作业 A 总是在作业 B 之前运行(如果这样定义的话)。该软件本身可以是内部工具或第三方软件,但是,作为一名数据工程师,您将不可避免地遇到某种形式的作业调度软件,因此熟悉这些概念非常重要。

示例技能包括:气流、python、批处理等。

好吧,我学会了所有这些技能,但我不是软件工程师…

没问题!大多数工作(如果不是全部的话)都是数据驱动的。将您当前的角色框定为与数据工程一致的东西。找到可以存储的指标,稍后通过数据管道进行分析。如果其他都失败了,开始一个副业。有大量的开源数据集可以用来练习将数据加载到数据库中,并以自动化的方式移动数据。为数据工程学习的技能可以使大多数角色受益,并使你走上成为数据工程师的道路!

祝你好运!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值