TowardsDataScience 博客中文翻译 2020(四百八十九)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

如何以编程的方式为你的博客制作文字云?

原文:https://towardsdatascience.com/how-to-make-a-wordcloud-of-your-blog-programmatically-6c2bad1baa4?source=collection_archive---------39-----------------------

Python 中的文本语料库可视化工具

最近,我需要一张我们博客的图片,希望它有一些哇效果,或者至少有一个比我们一直使用的任何典型的更适合*。*思索了一会儿,云字在脑海中闪过。💡通常,你只需要一长串文本就可以生成一个,但我想到了解析我们的整个博客数据,看看是否有什么有趣的东西冒出来,并获得我们博客使用的关键词的整体视图。所以,我把这个作为自己的周末趣味项目。

PS:形象在营销中非常重要。给它质量!👀

弄脏你的手:

我们的博客托管在Ghost上,它允许我们将所有的帖子和设置导出到一个单独的、精彩的 JSON 文件中。而且,我们在 python 中内置了 json 包,用于解析 json 数据。我们的舞台已经准备好了。🤞

对于其他流行的平台,如 WordPress,Blogger,Substack 等。 它可能是一个或多个 XML 文件,你可能需要相应地切换包并在 python 中做基础工作。

在阅读 python 中的 JSON 之前,您应该了解它的结构、需要阅读的内容、需要过滤的内容等等。为此,使用一些 json 处理器来漂亮地打印你的 JSON 文件,我使用了jqplay.org,它帮助我找出我的帖子位于➡
t0】

接下来,您想调用pd.json.normalize()将您的数据转换成一个平面表,并保存为一个数据框。

👉注意:你应该已经为*pd.json.normalize()*安装了熊猫的更新版本,因为它已经修改了旧版本中的名字。另外,保持编码为 UTF-8,否则,你很可能会遇到 UnicodeDecodeErrors。(我们有这些坏人:’ \xa0 ‘、’ \n ‘和’ \t '等。)

*import pandas as pd
import jsonwith open('fleetx.ghost.2020-07-28-20-18-49.json', encoding='utf-8') as file: 
    data = json.load(file)  
posts_df = pd.json_normalize(data['db'][0]['data']['posts']) 
posts_df.head()*

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

发布数据框架

查看数据帧,您可以看到 ghost 保留了我们创建的帖子的三种格式, mobiledoc (没有 HTML 解析器的简单快速呈现器)、HTML 和明文,以及帖子的其他属性范围。我选择使用明文版本,因为它需要最少的清理。

清洁工作:

  • 删除丢失的值(你可能有的任何空白帖子),以免在以后绘制图表时妨碍你的分析。我们有一篇草稿中的博客文章,里面什么也没有。🤷‍♂️
  • 帖子中的 明文 几乎包含了所有可能不需要的字符,从空格和制表符 (\n,\xao,\t) ,到语法标点符号(点、逗号、分号、冒号、破折号、连字符、s 等)的 14 个标记。)甚至是要点。用空格替换它们。
  • 接下来,我将每篇博文中的单词拆分到 明文 列下,然后将每个单元格的结果列表连接起来,得到一个很长的单词列表。这导致了 34000 字;我们有大约 45 篇已发表的博客,每篇平均 700 字,还有一些草稿,所以算出来是 45700=31500 字。一致!🤜*
*posts_df.dropna(subset=['plaintext'], axis=0, inplace=True)posts_df.plaintext = posts_df.plaintext.str.replace('\n', ' ')
.str.replace('\xa0',' ').str.replace('.',' ').str.replace('·', ' ')
.str.replace('•',' ').str.replace('\t', ' ').str.replace(',',' ')
.str.replace('-', ' ').str.replace(':', ' ').str.replace('/',' ')
.str.replace('*',' ')posts_df.plaintext = posts_df.plaintext.apply(lambda x: x.split())
words_list =[]
for i in range(0,posts_df.shape[0]):
    words_list.extend(posts_df.iloc[i].plaintext)*

如果你现在就渴望得到结果,你可以在那个words_list上运行collections.Counter,并获得每个词的频率,从而了解你的词云可能是什么样子。

*import collectionsword_freq = collections.Counter(words_list)
word_freq.most_common(200)*

猜猜博客中最常用的词是什么?🤞
如果你说
**【the】你就对了。对于非常长的文本,冠词‘the’**将优先于任何其他单词。而且,不仅仅是“the ”,还有其他几个介词、代词、连词和动作动词出现在最高频率列表中。我们当然不需要它们,要移除它们,我们必须首先定义它们。幸运的是,我们将用来生成 wordcloud 的库自带了默认的停用词,但它相当保守,只有 192 个词。所以,让我们来看看自然语言处理(NLP)中的库,它们处理大量的文本并致力于此类任务。🔎

  • 国家语言工具包库(NLTK):它有 179 个停用词,甚至比 wordcloud 停用词库还少。不要仅仅因为这个原因就给它一个邪恶的眼神,这是 python 中领先的 NLP 库。
  • Genism:它的集合中有 337 个停用词。
  • Sci-kit learn:他们还有一个 318 个单词的停用词库。
  • 此外,还有 Spacy:它有 326 个停用词。

我选择了空间,你可以根据自己的喜好选择。

但是…😓

这还不够!不过,从营销的角度来看,有些词看起来不太好,而且我们也没有尽可能地做好清理工作。因此,我将它们放在一个文本文件中(每个单词占一行),然后读取它,并加入 spacy 的停用词表。

设置空间的说明

*import spacynlp=spacy.load('en_core_web_sm')
spacy_stopwords = nlp.Defaults.stop_wordswith open("more stopwords.txt") as file:
    more_stopwords = {line.rstrip() for line in file}final_stopwords = spacy_stopwords | more_stopwords*

设立设计室:

现在我们已经准备好了重新设计的停用词表,我们可以调用神奇的制造者➡的单词云功能了。通过 Jupyter/CLI/Conda 使用 pip 命令安装 wordcloud 库。

*pip install wordcloudimport matplotlib.pyplot as plt
import wordcloud#Instantiate the wordcloud objectwc = wordcloud.WordCloud(background_color='white', max_words=300, stopwords=final_stopwords, collocations=False, max_font_size=40, random_state=42)# Generate word cloud
wc=wc.generate(" ".join(words_list).lower())# Show word cloud
plt.figure(figsize=(20,15))
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()# save the wordcloud
wc.to_file('wordcloud.png');*

对于 python 用户来说,上述代码块的大部分内容都是不言自明的,不过让我们做一个简短的介绍:

  • background_color:你的文字云的背景,最常见。**
  • max_words:你想在 wordcloud 中显示的最大字数,默认为 200 个。
  • stopwords:要从 wordcloud 中删除的停用词集合。
  • collocations:是否包含两个词的搭配(二元组),默认为真。

什么是二元模型?

这是两个相邻单词的序列。看看下面的例子。

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

句子的二元结构

注意:将所有文本以小写解析到 wordcloud generator,因为所有停用词都是以小写定义的。它不会消除大写停用词。

好的,输出是这样的:

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

博客数据的文字云

对于一个做车队管理的公司来说,这是正确的!车队管理这个关键词比什么都有分量。

虽然,上面的图片错过了所有这一切的元素:车辆。幸运的是,你可以用 wordcloud 库在你选择的图片上屏蔽上面的 wordcloud。所以,我们开始吧。

  • 选择您选择的矢量图像。我从 Vecteezy 中挑选了我的图片。
    这次您还需要导入 PillowNumPy 库来读取图像并将其转换为 NumPy 数组。
  • 下面是生成屏蔽的 wordcloud 的注释代码块,大部分内容和以前一样。
*import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
import os# Read your image and convert it to an numpy array.
truck_mask=np.array(Image.open("Truck2.png"))# Instantiate the word cloud object.
wc = wordcloud.WordCloud(background_color='white', max_words=500, stopwords=final_stopwords, mask= truck_mask, scale=3, width=640, height=480, collocations=False, contour_width=5, contour_color='steelblue')# Generate word cloud
wc=wc.generate(" ".join(words_list).lower())# Show word cloud
plt.figure(figsize=(18,12))
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()# save the masked wordcloud
wc.to_file('masked_wsordcloud.png');*

以下是输出结果:

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

瞧啊。我们以编程的方式制作了我们的 wordcloud!🚚💨

谢谢你读到这里!🙌

参考:

如何让 AI 在疫情中更有用

原文:https://towardsdatascience.com/how-to-make-ai-more-useful-in-an-pandemic-144de89ced65?source=collection_archive---------62-----------------------

是什么限制了深度学习帮助测试、预测和预防的魔力?从人工智能社区的讨论中得到的一些教训。

自动化被吹捧为未来十年的灵丹妙药,但是当我们现在需要它的时候会发生什么——它会发生吗?从我阅读和讨论的内容来看,并不受限于技术的能力,而是受限于我们在不同环境中应用技术的能力。疫情的快速进化伴随着大量的噪音而不是大量的信号,所以这里是我将传授的见解的概要:

  1. 一些人工智能方法是潜在的影响,现在。
  2. 需要联合学习 —来自 covid19 患者的数据目前被锁定在每个医院的基础上。
  3. 处理不一致数据的方法 —最先进的方法在数据集上工作,当我们共享扫描时会发生什么?
  4. 整合 —医生需要能够使用这些工具。

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

来源—作者。

AI 能做什么?

人工智能可以提供帮助的方式数不胜数,我将分享几个:

  1. 强化学习 —将呼吸机的使用制定为一个强化学习游戏,这样我们可以更好地在短缺的高危患者中共享呼吸机。
  2. 计算机视觉n——用于未来患者风险的时不变图像分类器(不是每个住院的人都在相同的几天前生病)。
  3. 自我监督学习— 不断接受新数据并为不同子群的风险创建决策边界的辅助工具。对于医生来说,它将给出一个初始的行动过程,通过合并病人的个人资料来模仿过去的病人。

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

照片来自 Pexels

限制因素

数据被锁定—联合学习在哪里?

目前,为了将数据从一家医院传递到另一家医院,或者从一家医院传递到一群人工智能研究人员,律师必须为每个相关成员起草合同。

匿名数据需要能够流向一个安全的位置,即联邦位置,在那里可以优化模型。

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

照片由来自 Pexels 的 panumas nikhomkhai 拍摄

联合学习是消除这一障碍的工具。

联合学习是一种结构化、安全的设置,其中数据流向一个中心位置进行模型训练和分析。在医疗保健行业,该中心位置可以对个人身份信息进行加密和保护(PII),以便 1)技术公司(不会将个人识别为处于风险中,并向保险提供商出售该信息……)以及 2)可以创建更统一的全国性数据集。

数据一塌糊涂

从结构化数据集(基线)到现实世界实现的差距是明显的。在现实世界中,我们有来自不同医院和不同机器的数据。

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

胸部扫描是 covid19 患者的主要诊断手段。来源

我们如何保证我们的模型在最先进的胸部 x 射线上具有恒定的性能,而不是为新患者从仓库中取出的十年前的机器?

医生在 covid19 上使用的主要初始诊断是胸部扫描。它显示了肺部结构的损伤程度。医生可以很容易地说出当前的风险水平,但很难预测未来的风险(来源 NYU 医生)。我们认为人工智能可以有所帮助,因为计算机视觉已经在许多其他任务中发挥了作用。

希望是有的,但是模型在历史上很难适应分布转移——验证(测试)集从训练集变化而来。我们需要更好的方法来 1)解决训练时的这种转变,或者 2)使用新的验证集进行微调(元学习?).相关来源是这里这里

没有人告诉医生如何使用它

医生需要有用且直观的工具。对病人来说,屏幕时间有增加而面对面时间减少的趋势。有人会认为这让医生更愿意使用自动化技术,但事实未必如此。

如果没有医生的参与,医疗技术通常是一种负担。

这听起来就像是如果机器学习研究人员希望医生对患者数据进行这样的工作流时会发生的事情:

git clone new-classifier.git
conda export stuff.yaml
python setup [] .e
python model/train.py data=43

做这件事有什么更好的方法?我认为需要一个完全不同的数据流。也许这可以内置到联合学习中,也许不能。这是下一次紧急情况需要改进的领域,因为现在我们需要利用我们已经得到的东西,并且知道 医生没有时间学习和调试人工智能模型。

这是另一篇关于技术和医疗保险互操作性困难的文章,以及这是如何减少病人有效时间的。

让我向你保证,人工智能社区真的很想帮忙。我们知道这些问题可以用简单的方法解决,但当拯救生命遇到额外的障碍时,医生和计算机工程师都感到愤怒。

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

关闭使得海湾地区的空气质量指数出现了前所未有的上升。来源——隔离骑自行车。

这些想法的灵感来自加州大学伯克利分校教授的电子邮件,NYU 医学和脸书人工智能研究合作的首次会议,以及将想法付诸实践的愿望。我希望我们现在可以通过了解缺点和为未来的挑战做准备来发挥作用。

注意安全,好好待着!

更多?订阅我关于机器人、人工智能和社会的时事通讯!

[## 自动化大众化

一个关于机器人和人工智能的博客,让它们对每个人都有益,以及即将到来的自动化浪潮…

robotic.substack.com](https://robotic.substack.com/)

如何用 Python 制作分析工具

原文:https://towardsdatascience.com/how-to-make-an-analysis-tool-using-python-c3e4477b6d8?source=collection_archive---------13-----------------------

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

Unsplash 上由 Carlos Muza 拍摄的照片

S 自从去年 10 月的新政策以来,Medium 以不同的方式计算收益并且每天更新它们。在改变之前,它是基于成员的鼓掌次数和他们自己鼓掌的数量,但现在它是基于阅读时间。类似于 youtube 的算法,就是观看时间。

重要的是,它每天都在更新,你想知道在过去的 30 天里,你的故事制作了多少,有多少浏览量

作为制作这个简单分析工具的示例网站,我们就拿来说。但是你基本上可以在任何有你需要的统计数据的网站上做这件事。

这是 Python 的一个非常简单的用法,你不需要任何特殊的或者相当惊人的技能来和我一起做这件事。我们将一步一步来,从头开始建设一切。

让我们直接投入进去吧!

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

马克斯·杜济在 Unsplash 上拍摄的照片

编码

规划流程

构建这样一个工具需要几个步骤,首先,我们必须了解如何获得我们想要的东西。这是我们进入 Medium 欢迎页面的地方。

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

媒体的欢迎屏幕

它相当简单,我们有登录/注册按钮。我们将使用这些来登录我们的个人资料。我们将使这个工具自动化,让它点击、填写电子邮件、密码并让我们登录。之后,我们将得到我们需要的数据。

设置环境

你将不得不安装一个 chrome 驱动程序,它将使我们能够操作浏览器并向它发送命令以供测试和使用。

打开链接并下载适用于您的操作系统的文件。我推荐最新稳定版,除非你已经知道自己在做什么。

接下来,您需要解压缩该文件。我建议进入文件,通过右键单击手动操作,然后单击“Extract here”。

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

在文件夹里面,有一个名为“chromedriver”的文件,我们必须将它移动到你电脑上的特定文件夹中。

打开终端,键入以下命令:

**sudo su** #enter the root mode
**cd**      #go back to base from the current location
**mv /home/*your_pc_name*/Downloads/chromedriver /usr/local/bin** 
#move the file to the right location

请插入您的实际电脑名称,而不是您的电脑名称

完成后,我们打开编辑器。我个人选择的是 Visual Studio 代码。它简单易用,可定制,并且对你的计算机来说很轻。

打开一个新项目,创建两个新文件。这是一个我的例子,看起来可以帮助你:

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

Visual Studio 代码—项目设置

在 VS 代码中,有一个“Terminal”选项卡,您可以使用它打开 VS 代码中的内部终端,这对于将所有内容放在一个地方非常有用。

当你打开它时,我们还需要安装一些东西,那就是虚拟环境和用于 web 驱动程序 selenium。在您的终端中键入这些命令。

pip3 install virtualenv
source venv/bin/activate
pip3 install selenium

激活虚拟环境后,我们就完全准备好了。

创建工具

我们将把它创建为一个类,并为它创建函数。所以我们开始吧!

用任何名字创建你的工具并启动 Chrome 的驱动程序。

class MediumBot():
  def __init__(self):
    self.driver = webdriver.Chrome()

这就是我们开始发展所需要的一切。现在转到您的终端并键入:

python -i scrape.py

这个命令让我们把我们的文件作为一个互动的游乐场。浏览器的新选项卡将会打开,我们可以开始向它发出命令。
如果你想试验,你可以使用命令行,而不是直接输入到你的源文件中。只是用 bot 代替 self

对于终端:

bot = MediumBot()
bot.driver.get('https://medium.com/')

现在来看看源代码:

self.driver.get('https://medium.com/')

现在,我们转到了灵媒欢迎页面,接下来我们需要登录。我们检查元素(键盘上的 F12)并复制元素 XPath。

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

右键单击标记为蓝色代码部分,并通过 XPath 进行复制。接下来,我们必须发出命令来为我们单击那个按钮。

**sign_in** = self.driver.find_element_by_xpath('//*[@id="root"]/div/div[4]/div/div/div[3]/div/div[2]/h4/a')
sign_in.click()

单引号(')是我的 XPath,如果你在做其他网站,你必须调整你的 XPath。

我将 XPath 保存到一个变量中,并对其执行 click()函数。

我已经做了两种类型的登录,分别是谷歌和脸书,你也可以选择哪种方法更适合你,但关闭双因素认证,这样这个过程会更容易。

对于脸书方法,您将选择“使用脸书登录”按钮,获取它的 XPath 并再次单击它。

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

现在我们必须输入我们的用户名和密码,我们通过 send_keys()函数来完成。

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

再次选择文本框,现在只需向该字段发送文本,如下所示:

email_in = self.driver.find_element_by_xpath('//*[@id="email"]')email_in.send_keys(username)

对密码做同样的操作,然后用 click()函数登录。登录后,我们可以访问我们想要的数据,我写了两个独立的函数来获得收入和你的故事的浏览量。

第一次查看:

def stats(self):
  self.driver.get('https://medium.com/me/stats')
  sleep(3)
  total_views = self.driver.find_element_by_xpath('/html/body/div[1]/div[2]/div/div[3]/div/ul/li[1]/div/div[1]')
  print(total_views.text)

现在是收益:

def earnings(self):
  self.driver.get('https://medium.com/me/partner/dashboard')
  sleep(3)
  total_earnings = self.driver.find_element_by_xpath('/html/body/div[1]/div[2]/div/div[3]/section/div/div[2]/div/div/div/div[3]')
  print(total_earnings.text)

在这两个示例中,我使用了 sleep()函数,该函数允许我将进一步的执行暂停一段时间,因此 sleep(1)将暂停 1 秒钟。你必须在代码的开头导入它。

一旦你提取完数据。您现在所要做的就是在类外创建这个工具的一个实例,并对它执行一个函数。

bot = MediumBot()
bot.login_facebook()

保存并运行脚本。亲眼目睹奇迹的发生!

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

我的分析

以下是我的 GitHub 页面上的完整代码:

[## lazargugleta/mediumBot

为你的故事收集收入和数据。通过在…上创建帐户,为 lazargugleta/mediumBot 的发展做出贡献

github.com](https://github.com/lazargugleta/mediumBot/blob/master/scrape.py)

此外,您可以更改 creditentials.py 并用您自己的数据填充它以便登录。

我们完了!

后续步骤

如果你想更进一步,你还可以实现一些功能,比如在你达到某个目标时发送电子邮件,或者提取你想要跟踪数据的特定故事的数据。

我希望你喜欢这个小教程,并关注我更多!

感谢阅读!

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

跟着我上中型

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

在推特上关注我

如何使用 Folium 和 Imageio 在 Python 中制作动画 GIF 图

原文:https://towardsdatascience.com/how-to-make-an-animated-gif-map-in-python-using-folium-and-imageio-91d3fc60d084?source=collection_archive---------19-----------------------

巴西高等教育史的可视化分析

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

罗马法师在 Unsplash 上拍摄的照片

最近一直在清理分析巴西高等教育机构(HEI)的数据。巴西“INEP 国家教育研究学院”保存了来自基础教育和高等教育学生、教师和机构的大量微观数据,以及来自衡量课程质量和学生学习发展的外部评估的数据。

有大量研究(学术或非学术)分析巴西的基础教育(小学和中学)数据。在我攻读经济理论硕士学位期间,我调查了社会配额对公立高中学生在中学期末择校的影响。

分析高等教育数据的研究不太常见,尤其是在巴西大学之外。鉴于这种现象,我开始组织、描述和翻译关于巴西高等教育的数据和信息。这一系列文章是将巴西高等教育数据的使用推广到巴西以外的首次尝试。

在这篇文章中,我强调了在更广泛的研究中产生的一个结果。也就是说,创建一组 choropleths 的代码映射了不同年份的图像,并将其转换为 Gif。

该产品

在乞讨,我的主要目标是有一个视觉代表的地理分布的高等教育提供多年来在巴西。我猜想巴西的大部分地区仍然没有机会接受高等教育。此外,考虑到过去 20 年公立高等教育机构的扩张过程众所周知(至少对巴西人而言),这一过程在中小城市的密集程度更高,我认为这张“高等教育普及图”最近有了很大改善。

为了达到这个目标,我选择每十年绘制一张 choropleth 地图,从第一个仍在进行的高等教育课程建立的那一年开始。幸运的是(或者不是),最终的产品表明我之前的猜测是正确的。

库导入

这个项目中使用了两个主要的库:

  • 首先是 Imageio。这个库用于追加。png 文件在一个动画 gif。有关该库的更多信息,请点击此处。以下是 Imageio 网站上的简短描述:

Imageio 是一个 Python 库,它提供了一个简单的界面来读写各种图像数据,包括动画图像、体积数据和科学格式

  • 第二个是令人惊叹的叶库。follow”使得在交互式传单地图上可视化用 Python 处理的数据变得容易。‘’.基本上,使用 leav,您可以轻松地创建以任何位置为中心的地图,自定义其样式,并根据位置输入或在 GeoJson 文件中添加标记、颜色和其他功能。

此外,其他库用于提取. zip 文件(zipfile)、打开 HTML 文件和截图(webdriver)、读取 json 文件(Json)、裁剪图像(Image)、定义色标(braca.colormap)、管理数据框(pandas)等等。以下是完整的列表:

数据

巴西高等教育普查带来了每个机构、课程、学生和教师的年度数据。这是一个公开的非常丰富的数据集,还没有被广泛探索。为了制作这个产品,我使用了 2018 年微数据中的课程数据。

下面的代码从 INEP 网站提取微数据文件,解压并组织到项目文件夹中,读取 pd.dataframe 中的课程数据

“清洗”

实际上,对于这个分析,不需要对课程数据框架进行重大清理。只有两列用于制作地图:

  • “城市”,代表提供课程的城市的 id;和
  • “DT_INICIO_DE_FUNCIONAMENTO”,表示课程开始提供的日期。

在只保留上述两列之前,我从数据库中删除了在线课程(约占所有课程的 8.3%)

从“DT_INICIO_DE_FUNCIONAMENTO”开始,我创建了一个新列“FOUNDATION_YEAR”,它仅指示课程开始提供的年份,不包括成立的月份和日期。

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

图 1 —缺失值分布的热图

快速“nan”值检查显示,FOUNDATION_YEAR 的 nan 值为 2.700(数据框的 5.1%)。热图(图 1)显示,这些缺失值在各个城市中分布良好。我在这里的选择是简单地放弃所有这些 nan 值。一个异常值也被删除。一门据说始于 2917 年的课程

清理课程数据框的代码描述如下。

GeoJSON 文件

为了制作 choropleth 地图,我们需要地理区域的 JSON 或 shapefile。巴西各城市的 GeoJSON 可在 Git 上获得。这项工作的一个小而有趣的改编是使用州或微区域边界,而不是市政当局。

下面的代码使用 JSON 库读取 GeoJSON 文件

由于没有任何高等教育课程的城市没有出现在我们的课程数据框架中,因此有必要将其包括在内。否则,当我们“绘制”地图时,这些城市将会消失。

下面的代码根据 GeoJSON 文件创建了一个包含所有城市 id 的字典,以供将来使用。

设置色彩映射表比例

我选择在每年的课程总数中应用 np.log。我这样做是因为圣保罗(巴西最大的城市)等城市的球场数量比小城市多得多(小城市通常提供不到 12 个球场)。对数函数有助于我们获得更均匀的色彩映射表。

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

图 2 —我们的色图量表(所有球场的记录)

创建自第一个球场成立以来每十年的 choropleth 地图

下面是一步一步地创建和颜色的地图使用叶。欢迎对改进代码和描述质量提出任何疑问或建议。

关闭地图缩放控制

树叶地图带有缩放控制,类似于谷歌地图的功能。考虑到我们将为每十年创建一个图像,而不是一个交互式的 HTML,我选择使用下面的代码去掉这个缩放控件。基本上,fileinput 函数打开每个 HTML 代码,将“zoomControl: false”替换为“zoomControl: true”,并以相同的名称保存文件。

将 HTML 文件转换为 PNG

要创建 Gif,需要的是图像,而不是 HTML 文件。不幸的是,follow 只生成 HTML 地图。下面的代码打开所有这些 HTML,一次一个,截取一个屏幕截图,并保存为. png 文件。

重要的是选择一个延迟,保证浏览器在截图之前有时间加载地图。

裁剪图像以获得更好的视觉效果

截图捕捉了地图外的大量空白空间。我用过。从 PIL 图像裁剪功能,以调整图像的大小,只保留我们的文件的“心脏”。

最后(!),使用 Imageio 创建我们的 Gif 地图

Imageio 使得追加非常简单。png 文件,并将其转换为动画 gif,每秒帧数(fps)可配置。为了保持我的项目文件夹整洁,我还删除了所有的 png 文件。

决赛成绩

好的。就是这样!:)下面是最终结果:

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

图 3 —我们的 Gif 地图,显示了几十年来每个直辖市的高等教育课程总数

超越

有了来自高等教育普查微观数据的“DM_CURSOS”数据库,我们可以做得更多。例如,可以区分私人和公共课程,在线和课堂,并获得每个城市的学生总数,而不是课程总数。

稍后,我将尝试为每个城市创建一个高等教育提供指数,比较公立和私立机构提供的席位数量以及高中最后一年注册的学生数量。

如果你想知道更多关于巴西高等教育的数据,我邀请你阅读这些帖子关于巴西高等教育的可用数据和我已经使用的的分析。如果你有什么建议,随时联系我。

如何在 R 中制作漂亮的小型多用户地图

原文:https://towardsdatascience.com/how-to-make-beautiful-small-multiple-us-maps-in-r-ad7e557cd463?source=collection_archive---------26-----------------------

一行代码就能让你的可视化更上一层楼

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

我最近偶然发现了一个关于美国难民接收情况的大型数据集。它包括难民来自的*、以及前接收难民的各州的数据。*

之前的项目中,我探索了迁徙是如何在个地方展开的:迁徙者在哪里旅行,他们在哪里失踪,以及他们的旅程在哪里到达致命的终点。

有了这个新的数据集,我想看看收容国是如何应对移民和难民危机的,特别关注美国。在我看来,美国对日益增加的难民数量的反应的有效可视化需要呈现两件事:难民接受度如何随着时间的推移而变化以及各州难民接受度如何不同。**

呈现这两种趋势的一种有效方式是使用小型多重折线图。出于审美的目的,将这些倍数排列成一种隐约类似美国的形状也是不错的。(这也让读者更容易找到自己感兴趣的状态。)

互联网上有这种小型多重地图的例子。《华盛顿邮报》对选举团的概述如下:

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

你也可以在 PolicyViz 博客上找到为什么有效的概述,以及一些额外的例子:

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

在 R 制作

在 R 中创建一个小的多瓦片栅格地图的过程相对容易(就像在 R 中完成的大多数事情一样)。这在 D3.js 中要困难得多;如果你对那类事情感兴趣,你可以看看这个代码寻找灵感。

步骤 1:构建基本折线图

第一步(在讨厌的数据合并和清理之后)是对基本线图有个感觉。为了做到这一点,我们可以想象出所有州接受难民的宏观趋势。**

(变量名怪怪的;region_name_3对应年份,textbox37代表接受的难民人数。)

*data %>% 
  group_by(region_name_3) %>% 
  summarise(textbox37 = sum(textbox37)) %>% 
  ggplot(aes(x = region_name_3, y = textbox37)) +
  geom_line() +
  labs(title = "Refugee Acceptance on the Decline",
       subtitle = "Number of refugees accepted annually, 2002 - 2019",
       x = element_blank(),
       y = element_blank()) +
  scale_y_continuous(labels = scales::comma_format()) +
  scale_x_continuous(breaks = c(2002, 2019))*

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

现在我们有了第一个问题的答案:随着时间的推移,难民接受度发生了怎样的变化?答案是:非常剧烈。美国在 2016 年接收了近 10 万名难民;两年后,这个数字刚刚超过 20,000。

第二步:做小倍数

接下来,我们制作 50 行:每一行代表美国的一个州。我们使用瑞安·哈芬的geofacet 软件包来实现。

这很简单,只需在我们之前的绘图中添加一行代码:

*facet_geo(~ state)*

这使得一个情节看起来像这样:

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

还可以,但不完美!我们肯定可以做一些改进。

首先,轴标签重叠。我们已经知道年份的范围是 2002 年到 2019 年之间(在我们的字幕里!).所以我们可以去掉 x 轴标签。

*theme(
  axis.text.x = element_blank(),
  axis.ticks.x = element_blank()
  )*

第二,轴线(在两个轴上)似乎是不必要的,并且(特别是 x 轴)有时可以隐藏那些具有较低值的状态的趋势。让我们把那些也拿掉!

*theme(
  axis.line.x = element_blank(),
  axis.line.y = element_blank()
  )*

最后,我不喜欢我的轴标签周围巨大的灰色方框。我们能让它们透明吗?

*theme(
    strip.background = element_rect(color = "white")
)*

将所有这些加在一起(并调整字体大小),我们得到这样的结果:

*data %>% 
  group_by(region_name_3, state) %>% 
  summarise(textbox37 = sum(textbox37)) %>% 
  ggplot(aes(x = region_name_3, y = textbox37)) +
  geom_line(color = "black") +
  scale_x_continuous(breaks = c(2002,2019)) +
  scale_y_continuous(breaks = c(0,12000)) +
  facet_geo(~ state, grid = "us_state_grid1") +
  labs(title = "Refugee Acceptance on the Decline",
       subtitle = "Number of refugees accepted annually, 2002 - 2019",
       x = element_blank(),
       y = element_blank()) +
  theme(
    axis.text.x = element_blank(),
    axis.ticks.x = element_blank(),
    axis.line.x = element_blank(),
    axis.line.y = element_blank(),
    plot.title = element_text(size = 24),
    plot.subtitle = element_text(size = 18),
    strip.background = element_rect(color = "white")
  )*

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

好多了。但是我们仍然可以添加一些元素来使我们的可视化更上一层楼。

因为我们的数据跨越了近 20 年(2002 年至 2019 年),所以我们可以用其他感兴趣的变量来覆盖我们的小倍数,例如在特定时期谁是总统。

我们使用geom_rect来实现:

*geom_rect(mapping=aes(xmin=2009, xmax=2017, ymin=0, ymax=12000),
fill = "#ADD8E6", alpha = .05) +
geom_rect(mapping=aes(xmin=2017, xmax=2019, ymin=0, ymax=12000),
fill = "#FF9999", alpha = .05) +*

第一行代码创建了一个跨越 2009 年到 2017 年(奥巴马任期)的蓝盒子。第二行为特朗普的总统任期创建了一个红框(到目前为止)。

综上所述,代码和输出如下所示:

*data %>% 
  group_by(region_name_3, state) %>% 
  summarise(textbox37 = sum(textbox37)) %>% 
  ggplot(aes(x = region_name_3, y = textbox37)) +
  geom_line(color = "black") +
  geom_rect(mapping=aes(xmin=2009, xmax=2017, ymin=0, ymax=12000), fill = "#ADD8E6", alpha = .05) +
  geom_rect(mapping=aes(xmin=2017, xmax=2019, ymin=0, ymax=12000), fill = "#FF9999", alpha = .05) +
  scale_x_continuous(breaks = c(2002,2019)) +
  scale_y_continuous(breaks = c(0,12000)) +
  facet_geo(~ state, grid = "us_state_grid1") +
  labs(title = "Refugee Acceptance on the Decline",
       subtitle = "Number of refugees accepted annually, 2002 - 2019",
       x = element_blank(),
       y = element_blank()) +
  theme(
    axis.text.x = element_blank(),
    axis.ticks.x = element_blank(),
    axis.line.x = element_blank(),
    axis.line.y = element_blank(),
    plot.title = element_text(size = 24),
    plot.subtitle = element_text(size = 18),
    strip.background = element_rect(color = "white")
  )*

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

我把这个情节带到 Illustrator 中,让它看起来漂亮多了。这是最终版本:

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

我们注意到了什么?几个关键的州(德克萨斯州、加利福尼亚州、佛罗里达州和密歇根州)占了难民接收人数的绝大部分,而其他州几乎不接收难民。自 2017 年以来,几乎每个州都减少了难民接收量,但这一下降的大部分来自这些较大的州。

* [## 康纳·罗斯柴尔德

康纳·罗斯柴尔德的最新推文(@CL_Rothschild)。@RiceUniversity 本科。对数据感兴趣…

twitter.com](https://twitter.com/CL_Rothschild)

原载于 我的博客 *

如何在数据和业务功能之间架起桥梁

原文:https://towardsdatascience.com/how-to-make-bridges-between-data-and-business-functions-bba1714d09e9?source=collection_archive---------66-----------------------

数据科学家和业务经理之间的沟通问题可能会危及您的数据工作。这里有一些克服这种情况的方法。

数据科学家和业务经理之间的沟通问题是新进入数据世界的公司越来越头疼的问题。指责对方很容易,但事实往往更复杂,双方都有需要改进的地方。让我们了解一下,作为一名数据科学家,你如何成为一名桥梁制造者。

还有一个简单的问题你可以问数据科学家来衡量他或她当前的商业敏锐度:

那几天你在忙什么?”。**

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

你知道…复杂的东西…照片由克里斯·贾维斯 Unsplash 上拍摄

这不全是技术问题

一些数据科学家,尤其是初级水平的(但不仅仅是!),会回答你:

**我正在根据我们的客户数据训练一个逻辑回归模型。准确性实际上比随机森林要好,但我现在必须做一些适当的交叉验证。

如果你与另一位数据科学家交谈,这没什么,但如果你与业务合作伙伴交谈,他们肯定会感到困惑。

许多数据科学家认为他们的主要任务是编码、创建模型和共享结果,在某种程度上,这是真的。但是,在不同的层面上,他们的工作是为你的公司——由业务经理代表——必须解决的问题提供解决方案。通常,数据科学家会失去这种视角,忘记他们想要解决的问题。

很难责怪他们。从深层的技术视角(例如,同时处理高级统计和编程概念)缩小到更高层次的业务视角(例如,当前的业务战略是什么)是困难的。在这两个世界之间架起一座桥梁是确保您公司的数据工作不会失败的最佳方式。

但是这里有一个好消息:有一些简单的方法可以改进这一点。

成为桥梁制造者

回到我们最初的问题,业务经理可能更喜欢这样的答案:

**我正在做我们的项目,预测客户重复购买的可能性,以便我们可以针对他们定制电子邮件活动。我已经开发出了一种精确度很高的方法,并在考虑投入生产之前对其进行验证。

你可以理解,你的业务经理可能会发现这更能提供信息:他们理解每一个字,了解项目的背景和目标,以及进展状态。

这里有一个方法可以提高你的商业头脑,并确保你与项目商业方面的沟通富有成效,而不是项目最终失败的原因。

写一些规格。阅读它们。

数据科学项目不能总是作为软件开发项目来管理,但这不应该阻止您编写一些规范,包括业务和技术团队。

除了我们在此不涉及的纯技术方面,良好的规格应强调:

  • 我们要解决哪个问题?(例如,我们希望在我们的网站上吸引更多的重复购买)。
  • 最终的成果是什么?(例如,我们将生成一个我们认为是潜在重复购买者的用户列表,以便我们可以针对他们开展特定的电子邮件活动)。
  • 成功是什么样子的?(例如,至少 5%的目标用户会在下个月内进行新的购买)。

尽管数据科学家也应该参与讨论可行性(例如,我们有正确的数据吗?)和管理期望(例如,“不,我们不可能有 100%准确的模型”)。

一旦写好,不要忘记最重要的步骤:阅读它们。我不是说读一遍就开始编码。定期阅读。每次你召开关于项目进展的会议时,使用这份文件作为参考,看看你是否在轨道上,即使没有任何业务经理。如果需要更新,就去做,一直用新版本。

使用这种方法可以减少不符合业务预期的可能性,因为双方都致力于同一个计划。

有一个过程

既然你已经和你的主要利益相关者定义了一个明确的目标,那么就设定一个过程来实现最终目标。

该流程应包括:

  • 项目的主要里程碑是什么?(例如,数据探索、尝试两种潜在方法、优化这些方法中的最佳方法、生成建议)。
  • 何时达到里程碑?(例如,允许一个时间框或当达到特定目标(如给定的模型精度)时)
  • 你什么时候更新你的利益相关者?(例如,达到每个里程碑的时间或每周)

对于数据科学项目,你永远不会真正知道你最终会走哪条路到达最终目标,因为这取决于你在路上会发现什么。这样一个过程的作用是确保你不会迷路或偏离方向,并且你能有效地达到你的最终目标。

保持经常联系

上面概述的过程包括一些与你的利益相关者的定期交流,你应该确保他们根据需要的频率。这应该发生在不同的形式下。

  • 每周更新。预定一个时间段来讨论这个项目,即使你不知道你会谈论什么。如果没有人真的有什么要讨论的,你仍然可以取消它。
  • 里程碑更新。如果达到了一个重要的里程碑,发送一个更新,例如通过电子邮件或 Slack 消息。详细说明你到目前为止已经做了什么,以及它如何让你更接近目标。
  • 要做的选择。你的规格永远不会涵盖所有的小细节。如果你面临一个必须做出重要选择的情况,通知你的利益相关者。
  • 如果您打了电话(例如,由于数据质量问题,我们不会处理 2015 年之前加入的客户),请发送一份更新,解释问题所在以及您做出这一决定的原因,并在某个地方记录下来。
  • 如果你不确定要做的决定,联系你的利益相关者,解释问题,什么是可能的解决方案,你认为什么是最好的。

这样做,您可以大大降低数据科学工作不符合业务预期的可能性。

不要太专业

当与你的利益相关者交流时,记住一件事:他们不关心技术细节。他们想知道你离交付还有多远,而不是知道你选择了哪种算法。

因此,你的沟通不应该集中在技术上,而应该集中在以下两个方面:进步信任*。***

进展:你必须传达出你比上次谈话时离交付成果更近了。这就是这个过程的必要性。如果你首先定义了什么是交付之路,你就有了一个共同的参考来使用。例如,如果您最初说模型构建阶段需要两周时间,那么如果仅仅一周之后还没有最终的模型,就不会有什么坏的意外了。你也可以把它作为一个视觉参考(例如,上周我们在第 2 步,现在在第 3 步,下周我们应该到最后一步),人们往往会记得更好。

信任:如果你表现出你能掌控局面,人们会相信你能做好工作。诚实地面对你可能发现的障碍,并向他们展示你是如何超越它们的,从而为自己建立一些可信度。他们也不会关心你如何微调你的模型性能,他们会关注这个方法最终是否有效。
同样,你会相信人们会做好他们的工作,一次就把你的最终邮件列表发送出去,你不需要知道他们会如何设计他们的邮件活动,这是他们的工作。
这同样适用于你。你的工作是在适当的时候交付有用的东西。如果你能做到这一点,并表明你能控制你的项目,人们会相信你能做好工作,不会质疑你是如何做到的。

越过敌人的防线

我并不是说企业经理是敌人,但对一些人来说,他们的领域绝对是一个未知的领域。

良好沟通的关键是换位思考,这不适用于这种独特的数据科学<>业务关系。为了知道如何有效地与人交流,你必须了解他们的世界是什么样的,他们的主要关注点是什么,以及他们使用哪种词汇。你不会学到只和数据科学家交谈。

这就是为什么走出你的舒适区,去参加一些商务会议是很重要的。询问你的利益相关者你是否能参加他们的会议,这样你就能更好地了解他们的工作和目标。如果有帮助的话,主动提供一些小细节的帮助,比如写一份会议纪要。

一旦到了那里,尽可能多地观察和学习,并专注于:

  • 他们的主要目标是什么?(例如,目前是否专注于获得新用户或利用现有受众)。这将有助于你确保你关注的是他们实际存在的问题,而不是他们此刻不关心的问题。
  • 他们是如何交流的?他们关注最终产品吗?关于里程碑?只在下一步?

一旦你确定了他们的工作和思想是如何构建的,就用同样的结构与他们交流,以确保你的信息被更有效地理解。

准备好了吗?

你可以采取一些简单的步骤来确保你的项目的业务和技术部分更好地连接,正如你所看到的,它与技术没有什么关系。

发展人际交往和管理技能需要时间,但你可以从明天开始。要开始你成为桥梁制造者的旅程,下次你的业务经理问你工作进展如何,确保你谈论的是你朝着目标的进展,而不是技术。

如何让 ML 在极端条件下工作?

原文:https://towardsdatascience.com/how-to-make-data-science-models-work-in-extreme-conditions-bd6478fdc922?source=collection_archive---------36-----------------------

ML 可应用于许多工业环境,以节约成本和改进流程。以下是方法。

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

海岸制片上穿梭拍摄

数据科学可以应用于许多工业环境,以节省成本和改进流程。这种工业人工智能不仅包括驻留在计算机系统内部虚拟空间的智能算法和大数据概念,还包括物理设备本身。数据必须通过传感器获取。命令必须被发送到致动器和控制系统。这整个信息链和信息流,不管是无线的还是有线的,都要经过极端条件下的地方。从工厂、矿山或石油钻塔内部的操作点,到数据中心和控制室内部的大数据存储和巨大处理能力,还有很长的路要走。

工业生产设施、物理运输系统和分销渠道非常复杂,通常包含来自不同制造商的大量设备。随着自动化程度的提高,有许多现有的数字控制和管理系统。今天,您可以在工业环境中找到数据网络、监控和数据采集(SCADA)、可编程逻辑控制器(PLC)以及供暖、通风和空调(HVAC)。所有这些系统都是在不同的抽象层次上看待的。有复杂的概念和更高的管理级别,也有与物理挑战更紧密相关的较低级别。

越来越难了

现有的工业设施有许多电线和数公里长的电缆。这些复杂的网络保持运营。您拥有连接设备和交换机、提供网关和创建控制室连接的数字网络的工业标准。这些系统在恶劣环境下运行良好。随着数据科学和工业环境中新的全球数字连接的到来,新的智能设备也需要能够在这些极端条件下运行。ML 与工业物联网(IIoT)紧密相连,以提供更多的无线连接以及与企业范围系统和互联网的链接。

所有这些新系统都面临着自然的挑战和重工业机器的强大力量。生产设施可能位于遥远的地方,没有电网。想象一下在只有一条简易道路的丛林中作战。你必须通过发电机或电池自带所有能源。环境可能冷或热,有害气体会腐蚀电子设备或使其在爆炸中消失。但是热和冷不仅来自自然,也来自生产过程。熔化和冷冻工件可能是生产过程的一部分。许多工作发生在机械领域。你有高速运动的部件。你有制造振动和冲击的机器。数据科学现在主要以机器人和 IIoT 网络的形式面临这些物理挑战。

到处都有机器人

机器人是一项复杂的挑战。他们需要做事,他们需要把自己带到需要他们的地方。要在没有人类互动的情况下实现这一点,就需要这个机器人内部的 ML 大脑。但是,我们都记得机器人在核电站退役中的失败。在这种情况下,问题在于辐射破坏了电子设备。因此,需要一个坚强的大脑。此外,与外界的交流也很困难。在强辐射中,无线或有线通信是一个挑战。

然而,对于工业数据科学来说,不仅仅是核衰变的可怕性质,深海勘探或采矿的例子也是如此。它们也很有挑战性。由于缺乏通用基础设施,也没有固定电源或互联网可用,您需要调整现有的最佳实践,以适应数字化和数据驱动的转型。

您可能在日常生产设施的生产边缘找不到这些极端的例子。但是你会发现类似的挑战性情况。在工业生产中,运行中的环境和机器所造成的威胁无处不在。自主或准备成为自主机器人的舰队每天都在增长。

你有机器人手臂,行走和驾驶自动车辆,以及执行各种任务的飞行器。它们分为自动导向车(AGV)、无人驾驶地面车(UGV)、漫游者、自主水下车(AUV)、遥控水下车(ROV)、自主翻斗车、自主拖运或采矿车、无人驾驶飞行器(UAV)或无人机。

这些机器人以多种形式出现,以提高效率和成本效益。他们可以完成员工无法完成的任务。可能这些任务只是普通的长时间轮班,或者他们可能在更恶劣的环境中工作。他们可以随时随地根据需要进行检查。

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

通过 Zyfra 矿业LinkedIn

一切都会联系起来

工业数据科学的第二大应用是整个企业中数据的连接和聚合。收集的所有传感器数据都将存储在一个大数据湖中。在工业物联网的帮助下,可以创建一个像生命体一样运行的网络。这里,无线和有线数据连接面向物理世界。电缆、交换机、路由器和网关需要坚固耐用。它们需要能够承受灰尘、振动、雾和水,以及更危险和有害的物质和物理效应。它们必须是可靠的,并且应该能够在没有维护人员帮助的情况下运行多年。

新的工业数据科学也面临着集成安全性和安全性的挑战。许多遗留系统多年来一直以微调的方式运行。他们为在极端条件下的出色表现提供解决方案。他们的优化过程已经持续了一年。因此,新的工业数据科学不应危及这一已实现的平衡。另一个问题是数据和操作安全性。一旦生产设施连接到全球互联网,攻击者理论上就可以进入系统。由于重工业的价值和风险非常高,这是另一个极端的现实。

现有的数据是坏的和破碎的

在建立工业数据科学时,用于创建智能建议和预测的数据源面临问题。工业环境中需要的大量数据是时间序列数据和在恶劣环境中收集的数据。这意味着单个数据点可能不可靠。由于环境条件,传感器本身可能提供不精确的值。

我们可以称之为工业大数据的“3B”。当你开始一个新的工业数据科学项目时,你需要意识到这些问题。

第一个 B 是坏的。大多数工业数据都有明确的物理意义。它需要无数的传感器来检测空气、流量或运动速度。各种噪音、湿度、泄漏或水平都是可以获得的。每天高达数百万亿字节的运动数据。由于物理测量,所有这些数据的质量都可能很差。与数字系统内部收集的数据(如在线购买和客户数据)相比,这些数据在使用前需要彻底清理。此外,很难通过数据的数量来提高质量。

第二个 B 代表坏掉了。用于训练数据科学模型以提出预测和建议的数据没有明确的健康状态。没有指示工作条件的故障模式或更高级别的数据抽象。这可能会在 ML 系统的实现中导致大量的假阳性和假阴性。

第三个也是最后一个问题 B 是背景。在复杂的工业环境中,传感器数据的解释需要领域专家的大量经验。新出现的模式可能非常短暂,它们需要专业知识来解释。仅仅通过收集的数值数据来训练数据科学模型是非常困难的。

解决身体上的挑战

要解决工业数据科学中存在的挑战,一种方法是了解工业运营的具体情况。人们不应关注现成的数据科学解决方案,而应关注现成的工业解决方案。面向工业物联网的加固型组件和设备已经上市。由于许多传感器可通过现有的设置获得,数据的收集发生在现有的控制系统层面。SCADA 系统和工业机器人和机器提供了要捕获的数据。在这里,专门的 IIoT 网关将数据传送到 ML 系统。这些额外的网关不会干扰现有的控制系统。

要完成数字化转型,人才是最重要的因素之一。为了保持低成本和管理新的网络,与主题专家的合作是必由之路。这些专业人员需要了解行业的具体情况和工业数据科学。他们帮助选择正确的硬件和概念。

做出正确的选择

极端条件不仅是对身体要求苛刻的环境,也是其他行业丰富资源的短缺。由于电力供应、网络基础设施和互联网连接方面的问题,需要阐述行业特定的概念。当连接不稳定和不可靠时,可以选择不依赖于连续网络连接的解决方案。电池供电的 IIoT 解决方案,电池寿命长达数年,功耗超低。边缘计算在设备内部提供自动推理和聚合,无需不间断地连接到数据中心系统。

ML 模型将在工业物联网基础设施设计良好的极端条件下工作。普通 IoT 和 IIoT 之间的差异需要解决。尽管物联网和 IIoT 有着共同的目标,但实施策略的基本要求却大相径庭。由于电力和连接挑战,工业物联网需要更加关注可靠性和鲁棒性。

本文最初发表于 AiThority

如何用 Python 制作 Instagram Unfollower 工具

原文:https://towardsdatascience.com/how-to-make-instagram-unfollower-tool-with-python-ac04b6b05251?source=collection_archive---------3-----------------------

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

照片由 Unsplash 上的 Georgia de Lotz

根据 2018 年 6 月的统计数据,我自己是一个很大的 Instagram 用户,据谷歌称,其他 10 亿人也是如此。

在使用 Instagram 和他们的“关注者”系统时,你肯定有过关注某人的时候,并想知道他们何时以及是否会关注你。

现在有了强大的工具和编程语言,我们可以创建简单的脚本来检查谁没有跟着我们。

这是 Python 的一个非常简单的用法,你不需要任何特殊的或者相当惊人的技能来和我一起做这件事。我们将一步一步地走下去,从头开始建设一切。

让我们直接投入进去吧!

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

照片由丹尼尔·里卡洛斯Unsplash 上拍摄

编码

规划流程

构建这样一个工具需要几个步骤,首先,我们必须了解如何获得我们想要的东西。这是我们进入 Instagram 欢迎页面的地方。

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

Instagram 欢迎/登录页面

它相当简单,我们有登录/注册按钮。我们将使用这些来登录我们的个人资料。我们将自动化这个工具,以便它点击、填写电子邮件、密码并让我们登录。之后,我们将得到我们需要的数据。

在我们登录之前,你需要确保没有为 Instagram 设置双因素认证

设置环境

你必须安装一个 ChromeDriver ,这将使我们能够操纵浏览器,并向它发送命令以供测试和使用。

打开链接并下载适用于您的操作系统的文件。我推荐最新稳定版,除非你已经知道自己在做什么。

接下来,您需要解压缩该文件。我建议进入文件,通过右键单击手动操作,然后单击“Extract here”。

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

在文件夹里面,有一个名为“chromedriver”的文件,我们必须将它移动到你电脑上的特定文件夹中。

打开终端,键入以下命令:

**sudo su** #enter the root mode
**cd**      #go back to base from the current location
**mv /home/*your_pc_name*/Downloads/chromedriver /usr/local/bin** 
#move the file to the right location

请插入您的实际电脑名称,而不是您的电脑名称

完成后,我们打开编辑器。我个人选择的是 Visual Studio 代码。它简单易用,可定制,并且对你的计算机来说很轻。

打开一个新项目,创建两个新文件。这是一个我的看起来能帮助你的例子:

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

VS 代码设置

在 VS 代码中,有一个“Terminal”选项卡,您可以使用它打开 VS 代码中的内部终端,这对于将所有内容放在一个地方非常有用。

当你打开它时,我们还需要安装一些东西,那就是虚拟环境和用于 web 驱动程序 selenium。在您的终端中键入这些命令。

pip3 install virtualenv
source venv/bin/activate
pip3 install selenium

激活虚拟环境后,我们就完全准备好了。

创建工具

我们将把它创建为一个类,并为它创建函数。所以我们开始吧!

用任何名字创建你的工具并启动 Chrome 的驱动程序。我们还传递用户名和密码,这样我们就可以使用从另一个文件导入的它们。

*from* creditentials *import* username, passwordclass InstaUnfollowers:
  def __init__(self, username, password):
    self.driver = webdriver.Chrome()

这就是我们开始发展所需要的一切。现在转到您的终端并键入:

python -i unfollowers.py

这个命令让我们把我们的文件作为一个互动的游乐场。浏览器的新选项卡将会打开,我们可以开始向它发出命令。
如果你想试验,你可以使用命令行,而不是直接输入到你的源文件中。而且只是用 bot 代替 self

对于终端:

bot = InstaUnfollowers()
bot.driver.get('https://instagram.com/')

现在来看看源代码:

self.driver.get('https://instagram.com/')

现在,我们转到 Instagram 的欢迎页面,接下来我们需要登录。我们检查元素(键盘上的 F12)并复制元素 XPath。

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

接下来,我们必须发出命令来为我们单击那个按钮。

log_in = self.driver.find_element_by_xpath("//a[contains(text(), 'Log in')]")log_in.click()

我们通过 XPath 找到包含文本“Log in”的链接,并使用 click ()函数单击找到的链接。

单引号(')是我的 XPath,如果你在做其他网站,你必须调整你的 XPath。我还将向您展示 XPath 的更多用法。

在登录页面,我们必须像这样填写数据:

username_type = self.driver.find_element_by_xpath("//input[@name=\"username\"]")username_type.send_keys(username)password_type = self.driver.find_element_by_xpath("//input[@name=\"password\"]")password_type.send_keys(password)

再次使用 XPath,这次我们使用 send_keys ()函数将文本输入到字段中。

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

一旦我们完成了从登录开始的所有工作,是时候看看谁没有跟踪我们,所以我们必须比较追随者和跟随。

这是一个有点棘手的部分,但你会管理:

def get_people(self):sleep(2)scroll_box = self.driver.find_element_by_xpath("/html/body/div[4]/div/div[2]")prev_height, height = 0, 1*while* prev_height != height:prev_height = heightsleep(3)height = self.driver.execute_script("""arguments[0].scrollTo(0, arguments[0].scrollHeight);return arguments[0].scrollHeight;""", scroll_box)links = scroll_box.find_elements_by_tag_name('a')names = [name.text *for* name in links *if* name.text != '']close = self.driver.find_element_by_xpath("/html/body/div[4]/div/div[1]/div/div[2]/button")close.click()*return* names

这段代码专门用于使用存储所有关注者的滚动框,它会自动滚动它,当它结束时,它会将所有的名字存储到列表中。

我使用 sleep()函数,它让我将进一步的执行暂停一段时间,因此 sleep(1)将暂停 1 秒钟。你必须在代码的开头导入它。

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

当我们同时拥有关注者和关注列表时,我们只需比较这两者并打印结果。使用 Python,这相当简单:

not_following_back = [user *for* user in following *if* user not in followers]print(not_following_back)

基本上就是这样。

这里有一个简短的视频,展示了这个脚本实际上是如何工作的:

作者在 Youtube 上的教学视频

这是我的 GitHub 页面上的完整代码:

[## lazargugleta/instagramUnfollowers

在 GitHub 上创建一个帐户,为 lazargugleta/instagramUnfollowers 的发展做出贡献。

github.com](https://github.com/lazargugleta/instagramUnfollowers)

我们完了!

用法说明

你可能想知道为什么你会使用这种方式来检查 Instagram 的粉丝,而不只是从商店下载应用程序?
嗯,有一个很好的原因,那就是 Instagram 很快就会关闭它的 API,那些相同的应用程序将不再能够这么容易地做到这一点。
如果你不知道 API 是什么,API 或应用程序编程接口是一组允许创建访问操作系统、应用程序或其他服务的功能或数据的应用程序的功能和过程。

小心不要过度使用这个脚本,让你自己因为太多太频繁的登录而被禁止。(我从没遇到过,但要小心)

后续步骤

您可能希望将这个脚本提升到下一个级别,并且您可以对它进行多种修改。

也许可以自动观看故事(如果你真的不在乎任何人发布什么),或者收集其他数据,如喜欢和评论,并观察这些变化。

在那之前,关注我获取更多!

感谢阅读!

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

媒体上跟随我

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

在推特上关注我

如何让测度理论对你的问题有用?

原文:https://towardsdatascience.com/how-to-make-measure-theory-usable-for-your-problem-d33f7a848c7d?source=collection_archive---------9-----------------------

深入研究勒贝格测度和概率分布

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

所有图片均由作者创作

一天晚上,一位数据科学家、一位工程师和一位数学家在酒吧相遇。

他们互相抱怨工作中的问题。

工程师说,“我有一个巨大的形状奇怪的容器,我需要知道它的体积。当然,我想做一件显而易见的事情,将整个容器装满水,然后称重以得到体积。遗憾的是,由于所有的密封和昂贵的材料,这是一个有点昂贵的设置。这就是为什么我的老板拒绝了这个想法。要是他能拒绝自己的年度奖金就好了……不管怎样,现在我必须用盒子填满整个容器,并估算出大致的结果。”

“那不是很不准确吗?我的意思是你如何填满所有的角落?”数学家问道,他对这种实用性的想法感到不安。

“也许吧,但应该足够好了。如果没有,我可以试着用电脑模拟,这样我可以更精确地估算容器的体积。”

"计算机是如何做到这一点的?"数学家插嘴说。

“有了计算机,我可以把小得多的盒子放进集装箱里,并且可以尽可能接近集装箱,”工程师回答道。

数学家很不服气地问,“但是当你减少容器中盒子的体积时,你怎么知道你的这种近似真的变好了呢?”如果你一直重复这个方法,你真的会得到容器的真实体积吗?这听起来很像是从有限逼近到无限逼近的过渡。这种情况下允许吗?”

“嗯,从技术上讲,计算机不能无限工作。娱乐你的想法。如果我没理解错的话,你是在问:如果我反复减小放入容器的盒子的大小,并总是尽可能多地装满容器,我的近似值是否接近容器的真实体积,对吗?”

“差不多,”数学家澄清道。“如果你永远这样做,或者更好地说(可数地)无数次,会发生什么。箱子的总体积接近集装箱的真实体积吗?我是说考虑一下。也许容器中有圆形部分。没有一个盒子能真正容纳整个体积。当然,你可以把盒子变小,放更多的盒子进去。但是不管你减少多少次你的盒子的大小,它们仍然不能完全捕捉到圆形。那么,如果你真的这样做了无数次,会发生什么呢?无限小的盒子能捕捉容器中的圆形和其他奇怪的角落,并给出容器体积的正确值吗?”

“听起来很数学,”工程师微笑着说。“我相信它会起作用的。只是从视觉上来说。但你是数学家。你告诉我。”

“嗯,你说得对。这正合我的胃口。让我在那上回复你。我确信测度论能以某种方式帮助回答这个问题。”

让数学家去思考,数据科学家开始说话,“你们不会相信我今天做了什么。你还记得在统计课上,我们总是要计算一个人的身高在两个值之间的概率吗?你猜怎么着。事实上,我今天不得不这么做。”

“没门。这位工程师感叹道:“我一直认为这些例子太过牵强。

“正是我所想的。当我们的统计学教授选择这个例子时,他们发现了一些事情。所以今天我重新计算了一下,感觉很怀旧。我甚至拿出我的旧标准正常 cdf 查找表来确定概率。”

“不错。我也会完全做同样的事情,”工程师同意道。

“哦,我记得,”数学家说。“难道不奇怪吗,我们可以积分这样的密度函数,并从中获得有效的概率测量。我是说,这怎么可能呢?”

“你总是带着你的问题,”工程师微笑着说。

“为什么不会呢?”数据科学家继续说道。“我的意思是对整个密度的积分是 1,部分积分总是返回 0 和 1 之间的值。对我来说,这似乎是一个显而易见的事情。”

“对于这样简单的应用,我同意,”数学家说。“但是你难道没有用它来做更多的事情吗?让我们以两个独立随机变量乘积的期望值为例。”

“但这只是个人期望值的产物,”数据科学家插话道。

“对。证明使用 Fubini-Tonelli 将两个随机变量乘积的期望值分割成单个随机变量的期望值。但是作为一个要求,这两个随机变量必须遵循一个真实的测度——理论上的概率测度。但是为什么密度函数的积分定义了一个恰当的测度——理论上的概率测度?”

“嗯……奇怪,”数据科学家说。“我以前从未想过这个问题。难道那个问题不会适用于几乎所有概率论的结果吗?”

“没错。”

“这么重要的一个细节在我的任何一次讲座中都没有提到,这难道不奇怪吗?”数据科学家沉思道。

“告诉你,”工程师对数学家说。“你为什么不花一天时间去寻找这些问题的答案呢?然后你可以告诉我们盒子是否真的可以近似圆形,以及为什么对密度函数的积分真的可以产生合适的概率度量。”

“这是一个伟大的想法,”数据科学家说。“我对这个答案很感兴趣。让我们进一步激励他。如果你能以一种可以理解的方式向我们解释,下次我们会为你的饮料买单。”

这个挑战让数学家很高兴,他离开了朋友,回到了家。

在桌前坐下后,数学家首先看他对测度论的预感是否能帮助解决他的两个问题。

为此,他打开他那本积满灰尘的旧测量理论书,开始阅读。

过了一段时间,数学家找到了两个无限逼近方案,肯定地回答了这样一个问题:如果工程师的容器可以用无限多个盒子来逼近。

  1. 第一个方案类似于工程师提出的方法。在这种方法下,人们需要找到一种方法,将越来越多的简单对象添加到容器中,并在无数次重复后填满整个容器。那么,测量理论保证了这些无限个体的体积之和等于整个容器的体积。这意味着,如果工程师能找到无限的策略来精确计算容器的体积,这是可能的。
  2. 或者,工程师也可以将整个容器装入一个盒子中,并开始凿出小形状。如果他在无数次移走物品后又找到了揭示容器的方法,那么他可以通过从装箱体积中减去无数次移走的体积来精确地计算出容器的体积。

这些方法只有在盒子测度是测度论定义下的恰当测度时才有效。

遗憾的是,通常不可能直接证明测度论测度的性质。一个合适的测度——理论上的测度必须能够测度无限大范围的物体。此外,它必须满足某些属性。除其他外,它必须完成上述计划。

幸运的是,测度论提供了一种方法来将简单的测度扩展为适当的测度——以一种合理的方式满足所有这些性质以及更多的性质的理论测度。

下面的列表描述了要使一个简单的候选度量成为一个合适的度量(理论度量)需要证明什么。

  1. 需要一个集合(没有任何属性)。
  2. 需要在集合上定义候选度量,这些集合是 1 中集合的子集。只有。
  3. 候选测量值需要总是大于或等于零,但可以是无穷大。
  4. 空集需要是可测的,并且它的测度必须等于零。
  5. 如果两个集合可以由候选测度来度量,那么它们的交集也需要由候选测度来度量。
  6. 如果我们把一个可测集从另一个可测集中去掉,那么这个新的可测集一定是可写的,它是有限多个互不相交的可测集的并集。注意,新的集合不需要通过我们的候选度量来度量。
  7. 如果两个可测集是不相交的,即两个集中都没有点,并且两个集的并集具有由候选测度定义的测度,那么并集的测度必须与两个单独集的测度相加相同。
  8. 1 中的集合。必须可写为可测集的(可数)无限并集,其单个测度不是无限的。
  9. 作为任何(可数的)单独可测集的无限联合的子集的任何可测集的测量值必须小于或等于单独测量值的无限和。

为了从盒子体积的测量理论中得到好处,数学家开始研究清单。

作为第一步,他从数学上定义了他的盒子测度。

三维的盒子可以写成一个集合:

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

其中 w₁ ≤ w₂,h₁ ≤ h₂,d₁ ≤ d₂都是实数。

要计算立方体的体积,只需将盒子的宽度、高度和深度相乘。

宽度:= w := w₂ - w₁
高度:= h := h₂ - h₁
深度:= d := d₂ - d₁

体积测量用 λ 表示,以纪念数学家勒贝格。

因此,我们的数学家也将使用 λ 来进行盒测量。

他对盒子体积的度量提出了如下定义。

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

然后,他继续检查清单上的项目,寻找他的盒子尺寸。

1.基本集合是三维实数的集合。

2.根据定义,每个盒子都是该集合的子集。

3.每个盒子的体积都大于或等于零。

4.他的定义目前还不能度量空集。4.要求空集需要有一个体积为零的盒子,即 λ ({}) := 0。这是有意义的,因为空集可以被看作是不测量任何东西的体积。

5.他需要证明两个盒子的交集也是一个盒子。

如果两个盒子不重叠,它们的交集就是空集,他现在可以测量它。

如果两个盒子重叠,不难想象它们定义了一个新的盒子。

更精确一点。对于任意两行,以下为真。

[a₁,a₂] ⋂ [b₁,b₂] = [max{a₁,b₁},min{a₂,bₙ}]

这对于三维的交叉点也是如此。这清楚地表明,两个盒子的交集确实是一个新盒子。

6.这里他需要证明,如果他从另一个盒子中去掉一个盒子,剩下的盒子可以写成有限多个不重叠的盒子的并集。

遗憾的是,他目前的方法发现了他的定义中的一个问题。看下面的例子,他意识到了自己的错误。

[1,3]³[2,4]³ = [1,2)³

根据他的定义,这不是一个有效的盒子,因为他将盒子定义为封闭的盒子。

幸运的是,他提出了一个简单的解决方案。他只是定义了一个左开右闭的盒子

b:=(w₂w₁]×(h₂h₁]×(d₂d₁)

并且保持他的盒子测度的定义不变。

有了这个定义,以前的问题就解决了:

(1,3]³(2,4]³ = (1,2]³

在这种情况下,从另一个盒子中移除一个盒子会产生一个有效的新盒子。

在正式测试了如何将一个盒子从另一个盒子中移除的各种组合,并看到新的对象都可以写成其他盒子的有限并集之后,他证明了 6。是真的。

不幸的是,数学家现在必须重新检查之前的 5 项。幸运的是,同样的论点也适用于新的盒子定义。

7.他需要证明两个不相交的盒子的并集(即盒子本身)的体积与两个盒子体积之和相同。

这很容易。合并两个不相交的框只能成为一个有效的框,如果它们可以在一个面上融合而没有任何重叠。这意味着三个维度中的两个(宽度、高度、深度)保持不变。不失一般性地假设盒子共享相同的宽度和高度配置。他得到了两个这样的盒子(⊍的意思是不相交的并集):

λ(b₁⊍b₂)= w h(d₁+d₂)= w hd₁+w hd₂=λ(b₁)+λ(b₂)

这也证实了。

8.在这里,他必须证明整个三维空间可以写成有限体积的盒子的(可数)无限联合。

幸运的是,这些盒子不必是分离的,它们可以包含自己。因此,他可以简单地从零附近的一个简单的盒子开始,让这个盒子在高度、宽度和深度上均匀增长。

形式上:

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

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

9.最后一步是关键的一步,它允许框度量与无穷大一起工作。

数学家必须证明,如果他有一个盒子被无限多个盒子以某种方式覆盖,那么被覆盖的盒子的体积小于或等于覆盖的盒子的体积之和。

形式上可以这样写。让

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

被装在盒子里

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

然后他必须表明:

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

要做到这一点,他必须建立更多关于盒测度的性质。

他必须证明如果一个盒子包含在另一个盒子里,那么外盒子的体积比内盒子的大。
这直接来自于盒子体积的定义。

使用测量理论,他可以从(I)和 1 得出结论。— 7.如果盒子 B 仅被有限多个盒子覆盖,那么盒子的体积小于或等于有限多个盒子的体积之和。显示除 1 之外的(I)。— 7.保护任何其他基本度量候选的该属性,并且不限于框度量。

证据主要集中在 5 左右。和 6。
使用这两个属性,测度论者可以移除盒子并相交盒子,并获得原始盒子作为有限不相交盒子并集的表示。使用 7。然后,他们可以将这些单独的盒子体积相加来计算盒子体积。应用(I ),他们然后显示组合中的某些盒子必须位于(潜在地)覆盖盒子的更大的盒子中,由此他们可以得出结论,各个体积的总和必须更大。有点技术性,但幸运的是其他人已经做了这一部分。

(iii)
现在他知道了对于有限多个盒子来说这个断言是正确的,数学家现在试图将覆盖从无限多个盒子减少到有限多个盒子。

为此,他必须使用拓扑学中的一个常用技巧。他稍微缩小了内盒,使它更紧凑。与此同时,他稍微扩大覆盖盒,使它们打开。然后他有一个由无数个打开的盒子组成的紧凑盒子的盖子。由于内盒的紧性,他然后从紧性的(拓扑)定义中知道,有一种方法可以从那些仍然覆盖紧内盒的无限多个盒子中选择有限多个盒子。

由于盒子体积的连续性,他可以控制紧凑的内盒与真正的内盒有多近,以及外部开口盒与覆盖盒有多近。因此,他可以将问题从无限多个覆盖盒简化为他知道(见(ii))该要求为真的有限多个覆盖盒。

更正式地写下来。让

B := (a,b] := ( a₁,b₁ ] × ( a₂,b₂)×(a₃,b₃)

类似地

Bₙ := (aₙ,bₙ):=((aₙ)₁,(bₙ)₁)×((aₙ)₂,(bₙ)₂))×((aₙ)₃,(bₙ)⃉]

因此,他希望选择δ和δ(n)使得:

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

他选择

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

是相等分量大于零的三维向量。

根据紧性的定义,他得到:

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

其中 K 是自然数的有限子集。

“长方体测量”仅允许计算左侧打开和右侧关闭的长方体的体积。但这很好,因为(a + δ,b)⊂[a+δ,b],和

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

因此

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

如同

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

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

在 d 中是连续的他可以使体积任意接近

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

通过控制 ddₙ

总的来说,对于任意的ε0,他得出如下结果:

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

现在他让 ε 趋近于零,他完成了清单的验证。

由于盒体积测度满足所有需要的性质,它可以唯一地扩展到所有"Borel-measured "集合的体积测度。
实际上,这意味着,任何现实生活中的物体的体积都可以使用上面两个方案概述的无限盒子的巧妙覆盖来精确测量。

在一些简单的线性代数的帮助下,可以证明体积在可逆矩阵变换下表现良好。
一个集合的每一点乘以一个可逆矩阵,得到一个物体,其体积与原体积乘以矩阵行列式的绝对值相同。使用它,现在只要知道原始体积,就可以非常简单地计算在任何维度上翻转、旋转或拉伸的任何变换对象的体积。这就是为什么一个球的体积随着半径的增加而立方增长。

度量理论保证的性质还有很多,跳过前 50-70 页后,可以从任何度量理论书籍中找到,因为它们大部分都包含了必要的证明,从而允许检查一些性质的过程。

走向数据科学家。数学家想要检查连续密度函数上的积分是否真正定义了测度论概念下的概率测度。为此,他将再次检查清单。第二次迭代会快得多,因为核对表的最后一个属性几乎与盒子度量的证明相同。

他首先定义了他想提升到测度论世界的基本测度。

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

是连续的密度函数。

然后,候选概率度量被定义为

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

随着

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

这一次,数学家直接定义了在第 6 项中左开右闭的基本对象。

他又来了。

1.基本集合是所有实数的集合。

2.这些集合都是实数的子集。

3.)由于中值定理

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

对于 x₀ ∈ (a,b)当 f 是连续的。

4.根据积分的定义,它遵循 P ({ }) = 0

5.和之前一样(a,b] ∩ (c,d] = (max(a,c),min(b,d)]这是在 P 的定义域内。

6.正如预期的那样,(a,b] \ (c,d)也在 P 的定义域内,因为它总是(x,y)形式的区间。
查看有四个容易检查的案例。

7.因此,积分是独立于划分的(⊍意味着不相交的并集)

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

8.和以前一样,实数可以写成一个并集

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

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

9.这个证明类似于勒贝格测度的证明。

当 f 大于或等于零时,积分是单调的。
从测度论中,我们知道,对于有限的和,这个要求是正确的。

微积分的基本定理表明

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

是可微的,因此在任何区间[a,b]都是连续的。

由此得出结论,区间(a,b)和(aₙ,bₙ)可以以可控的方式收缩和扩张,以创建一个紧集和一个开集的无限覆盖,对于这些开集必须存在一个有限覆盖。这样,无限索赔可以简化为一个有有限多个被加数的问题。

然后,使用与之前相同的计算方法进行索赔。

因为 f 是密度函数,我们知道

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

因此,P 可以扩展为测度论保护伞下的概率测度。因此,概率论和测度论的所有定理都适用于从密度函数得到的概率测度。

在找到问题的答案后,数据科学家、工程师和数学家再次在酒吧见面并点了饮料。

"你找到昨天那些问题的答案了吗?"工程师问数学家。

“是的,我做到了。这位数学家回答道:“我创建了一个简单的属性清单,需要对这些属性进行检查,以使一个候选测度成为测度理论框架下的一个适当测度。”。

“很好,”数据科学家说。“我想你已经检查过清单来回答这两个问题了吧?”

“没错,”数学家热情地表示同意。“我首先从一个简单的盒子体积测量开始。在检查清单时,我不得不两次修改我的定义,但最终,我能够证明清单中的属性。因此,如果你可以无限细化你放入容器的盒子,确实有可能精确计算出容器的体积。”

“很好,”工程师回答。“所以无限不再是一个问题了?”

“可数不定式不是。然而不可数不定式是另一个问题。对了,我还找到了另一种解决集装箱容积问题的方法。”

“我总是乐于接受可行的想法,”这位工程师大声说道。

“这个是可行的,”数学家继续说道。“除了用盒子填满容器,你还可以把容器放在盒子里,用小盒子填满容器和外盒之间的空间。最后,你可以简单地从外部盒子体积中减去单个盒子的体积。”

“等等,听起来是个好主意!今天我的老板否决了用盒子装满集装箱的想法。里面的材料显然太有价值了。你的想法解决了那个问题。我怎么没想到呢!?让我去找我的老板,把这个想法告诉他。谢谢!”说完,工程师离开了酒吧。

“我很久没见他这么兴奋了,”这位数据科学家笑着说。“那么你对分布函数有什么发现?你重复使用你的清单了吗?”

“是的,”数学家解释道。“更好的是,我可以将最具挑战性的证明几乎完全复制到分布函数中。这也使得检查清单变得非常简单。这里看一看。”

数学家将笔记交给数据科学家,数据科学家开始检查笔记。

“等一下,”数据科学家说。“这太直观了。利用紧致性将无限个被加数减少到有限个是非常聪明的。等一下。也许我可以用这个技巧来解决困扰我一整天的工作问题?我得去检查一些东西。干得好,你做得很好。回头见。我得走了。”

“等等,”数学家说,但是已经太晚了。他的两个朋友已经离开了酒吧。酒保正走向他的桌子。他为什么要把钱包留在家里?

[1]阿奇姆·克兰克,瓦赫尔斯·谢林凯茨理论(2020),施普林格

如何使 Python 成为静态类型——基本指南

原文:https://towardsdatascience.com/how-to-make-python-statically-typed-the-essential-guide-e087cf4fa400?source=collection_archive---------4-----------------------

类型提示、变量注释和强制运行时类型检查——您需要知道的一切。

Python 是一种动态类型语言——我相信你知道这一点。这对初学者来说既简单又有趣,因为不需要考虑数据类型。尽管如此,静态类型还是有一些好处。今天我们将探索如何使 Python 尽可能静态化。

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

弗洛里安·克拉姆Unsplash 上的照片

不想看书?请观看相关主题的视频:

那么,动态类型语言是怎么回事呢?简单地说,这意味着没有代码编译,所以 Python 解释器在代码运行时执行类型检查。因此,允许在整个应用程序中更改变量类型。

这听起来像是一种优势,但是随着代码库变得越来越大,这可能会导致奇怪且难以跟踪的错误。

另一方面,静态类型语言在编译时执行类型检查(想想 CJava )。此外,它们给了您一些安全感,因为您可以立即判断每个函数的参数类型。

在我们开始之前,有一个简短的声明——Python 将永远是一种动态类型的语言。你不能像 Java 或 c 一样把它变成静态的,因为 PEP 484 引入了类型提示,所以我们必须利用它。

这篇文章的结构如下:

  • 类型提示
  • 可变注释
  • 表示更高级的数据类型
  • 在运行时强制类型检查
  • 结论

类型提示

类型提示仅仅是提示。它们向您展示了预期的数据类型,但是没有什么可以阻止您忽略它们。我们稍后将探讨如何通过 Python 解释器强制进行类型检查,但让我们先来看看基础知识。

让我们做一个没有类型提示的例子。下面是一个将两个数相加并返回总和的函数。Python 就是 Python,我们不必为参数或返回值指定数据类型:

函数调用的打印结果分别为 1515.3BobMark 。要引入类型提示,我们必须执行以下操作:

  • 对于参数-将冒号(:)放在参数名称的右边,并在后面指定数据类型
  • 对于返回值-将箭头符号和数据类型放在括号的右边

下面是如何给我们的sum_numbers函数添加类型提示:

这个函数现在看起来更清楚了,但是我们仍然可以传递任何数据类型——表明提示只是提示,而不是义务。

根据 PEP 8,以下是类型提示建议:

  • 对冒号使用常规规则,即冒号前没有空格,冒号后有一个空格
  • 将参数注释与默认值结合使用时,请在=符号周围使用空格
  • 在->箭头周围使用空格

稍后我们将看到如何强制类型检查。

可变注释

我们还可以为变量提供类型提示。同样,这些只是提示,并不影响代码的运行。

下面是一个如何向变量添加类型提示的快速示例:

没有什么可以阻止你给变量age赋值 32.95,或者给is_premium赋值 no。暗示只是表示不应该。

表示更高级的数据类型

到目前为止,我们所介绍的一切都很好,但是如果您想声明一个字符串列表或一个键和值都是字符串的字典,该怎么办呢?

这就是typing模块发挥作用的地方。有了它,您可以使用任何更复杂的数据类型,比如列表、字典和元组。您也可以声明自己的数据类型,但这已经超出了今天的范围。

现在让我们使用typing模块来声明一个名字列表,然后是一个电子邮件字典,其中每封电子邮件都属于一个名字。在所有情况下,数据类型都是字符串:

冗长多了,但感觉更安全。更进一步,让我们看看如何使一个函数参数成为一个整数列表。这很简单:

您现在知道了如何使用类型提示来声明任何数据类型的变量,但是如何在运行时强制进行类型检查呢?接下来让我们来探索一下。

在运行时强制类型检查

我不知道在笔记本环境中有什么强制类型检查的方法——所以我们将切换到脚本。我做了一个名为static_typing.py的文件,但是你可以随意命名你的文件。

在继续之前,我们必须安装一个名为mypy的库。它用于在运行时强制进行类型检查,这正是我们所需要的。要安装它,从终端执行pip install mypy

我们现在可以走了。static_typing.py脚本包含以下代码:

从终端,以传统方式执行脚本——通过编写python static_typing.py

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

图 1 —不带 mypy 的执行(作者图片)

代码将运行而不抛出错误。这相当于我们之前在笔记本中所做的。但是我们不希望这样。使用mypy,我们可以强制进行类型检查。从终端执行以下命令:mypy static_typing.py:

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

图 2 —使用 mypy 执行(图片由作者提供)

如你所见,程序崩溃了。这正是我们想要的行为,因为函数需要两个整数,但是我们没有在函数调用中提供数据类型。

这就是开始时你应该知道的。让我们在下一部分总结一下。

离别赠言

让我们以使用类型提示的利弊来结束这篇文章。

优点:

  • 它们有助于记录您的代码——但不能代替 docstrings
  • 出于显而易见的原因,它们有助于维护一个更干净的代码库
  • 它们改进了代码编辑器的林挺功能——例如,如果检测到类型不匹配,PyCharm 会显示警告

缺点:

  • 添加起来可能会很乏味,尤其是如果您不习惯它们的话

总结一下——类型提示不是必需的,但却是很好的实践,尤其是在处理大型代码库时——即使你决定不使用mypy

你对类型提示有什么想法?您是一直使用它们,还是只是在代码库变大时才使用它们?请在下面的评论区告诉我。

加入我的私人邮件列表,获取更多有用的见解。

喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。

[## 通过我的推荐链接加入 Medium-Dario rade ci

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@radecicdario/membership)

原载于 2020 年 11 月 7 日 https://betterdatascience.com

如何让远程工作对数据科学团队有效

原文:https://towardsdatascience.com/how-to-make-remote-work-effective-for-data-science-teams-e784dee2f208?source=collection_archive---------23-----------------------

团队成员、经理的想法和帮助您提高效率的工具

1973 年,在石油输出国组织石油危机和燃料价格飞涨的高峰期,美国宇航局科学家和南加州大学教授杰克·奈尔斯开始思考不需要通勤就可以完成工作的方法。尼尔斯的思想实验演变成了案例研究,无数的书籍,包括关于远程办公的原著,以及数十篇论文、文章和主题演讲。直到今天,Nilles 仍然是远程工作作为传统办公室的可行替代方案的主要倡导者之一。

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

两家不同公司远程办公的组织演变,来自电信运输权衡(Nilles)。

今天,认为尼尔斯的早期作品《透视》并不完全是夸张的。在过去的十年中,采用远程工作人员的公司急剧增加。由 Flexjobs 和 Global Workplace Analytics 汇编的一份 2019 报告发现,从 2005 年到 2017 年,美国远程办公的人数增加了 159%。随着围绕新冠肺炎的全球危机迅速发展,迫使越来越多的公司采取严格的在家工作政策,远程工作正进一步巩固其作为一种工作场所范式的地位,值得认真对待。

数据科学行业也不例外。就完全或部分远程工作的员工比例而言,大型计算机、IT 和软件开发行业属于增长最快的行业。远程工作的好处是有据可查的:Buffer 和 Angellist 发布的一份联合报告——对 3500 多名远程技术人员的调查——发现灵活的时间表、在任何地方工作的能力以及不用通勤是远程工作最有吸引力的好处。

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

Buffer 和 AngellistReport

尽管有这些好处,但部署这些系统以提高远程团队的效率和生产力并不容易。协作和沟通等简单的事情变得具有挑战性。员工更容易感到孤独、心烦意乱,或者觉得工作日永无止境。在数据科学团队中,行业最佳实践仍在成型,这些问题可能会更加突出。

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

缓冲区和 Angellist报告

这篇文章旨在强调一些在家工作的最佳实践,包括一般的和特定于数据科学的,以帮助数据科学家和团队在远程工作时保持生产力、联系和快乐。

数据科学团队成员的最佳实践

创建高效的工作空间

有一个专用的工作空间(阅读:不是你的床)。让你的手机远离你的工作场所,只在休息的时候查看。一定要保持你的工作环境整洁——在一个凌乱的环境中工作会令人难以置信地分心。

确保和你的同事聊天——即使你没有必要这样做

安排一天打几个视频电话来保持理智,即使它们不是绝对必要的。其中至少有一个是与同事/朋友的非工作相关的“远程咖啡”。始终打开摄像头,尽量扩大视频通话窗口,让您感觉像在进行一场真正的对话。

工作习惯

在你的日历中划出不受干扰的工作时间、锻炼时间、午餐时间等等。鼓励你的同事也这样做。过度沟通并假设意图良好。一条快速更新的信息可以确保你的经理对工作的进展感到放心。与此相关的是,同意每天与你的队友保持联系的节奏——例如每天早上的站立会议。

有一个明确的“关闭时间”(与您的团队达成一致)—远程的最大风险之一是您永远不会关闭和停止工作,因此在这一点上要积极主动

远程管理数据科学团队的技巧

当考虑如何管理远程团队时,首先强调远程工作的主要优点和缺点是很重要的。

从高层次来说,作为一名经理,你的好处是你的团队有可能提高生产力,因为没有通勤,更少的分心(希望如此),和更多的时间专注。

缺点通常是沟通效率较低,合作机会较少。有些人可能会说,你也可以远程协作和交流,但正如任何经济学家都会告诉你的那样:没有免费的午餐。虽然远程团队确实有缺点,但是有一些非常好的策略可以让你最小化这些缺点。

利用远程工作的优势

首先,关注并发挥远程工作的优势。你刚刚得到了一个比以前更有能力专注的团队。用那个!为此,您需要执行以下操作:

  1. ****相信你的团队。如果你从如何管理好一个远程团队中吸取了一点经验,那就是:相信你的团队能够有效地工作,并合理地管理他们的时间。如果你花很多时间做更多的微观管理,你将会放弃远程工作的几乎所有好处。
  2. ****设定明确的期望。如果你能设定清晰的工作优先级,并设定可衡量的里程碑,你就能让你的团队投入工作并专注。在这一点上,在家工作可能是一个巨大的优势,因为希望更少的干扰和更多的时间来完成工作。

如果你能设定明确的期望,并相信你的团队能完成工作,远程工作会是一个优势。例如,你可以在一天开始时与团队一起检查,设定期望,然后让每个人去工作。

建立系统和流程来平衡不利因素

现在,让我们来讨论一下它的缺点。沟通与协作。当你知道需要做什么,并且能够独立完成时,专注的工作是很棒的。但是那些面对面合作的偶然时刻呢?你如何复制它?我认为你不能完全。面对面的交流和合作可能总是更好(因此,没有免费的午餐),但这并不意味着你不能最小化远程工作的缺点。为此,我建议如下:

  1. 视频交流。我们交流的很多方式都是非语言的,在通话中不打开视频会损害你的交流能力。
  2. 在会议中不要总是直奔主题。对于远程团队,你没有时间进行“饮水机”式的讨论。在适当的时候,花些时间开会,只是为了保持联系。
  3. ****安排远程友好的团队建设活动。“水冷却器”讨论应该每天进行,但我也建议每月进行一次活动,集中时间放松和了解对方。我的团队最喜欢的是黑手党
  4. 当接下来的步骤不明确,而您需要创造性的协作时,使用视频会议平台上的白板功能进行远程头脑风暴。不要只是参加一个虚拟会议,然后开始讨论想法。事先以书面形式发出目标,让人们单独进行头脑风暴,并将想法带到会议上,并允许每个人分享他或她的想法,然后进行讨论并确定优先顺序。这有时被称为无声头脑风暴,非常远程友好,往往更有效。
  5. ****培养一种彻底坦诚和心理安全的文化。你现在的一个弱点是沟通,因为你很偏远。确保你的文化在公开和诚实的反馈方面特别强大。正反都有!作为一名领导者,要在寻求、给予和接受反馈方面树立榜样。确保每个人在表达想法和发表意见时都感到安全。

这些步骤应该有助于在您的远程团队中建立友谊和信任,这两者对于强大的沟通和协作都是必要的。你无法享受面对面协作的偶然时刻,也无法享受人们共处一室时发生的会后讨论。

投资工具鼓励协作

你可以利用一些神奇的工具来提高沟通和协作的效率。

缩放

一个好的视频会议工具对于所有团队都是不可或缺的,尤其是远程工作的团队。我们每天使用 zoom 与远程团队成员开会。无论你选择什么样的视频会议工具,都要确保它易于使用,这样你的团队在和同事打电话时就可以尽量减少摩擦。

松弛

实时消息传递允许团队中的信息流动是临时的、对话式的和非正式的。这些都是至关重要的价值观,可以确保你保持你的团队能够轻松地、有机地、协作地开发创意。Slack 是一个流行且优秀的工具,允许团队这样做。

彗星

即使在同一个地方工作,数据科学团队也容易成为一群孤独的建模者。切换到远程,就更容易掉进这个陷阱。幸运的是,有工具可以让数据科学家、机器学习工程师或任何处理模型的人更容易地在分布式团队中实时记录、可视化、共享和重现他们的工作。Comet 提供了一个元机器学习平台,可在云中或本地/VPC 运行,允许数据科学团队这样做:重现完整的实验(而不仅仅是代码),管理大型分布式数据科学团队的用户,并为经理提供对团队贡献和绩效的洞察。

Comet 允许数据科学团队通过与许多用户创建协作项目来轻松管理分布式团队:

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

在 Comet 中添加合作者

如果您的团队是一个协作项目的一部分,每个数据科学家都可以在一个中心位置发布他们的实验,在这里可视化、比较、分析和调试团队范围的工作变得很容易,即使在远程工作时也是如此:

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

彗星项目页面

结论

随着新冠肺炎迫使许多团队进行远程工作,新远程团队的成员和经理们将很好地考虑如何充分利用他们的新远程办公。利用远程工作优势的团队将保持高效、沟通和快乐。此外,可以实施安全措施和流程来有效应对远程团队面临的许多常见挑战。帮你自己一个忙,今天晚些时候和你的一个同事安排一次 15 分钟的视频通话。这将是值得的时间。

本文与 Comet.mlNikolas Laskaris 共同发表。我是 Comet 的用户,他们没有为这篇文章付钱。

有兴趣了解有关 Python 数据分析和可视化的更多信息吗?查看我的课程

如何在 Tableau 中制作桑基图

原文:https://towardsdatascience.com/how-to-make-sankey-diagram-in-tableau-f5f8730e5962?source=collection_archive---------0-----------------------

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

桑基图是一种图表,我们可以用它来可视化一个度量在多个维度上的流动。桑基图是由爱尔兰船长桑基发明的,用来描述蒸汽机中的能量流动。

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

M. H. Sankey 在维基百科上的第一张 Sankey 图(CC-PD)

有几个用例适合用 Sankey 图来可视化。一些例子是:

  • 网站访问者行为
  • 用户转化
  • 交通模式
  • 产品分配

在这篇文章中,我将一步一步地介绍如何使用 Tableau Pubilc 创建一个 Sankey 图。对于没有 Tableau 的你,你可以使用这个链接免费下载 Tableau Public。

步骤 1 导入数据集

我们使用的数据源是 Superstore Dataset 和 tableau。我们可以通过连接 Microsoft Excel 并选择一个超级商店文件来导入它。

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

导入数据集

步骤 2 创建参数、尺寸和测量

在这一步中,我们将创建两个参数和三个计算字段。这些参数和计算字段将用于为用户提供选择 Sankey 两侧尺寸的能力。

首先,为“选择尺寸 1”和“选择尺寸 2”创建参数,设置如下。为此,我们可以创建选择维度 1,然后复制并粘贴它,并更改选择维度 2 的名称。

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

选择维度 1 的配置

其次,我们需要创建计算字段作为所选维度的占位符。我们需要为选择维度 1 和选择维度 2 创建它。

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

维度 1 计算字段

然后,我们将为我们选择的度量创建一个计算字段,并为此选择 Sales。

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

选择的度量计算字段

步骤 3:创建数据加密框架

在这一步中,我们将我们的测量值与测量值的固定最小值进行比较。通过这样做,我们可以确保我们帧之间的两个数据点。

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

路径框架计算字段

接下来,我们将划分 bin 大小等于 1 的路径帧,并为该路径创建索引。

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

为路径框架创建箱

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

路径框架箱设置

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

路径索引计算字段

步骤 4 设置图表曲线

我们需要制作两个计算字段,以便在我们的 Sankey 中制作一条曲线。我们将采用 sigmoid 公式来完成这项任务。执行此任务的计算字段如下所示。

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

步骤 5 桑基臂尺寸

此计算字段将每个 Sankey arm 作为完整数据集的百分比。

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

第 6 步顶线和底线计算

此时,我们需要创建八个计算字段。这些字段用于创建每个 Sankey 的顶部和底部。在这些计算中,位置 1 是指左侧的尺寸 1,位置 2 是指右侧的尺寸 2。

以下是顶部和底部的计算字段:

最大位置 1:

RUNNING_SUM([Sankey 臂长])

最大位置 1 包:

WINDOW _ SUM([最大位置 1])

最大位置 2:

RUNNING_SUM([Sankey 臂长])

最大位置 2 缠绕:

WINDOW _ SUM([最大位置 2])

最小位置 1 的最大值:

RUNNING_SUM([Sankey 臂长])

最小位置 1:

RUNNING _ SUM([最小位置 1 的最大值]-[Sankey 臂尺寸]

最小位置 1 换行:

WINDOW _ SUM([最小位置 1])

最大为最小位置 2:

RUNNING_SUM([Sankey 臂长])

最小位置 2:

RUNNING _ SUM([最小位置 2 的最大值]-[Sankey 臂尺寸]

最小位置 2 换行:

WINDOW _ SUM([最小位置 2])

WINDOW _ SUM([最大位置 2])

步骤 7 三键多边形计算

该计算结合了上述所有计算,并为 Sankey 生成多边形。

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

步骤 8 创建桑基表。

此时,我们已经创建了三个新的维度、16 个度量和两个参数。在这里,我们将使用所有这些来制作桑基。

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

首先,拖动路径框架(bin),尺寸 1,尺寸 2,作为标记中的细节。接下来,将 T 放入列中,并使用路径框架(bin)计算它,同时将 Sankey 多边形拖动到行中。然后将标记更改为多边形,并将路径索引添加到路径中,并与路径框架(bin)一起计算。最后,单击右下角的 96 nulls 显示所有 null 值。

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

现在我们需要编辑桑基多边形的表格计算。我们需要一个一个仔细考虑。

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

总共有 12 个嵌套计算。编辑完计算表后,我们将把这张表准备好。

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

制作桑基手臂

我们继续通过创建两个新的表并如下设置,在 Sankey 的左侧和右侧创建 Sankey 手臂。

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

左侧桑基臂

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

右侧桑基臂

通过将选择的度量拖到行中,并将表计算改为占总数的百分比。然后添加颜色和文本的维度。另外,为 Sankey 右侧的颜色标记添加 INDEX()。

步骤 10 创建仪表板

最后一步,我们需要将所有的表和过滤器排列在一起,以得到我们的 Sankey 图。

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

结论

最后,我们得到了第一个 Sankey 图,可以用来显示超市数据集中的流量。您可以查看此 Sankey,并通过此链接下载工作簿。

此外,您可以更改数据源并按照步骤构建自己的 Sankey 图并共享您的作品。

参考

如何使用 Flask 和 FaunaDB 制作可伸缩的 API

原文:https://towardsdatascience.com/how-to-make-scalable-apis-using-flask-and-faunadb-f6005d4a8065?source=collection_archive---------34-----------------------

帮助使用 Flask 和 FaunaDB 构建快速 API 的快速样板文件。

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

凯文·霍尔瓦特在 Unsplash 上的照片

随着无服务器技术的兴起,web 服务变得越来越简单。无服务器应用程序改变了应用程序的旧的整体架构,并促进了更多的微服务解决方案来解决技术问题。

凭借自动扩展和多区域部署的优势,无服务器应用近年来迅速崛起也就不足为奇了。无服务器的成本也重新定义了我们制作软件的方式,因为它现在是基于每个请求,而不是基于时间的服务。

更好的是,无服务器还使小型服务完全免费。大约一百万次请求后才需要支付。Azure Function 的消费计划就是一个例子。

无服务器和这个教程有什么关系?

这里提到无服务器的主要原因是因为 FaunaDB 是一个 NoSQL 数据库,它是为无服务器设计的。这个数据库的价格是基于请求的,这正是无服务器应用程序所需要的。

使用像 FaunaDB 这样的服务可以大大降低成本,以至于该应用程序的托管功能几乎是免费的。当然不包括开发成本。因此,对无服务器应用程序使用按月计费的数据库就失去了意义。

自由堆栈的例子是 Netlify、Netlify 函数和 FaunaDB 的组合。尽管它只对一定数量的请求是“免费的”。除非你开发的应用在部署的第一天就有成千上万的用户,否则我不认为这是什么大问题。

在我看来,对无服务器应用程序使用按月计费的数据库有点扼杀了这一点

另一方面,Flask 是用 Python 编写的微框架。它是一个极简框架,没有数据库抽象层、表单验证或其他框架提供的任何其他特定功能。

Flask 大体上是无服务器兼容的。你可以用 AWS Lambda 做一个无服务器的 Flask 应用。这里是来自 serverless.com 的官方指南。

入门指南

设置 Python 和 Pip

首先安装 Python 和 Pip。我不会列出所有可能的安装方式,对于 Windows 用户,你可以在这里获得安装程序。至于 Linux 用户,如果你使用的是基于 Debian/Ubuntu 的发行版,打开你的命令提示符,安装 python 和 pip,如下所示:

sudo apt update
sudo apt install python3 python3-pip

要检查安装是否正确,请尝试执行以下命令:

python --version
pip --version

然后会显示相应命令的版本号。

安装依赖项

环境设置完成后,下一步是安装 Flask 本身。安装过程很简单,只需输入:

pip install Flask

然后,为 FaunaDB 安装 python 驱动程序:

pip install faunadb

*瞧!*一切就绪!

制作待办事项应用程序

现在我们要用所有应用程序创意的之母制作一个示例应用程序,待办事项列表应用程序。

待办事项列表模板

对于这个例子,因为我们将主要关注如何制作 API,我们将使用 W3School 模板用于待办事项列表应用前端。

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

作者举例说明应用程序

基本项目结构

我们的项目将是一个助手模式的实现。我们项目的一个简单概要如下:

-/
 |--app.py 
 |
 |--services
    |--todo_service.py
 |--helpers
    |--todo_helper.py
 |--entities
    |--faunadb_entity.py

FaunaDB 指数

等等,什么是索引?

索引是你在 FaunaDB 中做‘where’语句的方式。它允许您根据字段值获取特定的文档。

要创建新的索引,只需转到数据库的 Indexes 部分,然后单击 New Index

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

FaunaDB 索引页面,作者图片

创建索引时,选择您想要与之交互的集合。然后定义要搜索的字段名称。最后,定义你的索引名,确保它是唯一的和可读的。

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

FaunaDB 新索引表,作者图片

例如,让我们创建一个索引,在这个索引中我们可以获得现有集合中的所有数据。

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

所有待办事项索引,作者图片

哦,通过用户的电子邮件获取 todos 的索引怎么样?简单。

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

通过电子邮件获取待办事项,通过作者获取图片

如果要使术语唯一,请选中唯一复选框以添加约束。

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

在 FaunaDB 中添加约束,按作者排序的图像

要向某个集合添加约束,您需要使用包含唯一字段的术语创建索引。

为了帮助你更好地理解,这里有一篇来自《动物群》的官方文章来帮助你理解指数。

让我们制作 API

创建烧瓶启动文件

首先,编写一个运行 Flask 的 python 文件。

基本烧瓶应用程序

编写 FaunaDB 实体脚本

接下来,在我们开始编写服务和助手之前,我们必须首先定义一个实体文件来连接到 FaunaDB。

这用于通过索引获取 FaunaDB 文档。get 函数不返回多个文档,一次只能返回一个文档。

为了获得多个文档,我们需要使用一个映射函数,通过某个索引返回多个数据。

lambda 函数将传递索引中所需的数据,而 paginate 将在集合中搜索特定的文档,然后 map 函数将所有匹配的文档作为列表返回。

Get document by reference Id 是惟一一个不使用索引而是利用文档的引用 Id 的函数。

创建、更新和删除文档的代码是相似的。因为 FaunaDB 是一个 NoSQL 数据库,所以数据结构并不重要,只要它是作为字典传递的。更新和删除文档还需要一个额外的引用 Id 参数,类似于通过引用 Id 获取文档函数。

成为待办事项助手

在编写了 FaunaDB 实体脚本之后,为集合编写助手函数。辅助函数需要是精确的小函数,只做一件事。

制作待办事项服务

当所有的助手都准备好了,编写服务文件作为端点使用。所有的请求都在服务级别进行解析,因此助手级别将只接收处理过的数据。

将路由附加到服务端点

最后,当端点设置好后,将端点添加到 app.py

你完了!不要忘记在部署之前用 Postman 测试 API。

摘要

TL;你可以查看我的项目 Github 库,并尝试自己运行它。

[## agustinustheo/flask-faunadb

Flask 和 FaunaDB 项目的样板代码。

github.com](https://github.com/agustinustheo/flask-faunadb)

在本教程中,您已经学习了使用 Flask 和 FaunaDB 制作 API。

概括地说,我们已经取得了:

  • 使用 Flask 的 API 端点。
  • 动物区的索引 b。
  • FaunaDB 的一个简单的实体助手。
  • 未来 API 项目的可读样板。

当你想在几个小时内制作一个快速的应用程序时,你现在有了一个快速的模板设置。未来的计划包括在现有的样板文件中添加一个 Swagger 实现。

希望这是你的一个好的开始,祝你愉快!

如何充分利用 BERT 微调

原文:https://towardsdatascience.com/how-to-make-the-most-out-of-bert-finetuning-d7c9f2ca806c?source=collection_archive---------12-----------------------

资源受限的 BERT 微调

重量初始化、数据订单和提前停止

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

照片由德鲁·帕特里克·米勒Unsplash 上拍摄

在下游任务中微调像 BERT 这样的预训练语言模型在 NLP 研究和应用 NLP 中已经变得无处不在。这部分是因为使用预训练模型可以节省大量时间和金钱。它们也经常作为强基线模型,当微调时,显著优于从零开始的训练模型。

W 尽管微调 BERT 在理论上相对简单,但由于不同训练运行的结果似乎是随机的,因此在实践中可能会非常耗时且得不到回报。事实上,即使反复微调具有相同超参数的模型,由于(1)权重初始化和(2)数据顺序(数据集如何被打乱)的随机性,最终模型性能也可能存在很大程度的可变性。在小数据集上微调 BERT 时,这尤其是个问题。

最近的研究探索了这些经常被忽视的随机性来源。作者提供了 2 个实用技巧,在给定一定计算预算的情况下,您可以使用它们来微调更好的模型,从而充分利用 BERT 微调:

  1. 在一个时期内多次评估您的模型;和
  2. 尽早识别不良初始化并阻止它们。

除了这些实用技巧之外,本文还提供了两个有趣的见解:

  1. 使用与原始设置中相同的超参数训练 BERT,但使用不同的随机种子,导致性能大幅提高,使其在某些任务上可以与 ALBERT 等新架构竞争;和
  2. 有一些权重初始化在全局上比其他的更好:它们在多个任务上比其他初始化产生更好的模型。

实验装置

作者在 4 个不同的 GLUE 二元分类数据集上多次微调 BERT。其中三个相当小(MRPC、RTE 和可乐),一个相对大(SST)。

在每个数据集上,他们共同微调所有 BERT 参数,并在所谓的剧集中训练一个分类头。在每一集中,超参数是相同的,但是控制权重初始化和数据顺序的随机种子被修改。作者在小数据集上尝试了 25 种不同的随机种子,在 SST 上尝试了 15 种。也就是说,他们总共播放了 2100 集(3 x 25 + 15)。

技巧 1:经常评估

标准的机器学习工作流程相当于根据训练数据训练一定数量的模型,在验证集上挑选首选模型,并在测试集上评估其最终性能。

在这个工作流程中,训练更多的模型自然会导致最佳模型的更高的预期性能和更小的方差。但是训练更多的模型也需要更多的时间和资源。因此,从业者面临着预期性能和资源消耗之间的权衡。

了解这种权衡是什么样的非常重要。我们可以在运行一定数量的微调剧集后,通过绘制预期的验证性能来实现这一点:

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

x 轴:微调集的数量(训练的模型),y 轴:最佳模型的预期性能。每个时期评估模型 10 次比每个时期评估一次或在训练中评估一次会导致更高的预期性能。[ 来源

正如所预期的,当用一些超参数训练一个模型仅一次时,验证性能的差异是巨大的。随着更多模型(具有相同的超参数,但是用于权重初始化和数据顺序的不同种子)被训练,方差减小。类似地,最佳模型性能的期望值随着我们尝试的不同初始化的数量而增加。

关键要点是:

从上面的图表中我们可以看出,每个时期评估模型 10 次(蓝线)比每个时期评估一次或更少会导致更高的预期验证性能。因此,作者得出结论认为

“根据验证数据更频繁地评估模型会导致更高的预期验证值”

随机种子的影响有多大?

我们刚刚看到,如果我们仅微调 BERT 一次,在某个超参数设置下,验证性能会有很大差异。这是由于随机权重初始化 (WI) 和数据顺序 (DO) 。这些初始化对性能有多大影响?

为了回答这个问题,作者绘制了每个数据集的最佳/最差 WI/DO 种子的所有片段的验证性能分布:

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

对于最差的种子(绿色和红色虚线),验证性能的密度往往位于较低的性能区域。这对于 MRPC 和 RTE 来说尤其如此,其中分布呈现双峰。[ 来源

从上面的图表中,我们看到最好的种子在高性能区域比最差的种子有更多的密度。作者进行了方差分析测试,证明了最佳和最差种子的分布确实具有不同的均值。

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

用不同的随机种子多次训练 BERT 会比之前报道的分数有很大的提高[ 来源

权重初始化和数据顺序的不同随机种子会对性能产生很大影响。与之前报道的具有相同超参数和实验设置的分数相比,作者的最佳微调 BERT 模型表现得更好。在某些任务上,BERT 甚至可以与 ALBERT 这样的新型号竞争。

I 有趣的是,似乎有全局良好的初始化。因为所有 4 个任务都涉及训练二进制分类器,所以可以检查用于一个任务的权重初始化的好种子是否也适用于其他任务。作者发现情况是这样的:有一些初始化在所有任务中表现一致!这真的很令人兴奋,作者将这个问题留给未来的研究。

关键要点是:

最佳和最差随机种子之间的性能差异是显著的。我们能否在训练的早期识别出不良的随机种子,并从中获得实用的见解?(答案是肯定的!继续阅读)

秘诀 2:开始很多,早点停止,继续一些

在实践中,资源通常是有限的——无论是时间还是金钱。因此,考虑到强加给我们的约束,我们希望尝试并获得最佳模型。如果我们能够在训练过程的早期识别出导致糟糕的最终模型的情节,我们就可以阻止它们,并将我们的资源花在更有希望的情节上。幸运的是,作者证明了我们可以做到这一点。

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

每个任务 20 次随机初始化的训练曲线。不良的初始化可以在早期识别出来。[ 来源

T 上图表明,识别不良初始化是可能的,这将在训练结束时导致不良模型。对于较小的数据集来说尤其如此。对于较大的 SST 数据集,这在图中似乎不太明显,但在这种情况下,2 个时期后的验证性能与最终验证性能之间仍有很强的相关性。

然后,问题变成了如何决定何时停止训练一个模型,以及训练多少个模型。为此,作者使用了一种受超参数搜索早期停止标准启发的算法。该算法采用以下 3 个参数:

  • t: 我们开始训练的车型数量
  • f :何时评估模型,占总历元数的百分比
  • 继续训练的表现最好的模特的数量

运行该算法需要*(TF+p(1f))s*个步骤来完成,其中 s 是总历元数(在本例中 *s=3)。*作者在 20–30%的范围内使用 f 获得了最佳结果。他们还运行实验,并显示不同计算预算的最佳参数。共同趋势是:

  • t 应远大于*p;*还有
  • p 应该大约是我们的计算预算允许我们完全训练的模型数量的一半(对于 s 时代)。

结果总结在下图中。它显示了对 4 个任务中的每一个使用上述算法时的相对误差减少。误差减少是相对于不使用上述算法而言的——也就是说,只需要完全训练一定数量的模型(x 轴)并选择最好的一个。正如我们所见,对于任何计算预算,早期停止算法都会带来可观的性能提升。

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

与仅完全训练 t 个模型(x 轴)[ ]相比,使用上述提前停止算法微调 BERT 时的相对误差减少

关键要点是:

在预算有限的情况下对 BERT 进行微调时,启动许多模型,尽早停止坏的模型,并且只处理少数几个模型,可以获得更好的整体性能。

结论

在资源受限的环境中(有固定的计算预算),使用以下两个技巧来充分利用 BERT 微调:

  1. 在一个时期内多次评估你的模型;和
  2. 尽早识别不良初始化并阻止它们。

资源受限的预训练

如果您觉得这很有趣,您可能还想看看下面的文章,其中讨论了改进像 BERT 这样的 Transformer 模型的预训练的方法。

[## 这就是如何训练更好的变形金刚模型

如何训练更快、更高性能的变压器

towardsdatascience.com](/this-is-how-to-train-better-transformer-models-d54191299978)

[1]:杰西·道奇,加布里埃尔·伊尔哈尔科,罗伊·施瓦茨,阿里·法尔哈迪,汉纳内·哈吉希尔兹,诺亚·史密斯,微调预训练语言模型:权重初始化,数据顺序和提前停止 (2020)。

[2]:杰西·道奇,苏钦·古鲁兰根,达拉斯·卡德,罗伊·施瓦茨,诺亚·a·史密斯,展示你的工作:改进实验结果的报告。进行中。EMNLP 的(2019)。

[3]:李丽莎,凯文·杰米森,朱利亚·德萨沃,阿夫申·罗斯塔米扎德,阿米特·塔尔沃卡,超波段:一种基于 bandit 的超参数优化新方法。《机器学习研究杂志》(2018)。

充分利用你的拓展实习

原文:https://towardsdatascience.com/how-to-make-the-most-out-of-your-outreachy-internship-bd3de2eb8071?source=collection_archive---------29-----------------------

改变人生的远程技术实习——在这场新冠肺炎战役中堪称完美

什么是 Outreachy?

Outreachy 是一个带薪的全日制远程技术实习项目,每年进行两次。它对全世界的女性(包括异性恋者和变性人)、变性人和性别同性恋者开放。实习生与来自开源社区的经验丰富的导师一起工作,如 Mozilla、Python Foundation、Fedora 等。

我在 2018 年夏天在 Mozilla 的 Taskcluster 团队下做了一次外展实习。我的项目是建立一个code attribute,网站,让人们在 Mozilla 中找到好的第一个 bug。我的实习真的很棒!以下是我在实习期间喜欢做的一些事情,我希望能帮助那些对这个项目不确定的人。

像 Git 一样学习源码控制

大多数项目使用版本控制,例如 Git 或 Mercurial,它允许人们与其他人协作。此外,在应用阶段,您可能已经开始使用版本控制来为项目做贡献了。这真的迫使我使用版本控制,这是我在实习前很少在学校项目中采用的做法。你会犯错误(我想我在某个时候损失了一整天的工作😫)并学会问大量的问题,但你肯定会学到很多东西。

飞行和参加 Mozilla 全体人员

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

奥利弗·普拉特纳在 Unsplash 上拍摄的照片

在我被这个项目录取的几天后,我收到了 Mozilla All Hands 的邀请,这个活动将在我实习期间举行。这是一个非常激动人心的事件!整整一周的时间与所有其他 Mozilla 员工见面,与你的导师和现实生活中的其他人见面,并建立关系网。非常好玩!

有大量的研讨会要参加,也有很多好东西要抢。我得到了一本 Rust 编程书,并被告知作者也参加了 All Hands😆!我被解释说,通常会有一种“赠品”,他们打开一个房间,你可以拿走房间里的任何东西,如 t 恤,包,别针,以及可爱的笔记本电脑贴纸。可悲的是,我错过了那个赠品,因为我在别的地方聊天。然而,幸运的是,我在回机场的路上遇到的一个女孩随机给了我一些 t 恤,说它对她来说太小了!多么令人惊喜啊!!在整个旅程中,我真切地感受到 Mozilla 人是多么的友好,我是多么的幸运!

我也遇到了一些我以前在 IRC 中交谈过的人,他们在不同的团队工作,还有所有其他的外展和 GSOC 实习生。一切都包括在内:餐费、机票和旅馆费。尽早申请签证(如果你需要的话),并要求在签证面试时带上 Mozilla 的推荐信,以增加你获得签证的机会😃。

PS:最初我的父母很担心我一个人从新加坡旅行,但是一切都计划得很好。每小时都有巴士从旧金山机场接我们去酒店,所以没有必要自己安排交通。所以,如果你被邀请去,扔掉你所有的犹豫!

即使实习结束后也要管理你的项目

没错。你没听错!因为我的项目是开源的,所以即使在实习结束后,我也可以管理和贡献我的项目。这样做的好处是能够继续融入社区并向他们学习。我喜欢我的团队和环境,我试图分配一些时间为项目做贡献。

因此,实习的最后一天并不是你项目/学习的结束。此外,你的项目不是一个马上就被扔出去的实习生项目,而是成为一个更大的项目的一部分,彼此依赖。你的项目也可能是你为其他项目做贡献的开始。我见过其他实习生在实习结束后开始为其他项目做贡献。

有(一个/多个)导师

在实习项目期间,所有实习生都被指派一名或多名导师来支持他们。至于我,我被分配给 3 个导师。我想这可能是因为我的项目需要跨职能会议的性质。我非常感谢他们每一个人。

我确实认为有导师是无价的,因为他们不仅在技术上指导你,而且告诉你应该如何在你感兴趣的领域导航。我的导师让我感到很舒服,可以问问题,并在我的实习项目之外非常关心我,我们经常讨论我的兴趣和未来的计划。他们还分享了关于他们开始工作时做了什么,管理他们的工作机会等的见解。他们甚至鼓励我在实习结束后申请某个职位,并要求我在实习结束后保持联系。

学习一些编程技巧

我想这取决于你的项目,但对我来说,我在实习期间学到了很多前端技能以及如何编写可读的代码。以前,我总是匆匆忙忙地完成我的项目,不加考虑地命名事物,拥有巨大的函数做大量的事情,等等。我的导师通过严格的代码审查耐心地教我。我在实习期间的一个目标是在一次审查中通过拉请求哈哈😅。

加入一群过去的实习生

有一个外展校友小组,你可以加入,他们会不时分享一些机会或很酷的事件。你也可以看到其他实习生在做什么,并与他们交流。

货币($)

在我申请的时候,我不太考虑金钱上的好处,因为我非常渴望学习,即使他们什么都不付,我也可能会申请。此外,我在家乡找到的其他一些实习也是无薪的。此外,我觉得如果我设法从丰富的经验中学习,这在技术上就像是免费上学(如果没有报酬的话)。

然而,外展确实带来了一些金钱上的好处:

  1. Outreachy 在整个实习期间支付了 5500 美元。付款根据完成阶段划分。你可以填写一些表格,这样也可以免税😜。
  2. Outreachy 提供 500 美元的旅行津贴,用于会议或活动。这可以在实习期结束大约一年后申请。
  3. 如果你为 Mozilla 项目工作,你将会得到一台全新的笔记本电脑,甚至在工作结束后你也可以保留它。我呢,选择 13 寸的 Macbook Pro 2017,带 Touch Bar。

PS:

  • 在您申请期间,福利可能会发生变化。我会尽量保持更新,但是,请仔细检查网站,因为它是真实的来源。
  • 所有的货币都是美元

感谢您读到这里!希望这篇文章对你有帮助和启发😃!如果你碰巧是/认识以前的实习生,请在评论区分享你最喜欢的外展活动,以及我错过了哪些好处!

如何用 Python 制作按 Alpha 值的地图

原文:https://towardsdatascience.com/how-to-make-value-by-alpha-maps-in-python-484722160490?source=collection_archive---------30-----------------------

关于如何用 Python 创建 Alpha 值映射的初学者指南和教程

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

杨烁Unsplash 上拍照

自从我看到 Alpha 值地图的美丽美学,我就想做一个。当时,在 QGIS 或 ArcGIS 中稍加修改就能制作出它们并不困难。现在,由于 Pysal 库和 Splot,您可以使用 Python 制作按 alpha 值的地图。

在本教程中,我将指导你如何使用 Python 制作 alpha 值贴图。但是首先,让我们了解什么是按阿尔法值的地图,为什么要使用它,什么时候使用合适?

什么是阿尔法值图(VBA)

“按阿尔法值”是双变量 choropleth 技术,其中我们考虑两个相互影响的变量,例如,选举结果和人口密度。第二个变量充当另一个感兴趣的变量的均衡器。

因此,VBA 通过阿尔法变量(透明度)修改背景颜色。因此,较低的值会淡出背景,而较高的值会弹出。VBA 地图的出现是为了减少 choropleth 地图中较大的尺寸偏差。

除了美学部分,如果你想通过色彩而不是尺寸来突出聚光灯,使用 choropleth 技术,VBA 也是一个不错的选择。它确实比纯粹的 choropleth 图描绘了更好的信息。

但是,您首先需要有一个与感兴趣的变量相关的变量(即,拥有更多选民的县对选举结果有重要影响)。

如何用 Python 制作按 alpha 值排序的地图

我们将使用 Splot Python 库来创建我们的地图和 Geopandas 来读取地理空间数据。我们使用了 2012 年美国大选的子集数据。让我们首先读取数据,看看前几行。

import geopandas as gpd
from splot.mapping import vba_choroplethimport matplotlib.pyplot as plt
%matplotlib inlinegdf = gpd.read_file("data/MN_elections_2012.gpkg")
gdf.head()

从下表中可以看出,我们有一个包含不同列的地理数据框架。例如,巴拉克·奥巴列保存该区域的结果。

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

2012 年选举数据

我们大部分时间使用 choropleth 地图,但是正如我们在前面提到的,它有其局限性。让我们首先从数据中制作一个 choropleth 图,为数据可视化创建一个基准。例如,我们可以选择使用巴拉克·奥巴马专栏。

fig, ax = plt.subplots(figsize=(12,10))
gdf.plot(column=’BARACK OBA’, scheme=’quantiles’, cmap=’RdBu’, ax=ax)
ax.axis(“off”)
plt.show()

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

等值区域图

现在,我们创建一个 alpha 值图。为了创建我们的地图,我们需要两列。第一列是我们感兴趣在地图中显示的内容;例如,巴拉克·奥巴马的结果。第二列保存要均衡的 alpha 值。这种 alpha 均衡将从贴图外观中消除低值,并增加高值区域的聚光灯效果。我们可以选择总结果作为 alpha 值。

fig, ax = plt.subplots(figsize=(12,10))
vba_choropleth(
     gdf[‘BARACK OBA’].values, 
     gdf[‘Total Resu’].values, 
     gdf, 
     rgb_mapclassify=dict(classifier=’quantiles’),
     alpha_mapclassify=dict(classifier=’quantiles’),
     cmap=’RdBu’, 
     ax=ax,
     revert_alpha=False )plt.show()

“按 alpha 值”贴图会立即高亮显示高值区域,即使它们是 n。与大区域在视觉上占主导地位的 choropleth 贴图相比,“按 alpha 值”贴图会清楚地显示高值区域。

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

按 alpha 值映射

我们可以简单地使用黑色背景来强调聚光灯的效果。将下面的“按 alpha 值”贴图与上面的贴图进行比较。

plt.style.use('dark_background')
fig, ax = plt.subplots(figsize=(12,10))
vba_choropleth(
     gdf[‘BARACK OBA’].values, 
     gdf[‘Total Resu’].values, 
     gdf, 
     rgb_mapclassify=dict(classifier=’quantiles’),
     alpha_mapclassify=dict(classifier=’quantiles’),
     cmap=’RdBu’, 
     ax=ax,
     revert_alpha=False )plt.show()

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

alpha 值贴图-黑色背景

没有图例,按 alpha 值的图很难阅读。Splot 提供了一种创建图例的简单方法,甚至比其他重量级 GIS 软件应用程序都要简单。我们也回复到白色背景。

plt.style.use('default')
fig, ax = plt.subplots(figsize=(12,10))
vba_choropleth(
     gdf[‘BARACK OBA’].values, 
     gdf[‘Total Resu’].values, 
     gdf, 
     rgb_mapclassify=dict(classifier=’quantiles’),
     alpha_mapclassify=dict(classifier=’quantiles’),
     cmap=’RdBu’, 
     ax=ax,
     revert_alpha=False,
     legend = True 
)plt.show()

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

最后,我们可以给地图添加一些上下文。例如,我们可以添加主要城市,以帮助读者有效地阅读地图。

cities = gpd.read_file(“data/ne_10_populated_places.geojson”)
cities = cities.to_crs(“EPSG:26915”)fig, ax = plt.subplots(figsize=(12,10))
vba_choropleth(
     gdf[‘BARACK OBA’].values, 
     gdf[‘Total Resu’].values, 
     gdf, 
     rgb_mapclassify=dict(classifier=’quantiles’),
     alpha_mapclassify=dict(classifier=’quantiles’),
     cmap=’RdBu’, 
     ax=ax,
     revert_alpha=False,
     legend = True 
)
cities.plot(ax=ax, color = "white")
for x, y, label in zip(cities.geometry.x, cities.geometry.y, cities.NAME):
    ax.annotate(label, xy=(x, y), xytext=(3, 3), textcoords="offset points")
plt.show()

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

现在,我们有了一个美观的地图,帮助我们传达聚光灯的效果,而没有 choropleth 地图的限制。

结论

按 alpha 值排序的地图是可视化地理空间数据的有效方法,避免了 choropleth 和 cartogram 地图的限制。在本教程中,我们已经探索了什么是 alpha 值贴图,以及如何使用 Splot 库创建一个。

本教程的代码可以从这个 Github 资源库获得。

[## shakasom/vba

Python 中 alpha 贴图的值。在 GitHub 上创建一个帐户,为 shakasom/vba 开发做贡献。

github.com](https://github.com/shakasom/vba)

如何做一个病毒式传播的项目?

原文:https://towardsdatascience.com/how-to-make-viral-project-ca1a71176d45?source=collection_archive---------54-----------------------

这是一个个人项目到达 79 个国家的故事。

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

Jukan TateisiUnsplash 拍摄的照片

我们所要决定的是如何利用给我们的时间。~ 甘道夫

让我们从故事的结尾开始,这里是项目:

[## 冠状病毒统计

此页面显示最新的新冠肺炎统计数据。

yleprince.github.io](https://yleprince.github.io/corona/)

🌎️背景

和大多数法国人一样,我从 3 月 17 日起就一直生活在隔离区。我的工作变得 100%遥不可及,我的爱好也停止了。于是我浏览 thenews.im 消磨空闲时间。我发现这个冠状病毒 API:thevirustracker.com。它提供了关于新冠肺炎传播的全球视角。他们也有一个很好的关于世界形势的仪表板。约翰·霍普金斯大学的仪表板也是如此。这些板的主要问题是它们很难加载到智能手机上。他们正在加载沉重的地块和地图需要很多时间来显示。

💡️ ️The 理念

我想在我的手机上以光速获得新冠肺炎的最新数据。

👶第一版

我决定从简单开始,非常非常简单。这是该项目的第一个版本:

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

第一版:极简主义的全球信息

这再简单不过了。显示的数据正是 thevirustracker.com 提供的数据。它丑得要命,但仍然很轻,满足了我的需求。有了它,我能够在一秒钟内实时了解疫情的发展。

由于数量不多,我把这个链接分享给了我的家人和密友。很少有人见过这种发黄的版本。但是他们正在使用,并且给出了反馈。我妈要的是法语版。完成了。

为了更具包容性,我向前迈了一步,更改了页面外观。我为色盲的人使用了更多的对比色,为视障用户使用了尽可能多的 HTML 标签。众所周知,有些浏览器会根据底层结构大声读出网页。对于这一页,它曾经说“New section: Worldwide stats [...]”。我把标题空白分割成了一个<h1>标签(即。标题第一级)。现在包容性的浏览器都在说“【T2”,你可以基于这个结构在页面中导航。

这并不多,提供公共内容的人应该始终记住尽可能地包容。大多数时候不需要额外的努力。

👧️第二版

从第一个版本开始,我发现人们希望对传播进化有更多的见解。我决定添加一个折线图来显示一个国家或更多国家的趋势。

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

第二个版本:增加了分析国家趋势的折线图。

在左边,你有这个功能的截图。第一个下拉列表Add a country允许您选择国家。第二个选项让用户选择显示的数据(病例数、恢复数…)。

该图旨在表明版本 2 正在解决这一新的需求。此时,用户能够相互比较国家。你可以看到蔓延的趋势,并估计即将到来的情况。数据直接从 thevirustracker.com加载,提供最新数字。

为了更进一步,我添加了一个按钮Log scale,允许用户显示日志视图。它拉平了指数方面。这一特征证明非常有用,因为不同阶段的国家之间的比较在线性尺度上可能是困难的。

👩第三版

折线图便于探索/比较趋势,但无法准确洞察一个国家的情况。我从第二个版本的反馈中收集到,用户现在希望能够选择一个国家,并查看这个特定国家的实时数据。

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

第三个版本:添加地图以显示国家级别的见解

在左边,你可以看到一个新的特性:一个允许用户选择一个国家并显示详细数据的地图。

信息字段与第一次发布的版本相同。

在我从朋友和用户那里收到的反馈中,有一条很好地说明了这个项目是如何运作的:

一旦疫情达到几千人,数字就变得难以阅读。字体太细,数字之间距离太近。在他的评论中,我的朋友建议增加一个额外的空格以增加可读性。**容易发现,更容易修复。**受到了用户的热烈欢迎。这是一个快速的胜利!

👵️版本 4

第四个版本(这里将详细介绍的最后一个版本)包含一些视觉上的变化。用户界面中添加了两个按钮。

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

按钮来添加人类数量的比例

第一个允许用户根据人数来缩放数据。所以病例数变成了病例百分比。这个功能看起来很有用,但并没有被大量使用。页面查看者对这个参数并不感兴趣。

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

按钮来复制和共享配置链接

第二个按钮对页面的传播起到了巨大的作用。这是一个共享按钮,允许查看者复制页面配置。从这个阶段开始,每个用户都可以设置页面,并将其视图共享到自己的网络中。

📈️监控传播

就个人而言,我必须承认我喜欢探索数据。随着项目的展开,我的目标有了新的维度。我本可以决定停在版本 1,因为我的个人需求得到了满足。但是随着我的朋友、我的网络以及我朋友的网络使用这个页面,我有了更大的野心。我想改善网页带来的服务。这就是我监控页面使用的原因。

从技术的角度来说,每次用户在页面上做出改变,都会改变 url。将此与 Google Analytics 相结合,我能够看到如下指标:

  • 目前浏览次数最多的配置:

[## 冠状病毒统计

被浏览最多的页面是中国、美国、法国和意大利的对比,地图上选择了美国。人口比例和对数比例均被禁用。

这是页面的链接:yleprince.github.io](https://yleprince.github.io/corona/?comp=CNUSFRIT&main=US)

  • 使用最多的语言: fr 🇲🇫
  • 页面被浏览的国家数量: 79

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

突出显示用户国籍的地图

  • 独立访问者的数量:几千人
  • 每个用户的平均访问次数: 1.9
  • 一天中不同时间的用户数量:

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

突出显示每天每小时页面流量的热图

  • 还有更多…

通过结合 url 持续更新和谷歌分析,我能够清楚地了解正在使用的功能和用户兴趣。在开发阶段对任务进行优先排序对我帮助很大。

💼️结论

就个人而言,这个项目是一次伟大的冒险。这是我的一个项目第一次接触到如此多的用户,他们来自不同的人群。我从一个想法开始,看到结果在十天内传播到世界各地是一种巨大的体验。尽管网络上已经有现成的工具,但它的简单性和包容性(智能手机、视障人士……)已经找到了它的受众。

从不了解你的人那里获得反馈是从客观评价中学习的最佳方式。

📌️外卖

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

简而言之,如何做一个像病毒一样传播的项目。

✍️ 后脚本

我希望我能够分享数据,为人们提供他们想要的信息。这个项目并不打算以任何方式从疫情获利。我投入了几个晚上的工作来满足人们的愿望,除了建设性的评论和良好的氛围,我一无所获。也就是说,项目中呈现的数据是 thevirustracker.com提供的数据。即使他们工作出色,每个人都应该考虑几个数据源。有多少个国家,就有多少种计算方法。

这是故事的结尾,我希望你喜欢读它,就像我喜欢生活一样!感谢所有在全球分享我的作品并给我反馈的粉丝们,没有你们,这篇文章就写不出来。

如果你想知道它是如何工作的,下面是代码:

* [## 伊莱普林斯/科罗纳

基于 thevirustracker.com API 的项目。请随意贡献这段代码!

github.com](https://github.com/yleprince/corona)

呆在家里,保重🙏️*

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值