TowardsDataScience 博客中文翻译 2020(七十七)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

从网页中抓取数据集的一行 Python 代码

原文:https://towardsdatascience.com/a-single-line-of-python-code-scraping-dataset-from-webpages-c9d2a8805d61?source=collection_archive---------10-----------------------

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

马库斯·斯皮斯克在 Unsplash 上的照片

使用 Python 从网页和下载中搜寻 API 端点

无论我们拥有什么水平的数据科学/分析技能,没有数据集你什么都做不了。

的确,有许多开源数据集,如 Kaggle 和 Data.world。然而,它们更适合用于练习和学习目的,但可能无法满足我们的一般需求。

通常,数据科学家/分析师可能有或多或少的网络搜集技能,所以无论何时你在网站上看到数据集,都更容易获得。从网站上抓取内容后,一系列的转换、提取和清洗操作将帮助我们为下一步获取干净的数据集。这是 Python 的典型用法之一,因为 Python 中有很多优秀的 web 抓取库可用,比如 Scrapy 和 Beautiful Soup。

然而,学习这些网络抓取库并不容易。此外,对于那些没有 web 开发背景的人来说,这可能不是数据科学家/分析师的常见技能,理解和确定 HTML DOM 和 XPath 等概念可能会更加困难。

然而,在本文中,我将介绍一种更简单的从网站下载数据集的方法。你会发现你甚至可以用熊猫来做所有的工作!

新冠肺炎新病例数据集

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

照片由马丁·桑切斯Unsplash 拍摄

第一个例子是新冠肺炎新案例数据集。原来有许多公开的数据来源,如政府网站将公布这一点。然而,我只是想以此为例,因为我发现这是一个非常好的典型例子。

今天,当我从“时代”(澳大利亚的一个受欢迎的媒体)网站扫描新闻时,我发现有一个条形图显示澳大利亚每天新增的确诊病例(见下面的截图)。

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

截图来自网站:https://www.theage.com.au/

如果我想得到他们的数据呢?让我们找到它的 API 端点!

搜寻 API 端点

现在大多数流行的 web 浏览器都提供了它们的开发人员控制台。我们将使用控制台来完成这项工作。以下是从浏览器调用控制台的一些快捷方式:

  • 谷歌浏览器:Ctrl + Shift + I
  • 火狐:Ctrl + Shift + K
  • 微软 Edge: F12

在这里我将使用谷歌浏览器进行演示。但是不用担心,大多数浏览器都有非常相似的开发者控制台。相信你一定能搞清楚特色在哪里。

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

谷歌 Chrome 开发者控制台截图

控制台出现后,转到“网络”选项卡。我们正在寻找一个 API 端点,所以如果它可用的话,它将被捕获为一个“XHR”请求。因此,让我们选择 XHR 滤波器。

XMLHttpRequest ( XHR )是一个对象形式的 API,其方法在网络浏览器和网络服务器之间传输数据。该对象由浏览器的 JavaScript 环境提供。特别是,从 XHR 检索数据以不断修改加载的网页是 Ajax 设计的基本概念。不管名字如何,XHR 可以用于除 HTTP 之外的协议,数据不仅可以是 XML 的形式,也可以是 JSON、HTML 或纯文本的形式。[1]

有时,网页可能会有一些 JavaScripts 在后台运行,以完成一些预定的任务,浏览器会捕捉到它们。如果您想要一个更清晰的捕获请求列表,最好的方法是

  • 确保“录制”按钮已启用
  • 刷新网页
  • 当您看到与数据相关的内容已经完全呈现在网页上时,请停止“记录”

现在,您将在开发人员控制台中看到一个请求列表。

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

谷歌 Chrome 开发者控制台截图

好的。这个很明显。我们可以看到,有人请求将其名称命名为“新冠肺炎-新-案例-JSON . JSON……”。一定是这样!

转到“Headers”选项卡,您将看到该请求的详细信息。最重要的是网址。

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

谷歌 Chrome 开发者控制台截图

现在,让我们将 URL 作为另一个浏览器选项卡打开,看看会发生什么。

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

截图来自谷歌 Chrome

酷!这是我们正在寻找的 API 端点。

使用 Pandas 读取 API 端点

怎么消费?极其容易!

我相信如果你是数据科学家或数据分析师,你一定会使用 Pandas Dataframe。只需一行 Python 代码,您就可以将所有内容直接放入 Pandas Dataframe。

df = pd.read_json('[https://www.theage.com.au/interactive/2020/coronavirus/data-feeder/covid-19-new-cases-json.json?v=3'](https://www.theage.com.au/interactive/2020/coronavirus/data-feeder/covid-19-new-cases-json.json?v=3'))

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

宜家家具清单

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

照片由奥列格·拉普捷夫Unsplash 上拍摄

并不是所有的网站都在使用 REST API 端点,所以我不会说这是一种通用的方法。然而,你会发现有相当多的网站在使用它。让我们再举一个例子,宜家网站。

假设你想从宜家获得所有的床和产品细节,以便进行分析。下面是我的浏览器从 URL(https://www.ikea.com/au/en/cat/beds-bm003/)捕捉到的请求。

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

这个更有趣。请注意,它说“产品计数”是 220,但“产品窗口”只给出其中的 24 个。如果你注意一下这个页面,就会发现只有 24 种产品会列在这个页面上,如果你想继续浏览更多,还会提供一个“加载更多”按钮。嗯,这在 Web 开发中很常见,以节省带宽和服务器资源。

但这意味着我们必须放弃吗?绝对不是。让我们来看看请求 URL:

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

你见过有一种属性叫“大小”吗?它正好等于 24,这是页面大小。让我们尝试将它改为size=220,并使用 Python 内置库requests发送请求。

import requestsjson = requests.get(
    '[https://sik.search.blue.cdtapps.com/au/en/product-list-page?category=bm003&sort=RELEVANCE&size=220&c=plp&v=20200430'](https://sik.search.blue.cdtapps.com/au/en/product-list-page?category=bm003&sort=RELEVANCE&size=220&c=plp&v=20200430')
).json()['productListPage']['productWindow']

这次我们不能直接使用 Pandas 的原因是产品列表不在 JSON 对象的根级别。相反,它在root.productListPage.productWindow

之后,请求会将 JSON 对象转换为 Python 字典,因此我们现在可以使用 Pandas 来读取它。

df = pd.DataFrame.from_dict(json)

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

摘要

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

照片由 Aaron BurdenUnsplash 上拍摄

那不是又快又容易吗?不用学那些网页抓取库。但是,当然,这种方法不会对所有的网站都有效,这就是为什么网络抓取库仍然是必要的。然而,当网站上有可用的 API 端点时,为什么不直接找到它并直接使用它呢?

[## 通过我的推荐链接加入 Medium 克里斯托弗·陶

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

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

如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和成千上万的其他作者!(点击上面的链接)

参考

[1]维基百科。XMLHttpRequest。https://en.wikipedia.org/wiki/XMLHttpRequest

一个 Python 函数生成了一个精彩的条形图比赛视频

原文:https://towardsdatascience.com/a-single-python-function-generating-a-gorgeous-bar-chart-race-video-dd6410b8aed?source=collection_archive---------32-----------------------

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

Shutterbug75Pixabay 上拍摄的照片

从原始数据集到条形图比赛视频的逐步教程

最近,一种非常奇特的数据可视化方式在 YouTube 等各种平台上流行起来。只要有一些“实体”具有随时间变化的单一度量,这种类型的可视化就可以完美地说明这些实体之间的动态排序。

这就是条形图竞赛。它通常可以被看作是一个视频。下面的视频是我自己用一个 Python 函数生成的。看一看,你就知道我在说什么了。

你相信上面的视频是用一个只有几行代码的 Python 函数生成的吗?我会告诉你怎么做。

TD;分升

文章不算太短,因为我想提供一些可以循序渐进的东西。我认为 95%的时间我们都在做数据预处理。如果你真的想跳过直接进入正题,请到“**生成条形图比赛视频”**部分获取生成视频的代码:)

数据准备

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

图片由 Pixabay 上的 TiBine 拍摄

为了确保本教程是可实现的,我不仅会提供生成条形图比赛视频的代码,还会提供如何获取数据集并对其进行预处理。因此,准备好的数据集是可操作的,然后可以放入 Python 中的条形图 race 库中。

获取原始数据集

我使用的数据集是由欧洲疾病预防和控制中心提供的,可以公开获得。每个人都可以免费下载新冠肺炎数据集。我在以前的一篇文章中也使用了这个数据集。

3 行 Python 代码创建一个交互式可玩的新冠肺炎泡泡地图

官网在这里:

https://www . ecdc . Europa . eu/en/publications-data/download-todays-data-geographic-distribution-新冠肺炎-cases-worldwide

在上面的网页上有一个链接,我们可以下载 CSV 格式的数据集。事实上,我们不必将数据集下载到本地机器,因为 Pandas Dataframe 可以直接读取远程 CSV 文件,如下所示。

df = pd.read_csv('[https://opendata.ecdc.europa.eu/covid19/casedistribution/csv/data.csv'](https://opendata.ecdc.europa.eu/covid19/casedistribution/csv/data.csv'))

然后,我们可以看看数据集中有哪些列,以及通过df.head()得到的值是什么样子。

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

如果你看过前面的视频,你可能会意识到我用确诊病例数作为衡量标准。那么,让我们开始数据清理和转换。

数据转换

在数据转换中,我们需要将数据改造成我们可以使用的东西。为了生成条形图比赛视频,我们将使用名为“bar-chart-race”的 Python 库(将在下一节介绍)。它期望数据帧使用日期时间对象作为索引,实体名称作为列名。所以,我们一起来转换数据。

1。移除无用的列

因为我们只对日期、国家和病例数感兴趣,所以我们可以只使用这三列来过滤数据帧,如下所示。

df = df[['dateRep', 'countriesAndTerritories', 'cases']]

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

2。将日期字符串转换为 **datetime** 对象

如果我们检查列的数据类型,我们会发现dateRep实际上是 objects,它将被视为 strings 而不是datetime object。这将导致一些麻烦,因为我们不能期望基于日期字符串列的排序结果。

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

因此,我们需要将其转换成datetime型。

df['date'] = pd.to_datetime(df['dateRep'], dayfirst=True)

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

在这之后,让我们再次检查dtypes

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

3。添加累积病例

您可能已经注意到,案例数量是针对相应日期的。但是,我们需要每天的累计总病例数,以便每天的数据条目可以作为视频中的一帧生成。

因此,我们生成一个名为total_case的列,它表示当天到目前为止的案例总数。

df['total_cases'] = df.sort_values('date').groupby('countriesAndTerritories').cumsum().sort_index()

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

4。再次删除无用的列,并重命名这些列

因为我们已经生成了新的datetotal_cases列,所以我们不需要dateRepcases列。此外,让我们重命名国家名称列,以保持简单。

df = df[['date', 'countriesAndTerritories', 'total_cases']]
df = df.rename(columns={'countriesAndTerritories': 'country'})

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

5。旋转工作台

还记得我们需要使用国家名作为列名吗?所以,我们需要旋转桌子。这在熊猫数据框中很容易做到。

df = pd.pivot_table(df, index=['date'], columns=['country'], values=['total_cases'])

我们使用date作为索引,country应该是列,值是total_cases。然后,我们将得到如下的数据透视表。

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

pivot_table函数生成的多级索引很难看,可能会导致问题。所以,让我们来解决它。

df.index.name = None
df.columns = [col[1] for col in df.columns]

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

我们完成了原始数据集的转换。然而,我们仍然需要清理数据。

数据清理

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

照片由 webandiPixabay 上拍摄

你看到我们在数据框里还有很多NaN值吗?这是因为该国从来没有病例记录,这是有道理的。然而,它们可能会在以后引起问题。

1。用零填充 NaN 值

由于NaN值意味着该国没有确诊病例,所以用零填充所有NaN值是安全的。

df = df.fillna(0).astype(int)

请注意,这里我们还将数据类型更改为整数,因为用浮点数表示事例数是没有意义的。

2。删除例外列

在我们的数据框中已经是列的所有国家中,有一个列叫做Cases_on_an_international_conveyance_Japan,它不是一个国家。指的是钻石公主号邮轮。因为它实际上不是一个国家,乘客实际上来自不同的国家,所以我想在这种情况下将其从我们的统计数据中删除。

df = df.drop(columns=['Cases_on_an_international_conveyance_Japan'])

3。删除国家名称中的下划线

国家名称(我们的列名)在单词之间有下划线。我想用空格替换这些下划线,这样当我们看到它们作为条形图标签时会更漂亮。

df.columns = [col.replace('_', ' ') for col in df.columns]

4。删除从未进入前 10 名的国家

这一步是可选的。然而,当我们生成视频时,它将提高性能。我们的数据集中总共有 200 多个国家,但并不是每个国家都排在前 10 名。由于我们将创建一个前 10 名条形图比赛数据可视化,这些国家将永远不会显示。

我们可以如下删除这些国家。

country_reserved = set()for index, row in df.iterrows():
    country_reserved |= set(row[row > 0].sort_values(ascending=False).head(10).index)df = df[list(country_reserved)]

这里,我们首先生成一个名为country_reserved的集合。使用集合是因为它会忽略重复的值。然后,迭代数据框的每一行,如果当天国家/地区的案例总数排在前 10 名,则将国家/地区名称追加到集合中。

最后,我们将有一组曾经排在前 10 名的国家。将集合转换为列表并过滤列将产生一个更小的数据框,我们将在后面使用。

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

现在我们只剩下 30 个国家了。

生成条形图比赛视频

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

Pixabay 上的 StartupStockPhotos 拍摄的照片

好的。我们花了很多时间来争论数据集。事实上,正如我在这篇文章中提到的,生成视频非常简单。

我们只需要下载名为bar-chart-race的库,pip马上就会完成。

pip install bar-chart-race

导入库。

import bar_chart_race as bcr

简单地如下调用bar_chart_race函数。

bcr.bar_chart_race(
    df=df,
    filename='/content/drive/My Drive/covid-19.mp4',
    n_bars=10,
    period_fmt='%B %d, %Y',
    title='COVID-19 Confirmed Cases by Country'
)
  • df是我们准备的数据帧
  • filename是视频的输出文件名
  • n_bars是我们要在条形图中显示的条形数,也可以认为是我们要显示的“前 n 个”。
  • period_fmt是我们要在条形图上显示的日期格式。
  • title只是条形图的标题。

过一会儿,视频将在我们指定的路径和名称下生成。

摘要

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

博克斯卡皮特皮克斯贝上拍摄的照片

万岁!另一个令人惊叹的 Python 库!

在本文中,我介绍了另一个令人惊叹的 Python 库“条形图竞赛”。只需一个函数和几行代码,我们就可以生成一个 MP4 格式的华丽的条形图比赛视频。

事实证明,条形图比赛库中有更多可配置的项目。强烈建议你自己尝试一下。参考资料中给出了官方文档的链接!

[## 通过我的推荐链接加入 Medium 克里斯托弗·陶

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

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

如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和成千上万的其他作者!(点击上面的链接)

参考

欧洲疾病预防和控制中心

[## 下载世界各国每日新报告的新冠肺炎病例数

该可下载的数据文件每天更新,包含关于新冠肺炎的最新公共数据。你可以使用…

www.ecdc.europa.eu](https://www.ecdc.europa.eu/en/publications-data/download-todays-data-geographic-distribution-covid-19-cases-worldwide)

条形图比赛文档

[## 条形图竞赛

使用 bar_chart_race 包在 Python 中制作动画条形图比赛

www.dexplo.org](https://www.dexplo.org/bar_chart_race/)

编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里

关于新的 Tokenizers 库的一个小计时实验——一篇文章

原文:https://towardsdatascience.com/a-small-timing-experiment-on-the-new-tokenizers-library-a-write-up-7caab6f80ea6?source=collection_archive---------26-----------------------

剧透:速度惊人🔥

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

GitHub 上的 Tokenizers 库的自述文件

一周前,可爱的人在 抱脸 向公众发布了他们的新 Tokenizers 库 。tokenizers 用 Rust 编程语言编写(与 Python 相比,它以性能著称),提供了“当今最常用的 Tokenizers 的实现,重点关注性能和通用性”。

因此,这篇文章介绍了一些小型计时实验的结果,这些实验对比和比较了吴等人(2016 年)介绍的分词器的不同实现,并随着 Devlin 等人(2018 年)发布和出版的BERT而得到推广。与这些计时实验相关的所有代码都可以在下面的 Jupyter 笔记本中找到:

🤗变形金刚 vs💥标记化者

在第一个计时实验中,我比较了在流行的 变形金刚库 (也是通过拥抱脸)中实现的 Bert 单词块标记器的性能(在执行时间方面)和新的标记器库的性能。对于这两者,我在 5 次独立运行中标记(编码)了 100 万个英语句子,其结果可以在下面找到:

变压器与令牌化器定时实验

如您所见,平均执行时间仅为 45.6 秒,与 Transformers 库实现(平均执行时间为 6 分 42 秒)相比,Tokenizers 库实现的速度提高了近 9 倍。

🧵多线程性能

Tokenizers 还提供了一种一次(批量)编码多个句子的方法,由于其多线程实现(在 Rust 中),这可以显著提高性能。然而,Python 也支持多线程,例如使用[concurrent.futures](https://docs.python.org/3.7/library/concurrent.futures.html)

因此,与第一次计时实验类似,这里我比较了使用concurrent.futures.ThreadPoolExecutorsubmitmap的 Bert 单词块标记器的性能,以及标记器的本机encode_batch,结果如下:

多线程性能计时实验

正如你所看到的,令人惊讶的是,submitmap与非多线程令牌化相比,性能(相等)更差。然而,更有趣(也更令人印象深刻)的是,Tokenizers 库自带的多线程encode_batch只需要 10.6 秒就可以标记一百万个句子!

结论

正如宣传的那样,拥抱脸的新 Tokenizers 库提供了比 Transformers 库快得多(几乎 9 倍)的 BERT 单词块 tokenizer 实现**。然而,当批量对句子进行分词时,性能更加令人印象深刻,因为只需 10.6 秒就可以对 100 万个句子进行分词。因此,我想我可以有把握地断定它快得惊人🔥!**

虽然新的 Tokenizers 库提供了更多的好处,而不仅仅是其令人印象深刻的性能(例如,在新词汇上训练标记器的能力),但应该说,这种性能的显著提高不仅允许对越来越大的数据集进行标记**(在运行中),而且允许这些方法和技术更好的民主化(例如,在更便宜的硬件上部署,如移动电话和 SOC),允许来自各种背景的有抱负的 NLP 爱好者开始使用最新和最棒的 NLP🤗**

参考

[1] Y. Wu 等, Google 的神经机器翻译系统:弥合人与机器翻译的鸿沟 (2016),【arXiv 预印本 arXiv:1609.08144 。

[2] J. Devlin 等, Bert:用于语言理解的深度双向变换器的预训练 (2018), arXiv 预印本 arXiv:1810.04805

一个程序员用的剪切工具

原文:https://towardsdatascience.com/a-snipping-tool-for-programmers-32dbccf75c33?source=collection_archive---------25-----------------------

一个用 Python 编写的截取工具,它可以自动识别截取图像中的文本,并执行 google 搜索。

像许多程序员一样,我发现自己经常复制和粘贴文本。大部分时间我都是从我的 IDE 或者终端上复制一些错误信息,然后在 Google 上搜索。其余时间,我将一个方法或函数复制到 google 中来阅读文档。随着时间的推移,高亮显示文本、复制、打开浏览器、粘贴然后搜索的过程会变得有点乏味(我知道的第一世界问题)。我决定用 Python 来自动化这个过程。

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

马特·阿特兹在 Unsplash 上拍摄的照片

解决方案是…

我想要一个桌面应用程序,将坐在后台,像 windows 剪贴工具的行为。它将有两个功能:剪切和搜索和剪切和复制。

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

程序员图形用户界面的剪切工具

这两个函数都允许我将一个文本区域剪成图像,对图像执行字符识别,然后返回一个字符串。然后,截取和搜索功能将自动打开一个浏览器标签,并在谷歌中搜索截取图像中的字符串。另一方面,剪切和复制函数会将字符串保存到我的剪贴板中。

下面是如何使用该程序的演示。当你从不能用通常的方法复制的地方复制文本时,比如终端,图片或者 youtube 教程,它实际上是非常有用的。

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

“剪切和搜索”功能的演示

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

“剪切和复制”功能的演示

您可以找到完整的代码或下载。exe 文件放在我的 Github 上。请注意,目前这款应用只在我运行 Windows 10 的电脑上进行了测试。需要进行修改,以确保该应用程序在其他操作系统上工作。我以后可能会讲到这个。

所以我是怎么做到的…

正如我之前提到的,该应用程序是用 Python 编写的,使用的主要库是 PyQT5cv2Pillowpytesserac。GUI 允许我设置我希望使用的浏览器,并等待按下功能按钮。一旦按下一个功能按钮,就会创建一个裁剪工具小部件的实例,并等待用户通过单击和拖动来裁剪屏幕上的一个区域。github 上的 harupy 创造了一个用 Python 写的很棒的剪切工具应用程序,这必须要归功于他。他的代码构成了该项目的 snipping 工具部分的基础。

一旦剪切了一个区域,就使用 cv2 库将图像转换为灰度数组,然后使用 P yTesseract 库将图像传递给 Tesseract 光学字符识别(OCR)引擎。这是 Google 开源 Tesseract-OCR 引擎的包装器。

一旦被截取的图像被分析并且文本被识别,字符串或者使用 pyperclip 库被保存到剪贴板,或者在指定的浏览器中执行搜索。然后,GUI 重置并等待下一个 snip。

文本识别不是 100%准确,尤其是在较长的部分和文本是特定颜色时。我确信在进入 Tesseract OCR 引擎之前,我可以在 cv2 中用一些更高级的图像处理来改进这一点。如果我有时间,这些改变可能会在将来完成。如果我实现了任何改进,我将在将来更新这篇文章。欢迎任何改进的建议。祝你愉快!

使用 Tensorflow 对象检测模型和 OpenCV 的社交距离和遮罩检测器

原文:https://towardsdatascience.com/a-social-distancing-and-mask-detector-using-a-tensorflow-object-detection-model-python-and-opencv-dfe5f7a8bace?source=collection_archive---------20-----------------------

结合深度学习和计算机视觉的隔离项目。

介绍

社交距离这个词席卷了整个世界,并正在改变我们的生活方式。社交距离也被称为“物理距离”,意思是在你和其他不在你家的人之间保持一个安全的空间。随着该国开始在激增的新冠肺炎病例中解锁,保持社交距离已成为一个关键问题。围绕新冠肺炎疫情的最大担忧是,这种感染会以多快的速度通过接触甚至是接近感染者而从一个人传播到另一个人。社会距离在这里停留的时间比预期的要长,以对抗新冠肺炎。

因此,这让我想到开发一个人工智能模型,来检测人们是否在遵循社交距离,同时戴着面具。这是模型结果的一个例子。借助深度学习和 OpenCV,我们可以从视频片段中提取有趣的见解。红色边框表示这个人与另一个人很接近,蓝色边框表示这个人保持着社交距离。我们有单独的边界框来识别这个人是否戴着面具。

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

社交距离和面具检测

你可以找到我在我的 Github Repo 上使用的代码。

步骤概述

TensorFlow 对象检测 API 是用于创建解决对象检测问题的深度学习网络的框架。API 提供了预训练的对象检测模型,它们被称为模型动物园,已经在 COCO 数据集上进行了训练。上下文 ( COCO )中的常见对象数据集有 200,000 幅图像,在 90 个常见对象中有超过 500,000 个对象注释。请参见下图中属于 COCO 数据集的对象。

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

Coco 对象类别。图片来自https://arxiv.org/pdf/1405.0312.pdf

在这种情况下,我们关心属于 COCO 数据集的类“Person”。

该 API 还支持大量的模型。请参见下表以供参考。

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

API 支持的一小部分模型

这些模型在速度和准确性之间进行了权衡。这里我选择了 ssd_mobilenet_v1_coco 来检测‘人’。一旦我们使用对象检测 API 识别出“人”,为了预测这个人是否保持社交距离,我们可以使用 OpenCV,这是一个强大的图像处理库。一旦检测到社交距离,我就使用faster _ rcnn _ inception _ v2 _ cocoAPI 来检测这个人是否戴着面具,我之前使用 GPU(NVIDIA Quadro p 4000 Linux)对 top 2000 图像进行了训练。

深入探究主要步骤

现在让我们详细研究一下代码。

如果您是第一次使用 Tensorflow 对象检测 API,请从这个链接下载 GitHub。

我遵循的主要步骤是(请跟随我的 Github 上的 jupyter 笔记本)

  • ssd_mobilenet_v1_coco 模型加载到图中,并加载属于 coco 数据集的类列表

  • 使用 cv2 打开视频。VideoCapture(文件名)并逐个读取每一帧并将其写入一个路径

  • 对于每一帧,使用加载的图形执行对象检测

  • ssd_mobilenet_v1_coco 返回的结果是每个已识别的类及其置信度得分和边界框预测。

  • 基于类别和置信度得分> 0.60,检测一帧中的人数,如下所示。

  • 根据我们之前得到的包围盒预测画出蓝色彩色包围盒,并找到宽度的中点。用 id 标记每个边界框。

  • 找出一帧中点之间的欧几里德距离。

  • 有了欧几里德距离,找到距离小于 200 的包围盒,将包围盒的颜色改为红色**。**

  • 将所有的代码片段放在一起,传递所有的帧,并将它们保存在一个路径中。因此,我们将有一组社会距离检测帧

  • 将我在上面训练的带遮罩和不带遮罩图片的 frozen _ inference _ graph . Pb(faster _ rcnn _ inception _ v2 _ coco)加载到一个图形中,并加载类列表

  • 对于每个检测到的社交距离帧,使用 faster _ rcnn 模型的加载图来执行戴着面具的人的对象检测

  • 最后,使用之前获得的帧,使用 python 中可用的 moviepy 包创建一个视频

结论和改进

这就把我们带到了我文章的结尾。社交距离以及其他基本的卫生措施对于尽可能减缓新冠肺炎的传播非常重要。这个项目只是一个概念验证。

我很清楚这个项目并不完美。因此,有一些关于如何改进该应用程序的想法:

  • 我遇到过一些方法,人们将视频转换成俯视图或鸟瞰图,然后计算图像中两个物体之间的距离
  • 考虑摄像机校准****

“家是躲避风暴的避难所——各种各样的风暴。在家注意安全。”

使用 Tensorflow 对象检测模型、Python 和 OpenCV 的社交距离检测器。

原文:https://towardsdatascience.com/a-social-distancing-detector-using-a-tensorflow-object-detection-model-python-and-opencv-4450a431238?source=collection_archive---------7-----------------------

结合深度学习和计算机视觉的隔离项目。

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

介绍

在隔离期间,我花时间在 github 上探索 Tensorflow 的大量预训练模型。在做这件事的时候,我偶然发现了一个仓库,里面有 25 个预先训练好的目标检测模型,带有性能和速度指标。有了一些计算机视觉方面的知识,考虑到实际的环境,我认为使用其中的一个来构建一个社交距离应用程序会很有趣。

更有甚者,上学期在我的计算机视觉课上,我被介绍给了 OpenCV ,并在做一些小项目时意识到它的强大。其中之一包括对图片进行鸟瞰转换。一个鸟瞰图基本上是一个场景的自上而下的表示。这是在构建自动汽车驾驶应用程序时经常执行的任务。

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

车载摄像头鸟瞰系统的实现

这让我意识到,在我们想要监控社交距离的场景中应用这种技术可以提高质量。这篇文章介绍了我如何使用深度学习模型以及计算机视觉中的一些知识来构建一个健壮的社交距离检测器。

这篇文章的结构如下:

  • 型号选择
  • 人物检测
  • 鸟瞰图变换
  • 社会距离测量
  • 结果和改进

以下所有代码以及安装说明都可以在我的 github 库中找到。

1.型号选择

Tensorflow 对象检测模型 zoo 上可用的所有模型都已经在 COCO 数据集(上下文中的常见对象)上进行了训练。这个数据集包含 120,000 幅图像,在这些图像中总共有 880,000 个被标记的对象。这些模型被训练来检测这个数据集中标记的 90 种不同类型的对象。所有这些不同对象的完整列表可以在 github repo 的数据部分获得。这份物品清单包括一辆汽车、一把牙刷、一根香蕉,当然还有一个人。

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

可用模型的非详尽列表

根据模型的速度不同,它们有不同的性能。我做了一些测试,以确定如何根据预测的速度来平衡模型的质量。由于这个应用程序的目标不是能够执行实时分析,所以我最终选择了【faster _ rcnn _ inception _ v2 _ coco,它的 mAP(验证集上的检测器性能)为 28,相当强大,执行速度为 58 毫秒。

2.人物检测

使用这种模型,为了检测人,有几个步骤必须完成:

  • 将包含模型的文件加载到张量流图中。并定义您希望从模型中获得的输出。
  • 对于每一帧,通过图形传递图像,以获得所需的输出。
  • 过滤掉弱预测和不需要检测的对象。

加载并启动模型

张量流模型的设计工作方式是使用图**。第一步意味着将模型加载到张量流图中。该图将包含为获得所需检测而将完成的不同操作。下一步是创建一个会话,它是一个负责执行上图中定义的操作的实体。更多关于图表和会话的解释可在这里获得。我决定实现一个类来保存所有与 tensorflow 图相关的数据。**

通过模型传递每一帧

为每个需要处理的帧启动一个新的会话。这是通过调用 run() 函数来完成的。这样做时,必须指定一些参数。这些包括模型需要的输入类型,以及我们希望从中获得的输出。在我们的例子中,需要的输出如下:

  • 包围盒中每个物体的坐标
  • 每个预测的置信度** (0 到 1)**
  • 预测的类别 (0 到 90)

过滤掉弱预测和不相关的对象

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

人员检测的结果

模型检测到的许多类别之一是人。与人员相关联的类别是 1。

为了排除弱预测(阈值:0.75 )和除了人以外的所有其他对象类别,我使用了一个 if 语句来组合这两个条件,以从进一步的计算中排除任何其他对象。

**if int(classes[i]) == 1 and scores[i] > 0.75**

但是由于这些模型已经被预先训练,所以它们不可能只检测这个类。因此这些模型需要相当长的时间来运行**,因为它们试图识别场景中所有 90 种不同类型的对象。**

3.鸟瞰图变换

正如介绍中所解释的,执行鸟瞰视图变换给我们一个场景的顶视图。幸运的是,OpenCV 有很好的内置函数将这种方法应用于图像,以便将从透视角度拍摄的图像转换为该图像的俯视图。我用了伟大的阿德里安·罗斯布鲁克的教程来理解如何做到这一点。****

第一步包括在原始图像上选择 4 个点,这 4 个点将成为将要变换的平面的角点。这些点必须形成一个至少有两条对边平行的矩形。如果不这样做,当转换发生时,比例将不会相同。我已经在我的资源库中实现了一个脚本,它使用 OpenCV 的 setMouseCallback() 函数来获取这些坐标。计算变换矩阵的函数也需要使用图像计算的图像尺寸。图像的形状属性。

**width, height, _ = image.shape**

这将返回宽度、高度和其他不相关的颜色像素值。让我们看看如何使用它们来计算转换矩阵:

请注意,我选择也返回矩阵,因为它将在下一步中用于计算每个检测到的人的新坐标。这样做的结果是帧中每个人的“GPS”坐标**。使用这些比使用原始地面点要精确得多,因为在透视图中,当人们在不同的平面图中时,距离是不一样的,而不是在离摄像机相同的距离。与使用原始帧中的点相比,这可以大大改善社交距离测量。**

对于检测到的每个人,返回构建边界框 a 所需的 2 个点。点是盒子的左上角和右下角。从这些,我通过得到它们之间的中点来计算盒子的质心。利用这个结果,我计算了位于盒子底部中心点的坐标。在我看来,这个点,我称之为地面点,是图像中一个人的坐标的最佳表示。****

然后,我使用转换矩阵来计算每个检测到的地面点的转换坐标。在检测到帧中的人之后,使用cv2 . perspective transform()对每一帧进行这一操作。我是这样实现这个任务的:

4.测量社交距离

在每一帧上调用这个函数后,返回一个包含所有新变换点的列表。根据这个列表,我必须计算每一对点之间的距离。我使用了来自 itertools 库中的函数 combinations() ,它允许在一个列表中获得所有可能的组合,而无需保留双精度。这在这个堆栈溢出问题上解释得很好。剩下的就是简单的数学:在 python 中使用 math.sqrt() 函数可以很容易地计算两点之间的距离。选择的阈值是 120 像素,因为它在我们的场景中大约等于 2 英尺。

一旦识别出两个点彼此过于接近,标记该点的圆的颜色将从绿色变为红色,并且对于原始帧上的边界框也是如此。

5.结果

让我来介绍一下这个项目是如何运作的:

  • 首先获得平面图的 4 个角点,并应用透视变换以获得该平面图的鸟瞰图,并保存变换矩阵。
  • 获取在原始帧中检测到的每个人的边界框。
  • 计算这个盒子的最低点。它是位于两脚之间的点。
  • 使用这些点的变换矩阵来获得每个人的真实“GPS”坐标。
  • 使用 itertools.combinations() 测量帧中每个点到所有其他点的距离。
  • 如果检测到社交距离违规,将边界框的颜色更改为红色。

我使用了来自 PETS2009 数据集的视频,该数据集由包含不同人群活动的多传感器序列组成。它最初是为人群中的人数统计和密度估计等任务而构建的。我决定使用第一个角度的视频,因为这是最宽的角度,具有最佳的场景视图。该视频展示了获得的结果:

6.结论和改进

如今,社交距离和其他基本的卫生措施对于尽可能减缓新冠肺炎病毒的传播非常重要。但是这个项目只是一个概念验证,并不是为了监控公共或私人领域的社交距离,因为道德和隐私问题。

我很清楚这个项目并不完美,所以这是如何改善这个应用程序的一些想法:

  • 使用更快的模型来执行实时社交距离分析。
  • 使用对遮挡更鲁棒的模型。
  • 自动标定是计算机视觉中的一个众所周知的问题,它可以大大改善不同场景下的鸟瞰图变换。

这篇文章是我对《走向数据科学和媒体》的第一篇贡献。我已经把代码放在我的 Github 上了。如果您对代码本身或本文有任何疑问,请随时提问。如果您有可能改进的想法或任何类型的反馈,请随时联系我,我将不胜感激。我希望你觉得这很有帮助,如果你喜欢,可以随意分享。

来源

在实施这个项目的过程中,我发现了许多在线文章,它们帮助我度过了困难:

** [## 使用 Tensorflow 对象检测和 OpenCV 分析一场足球比赛

用数据做很酷的事情!

towardsdatascience.com](/analyse-a-soccer-game-using-tensorflow-object-detection-and-opencv-e321c230e8f2) [## 4 点 OpenCV getPerspective 转换示例— PyImageSearch

凌晨 4 点 18 分。警报响了。外面还是漆黑一片。床很暖和。我光着脚会觉得地板很冷。但是我得到了…

www.pyimagesearch.com](https://www.pyimagesearch.com/2014/08/25/4-point-opencv-getperspective-transform-example/) [## 里奇伦的鸟瞰项目研究

一般来说,车载摄像机具有严重的透视效果,如图 1(a)所示。因为透视效应,所以…

developer.ridgerun.com](https://developer.ridgerun.com/wiki/index.php?title=Birds_Eye_View/Introduction/Research) [## 宠物 2009

数据集是包含不同群体活动的多传感器序列。如果…请发电子邮件给 datasets@pets2009.net

www.cvg.reading.ac.uk](http://www.cvg.reading.ac.uk/PETS2009/a.html#s0)**

英国政治景观的空间表现

原文:https://towardsdatascience.com/a-spatial-representation-of-the-uks-political-landscape-7f460c4d7ea4?source=collection_archive---------32-----------------------

政治学中的主成分分析

空间术语对于任何政治领域的描述都是必不可少的。政治行动者在问题上采取“立场”,他们执行“U 型转弯”,当然他们要么位于“左翼”,要么位于“右翼”,要么位于“中间地带”。这种语言也不是纯粹的学术语言,而是延伸到所有参与政治的个人的词汇中;无论是政治家、记者还是普通大众。然而,空间语言在政治背景下的使用主要是假设性的,“纯粹是概念性的,不可能实际观察到”(Laver 和 Benoit,2012,195)。因此,个人必须投入相当多的精力去理解从中得出相对政治立场的许多变量。本研究的目的是提出一个物理框架,在此基础上,这些变量可用于绘制聚合群体(如投票选区)的偏好。为此,我将研究的其余部分分为三个部分,同时利用英国 2019 年大选作为背景。1)首先,我开始讨论政治空间的概念,从而为这项工作提供必要的色彩和背景。2)然后,我检查和批判现有的投射政治空间的方法论和学术方法。3)最后,我解释了如何使用主成分分析(“PCA”)将政治空间的许多维度简化为直观的呈现。在本节中,我还将通过利用英国选区层面的数据来展示 PCA 的优点,以说明如何定量捆绑相关变量(政治或其他)来了解每个选区在大选中最有可能支持哪个政党及其原因。

政治空间的概念

在政治学中,空间的概念是通过根据特定变量将政策偏好/政治代理人排列成一条直线来赋予实体性的(见图 1)。在这样做的过程中,一个相似性的光谱被创造出来——点与点之间的欧几里得距离代表了不同的程度(亚当等人,2005 年,施菲尔德,2008 年)。线性政策谱后来成为许多普遍思想的基石,这些思想不仅主导了政治学术领域,也主导了现实世界的实践:例子是 Downsian 的“中间选民定理”概念,以及“左”和“右”翼对政治偏好的理解。

图 1:英国 2019 年大选中假设的一维政策轴

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

这个将单个变量映射到一维框架的简单框架可以扩展为创建多个变量的多维框架。这种框架理论上可以包含几乎无限数量的维度,因此即使在概念层面也存在挑战。随后,通常避免字面意义上的尝试,而倾向于将相关变量(可以是明确的政策偏好,也可以基于人口统计数据)分组为广泛的主题,如社会主题(自由到保守)或经济主题(自由市场到国家管理)(见图 2)。简单的分类当然会有问题,例如,在 2019 年的大选中,反对在希思罗机场增加一条跑道的人可能会被描绘成自由主义者/国家管理的人,即使这是由首相倡导的:一个保守主义者/自由市场主义者。然而,通过使用这种方法,政治科学家可以创建地理空间的简约点来放置政治偏好。这些地图随后能够包含比简单的一维比例尺更多的信息。

图 2:英国 2019 年大选中假想的二维政策轴

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

2)对现有方法的批评

在物理空间上呈现政治偏好的实际任务由两部分组成。第一阶段是估计潜在的维度,在这些维度上可以绘制偏好,第二阶段是将偏好映射到这些维度上。在现有的文献中,对过程的第一阶段采取的对比方法定义和区分方法风格。随后,我将第一阶段的方法分为两大类,并对其进行研究。这些组被定义为在先验定义的尺度上估计位置的组,以及在根据数据归纳定义的尺度上估计位置的组。

估算量表维度的两种方法都依赖于上一节讨论的概念框架(维度是通过将相关变量分组到广泛的主题中来确定的)。对于维度的先验估计,这意味着利用专家分析师的先验知识来创建和缩放维度的定性方法。这通常被认为是一种优越的方法,因为使用先验知识大大降低了任务的复杂性,并建立在数百年的政治话语之上(Laver 和 Benoit,2012,198)。然而,这种方法当然会受到许多针对任何定性研究的普遍批评。这主要包括关于可复制性、可比性和为大型数据集提供充分分析的问题。

在 Mcelroy 和 Benoit (2007 年)关于这一主题的工作中可以找到一个明显的例子。他们的工作整理了专家对欧洲政治的意见,并试图从中推断出对欧洲政党政策的空间理解。物理表示最初是建立在一个二维框架上,与图 2 中的轴相同。然而,在后续工作中,y 轴上的社会维度取代了对欧盟一体化的看法。结果,政党的空间位置完全改变了,这意味着新的位置无法与以前的重复进行比较,更不用说其他调查了。同样,他们对专家分析的使用也存在与基于访谈的研究类似的问题——无法保证不同的专家会使用彼此相同的维度,甚至无法保证相同的专家会两次得出相同的分析。此外,虽然他们的方法可用于绘制欧盟的政党地图,但试图绘制欧盟所有政治选区的地图会耗费大量劳动力,这与我在最后一节中承担的任务类似。

同时,对于试图归纳得出空间位置的研究来说,这种方法是完全不同的,本质上是更加定量的。这些定量方法通常基于通过因子分析等技术识别潜在维度(事实上,我在下一节中使用了这种方法的变体)。这种方法再次以概念框架所描述的方式来缩放维度,然而在这种情况下,显式地计算相关性束以导出变量的宽泛分组。这种方法的一个极端例子是 Gabel 和 Huber (2000),他们将整个比较宣言项目映射到一个单一的维度上——左右翼经济规模。

这种方法的问题是,通过让基本向量完全开放,我们留下了“基本上无法验证”的位置(Benoit 和 Laver,2012,198)。其结果是,行动者的定位反而通过现有的政策维度概念得到认可,并需要专家分析才能从地图中获得任何洞察力——前面提到的 Gabel 和 Huber 的工作就是一个明显的例子,因为它依赖于左/右翼经济规模。因为地图应该努力实现普遍可访问性,所以这种技术仍然是欠缺的。因此,在下一节中,我建议通过归纳计算政治空间,然后有意识地将现有知识分层,我们可以提供关于政治代理人的政策和政党偏好的变量意味着什么的宝贵见解,而不需要任何重要的先验知识。

3)使用 PCA 创建英国 2019 年大选英格兰和威尔士选区政治偏好的空间表示

到目前为止所描述的任务可以理解为多变量分析,其最终目标是降低维度。PCA 是我们可以用来完成这项任务的归纳工具之一。它是一个合适的工具,因为它的明确目的是以一种允许它们被映射到二维图上的方式压缩多个变量。该方法通过分析原始数据集中变量之间的共线性(或缺乏共线性)(图 3 ),并将这些变量转换为新变量(主成分)来实现这一点。然后,新创建的变量可以用相似的组聚集在一起来绘制,差异通过距离来显示——因此,这种方法仍然可以在政治空间的传统概念框架内识别。

我用来进行分析的数据集由从英国选区级数据库收集的潜在相关和潜在不相关指标组成。混合相关和不相关变量的目的是,在政治学中,我们无法总是预先知道哪些变量是重要的。随后,我加入了潜在的非相关变量来削弱模型,从而提供了一个关键案例和更强大的例子来证明这种方法的未来使用(Hancke,2009)。

使用的变量如下(下议院图书馆,2020 年):

低于最低工资的工作比例

女性人口比例

男性人口比例

拥有住房的家庭比例

65 岁以上人口比例

35-65 岁人口比例

16-35 岁人口比例

白人人口比例

黑人人口比例

亚裔人口比例

混血人口的比例

其他种族的人口比例

留下投票的人口比例

投票支持脱欧的人口比例

肥胖人口比例

抑郁人口比例

管理人员占人口的比例

中位房价与中位收入水平

工资中位数

宽带速度

数据是公开的,并在参考书目中有链接。这项研究只包括英格兰和威尔士的选区。二元变量,如男性/女性或离开/留在不需要都包括在 PCA 中。然而,自从观想结束后,它们就更容易被理解了。

图 3:英国选区层面数据的相关矩阵

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

通过使用主成分分析,我们可以创建一个系统的框架,它很容易重现,并可以缩放维度和定位变量。图 4 显示了五氯苯甲醚的初始产品。从这一点出发,我们可以利用先验知识来推断右下角的选区可能类似于图 2 中所示的右上角的选区(社会保守和经济自由)。类似地,我们可以将对面的角落(根据种族多样性和宽带速度判断,可能是市中心的选民)视为社会自由派和经济左翼。此外,轴标题告诉我们,x 轴上的欧几里得距离比 y 轴上的欧几里得距离占更多的方差(即,水平距离比垂直距离代表更多的差异)。因此,这两个集群之间的差异最大。不幸的是,正如这一分析所证明的那样,这样一幅地图最好通过现有政治维度的棱镜来理解,并且具有我所批评的 Gabel 和 Huber 的工作的缺陷。

图 4:英国选区层面数据的 PCA

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

为了提高从数据中推断维度的方法的解释能力,以及减少对专家见解的依赖,我用他们投票支持的政党来标记选区(图 5)。这种做法并不新奇,但在政治科学中却鲜有应用。然而,这样做的结果是,我们可以很容易地确定与特定政党最相关的变量,以及每个选区相对于彼此的位置。因此,我们已经表明,当我们分层附加信息时,定量方法可以合并大量变量并创建直观的地图。

图 5:英国选区级别数据的 PCA,带有政党投票颜色编码

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

更进一步,我们还可以确定工党在 2019 年大选中输给保守党的席位(图 6)。这让我们看到,工党失去的席位与 1)人口老龄化,2)公投脱欧和 3)低于最低工资的工作比例高有关。此外,高比例的肥胖和抑郁似乎也与这一位置有关——尽管直觉上我们可以假设这与财富水平有关。这种趋势有一个值得注意的例外——在地图的左下方,我们可以看到肯辛顿(可以选择识别单个点,但没有在下面显示,因为它会挤满可视化)——这是一个在上次选举中获胜但后来在大选中失败的剩余席位工党。

有趣的是,该地图表明工党应该争取更贫穷的脱欧选民,因为这些席位比大都会留欧派席位更接近保守党席位群——尽管这种说法当然忽略了工党可能会失去席位给第三方的可能性。无论如何,我们可以清楚地看到,颜色编码的 PCA 提供了一种有效的方式来理解演员的政治定位。

图 6:英国选区级别数据的 PCA,投票从工党切换到保守党,颜色编码

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

结论

在上面的报告中,我已经展示了 PCA 分析是一种如何很好地与创建政治的空间表示的过程相一致的工具,如政治学中存在的一般概念理解所定义的。此外,我还证明了它在分析选民群体时识别政策偏好的适用性,以及颜色编码创建了一个易于解释的地图。在做上述工作时,我还提出了对英国 2019 年大选的新颖见解,以及一种应用于现实世界的政治策略。对这一领域的进一步研究可能希望尝试类似的方法,如 t-SNE 图和多维标度,并比较结果。考虑到数据的空间异质性,地理加权的主成分分析也值得进一步研究。

文献学

亚当斯 JF,梅里尔 S 和格罗夫曼 B (2005)政党竞争的统一理论:整合空间和行为因素的跨国分析。剑桥:剑桥大学出版社。

Benoit K 和 Laver M (2012)政治空间的维度。伦敦:劳特利奇。

唐斯 A (1957)的《民主的经济理论》。伦敦:普伦蒂斯霍尔

Gabel M 和 Huber J (2000)把政党放在他们的位置:从政党宣言推断政党的左右意识形态立场。美国政治科学杂志 44(1):94–113。

Hancké,B ,( 2009)智能研究设计:社会科学新手研究指南。牛津:牛津大学出版社

下议院图书馆 2019,本地数据仪表板,2020。查看日期:【2020 年 3 月 11 日,https://commonslibrary.parliament.uk/local-data/

McElroy G 和 Benoit K (2007)欧洲议会中的政党团体和政策立场。政党政治 13(1):5–28。

施菲尔德·N(2008)政治的空间模型。伦敦:劳特利奇。

感知机器人的星球大战故事

原文:https://towardsdatascience.com/a-star-wars-story-by-sentient-droid-10aec13e4e11?source=collection_archive---------70-----------------------

如果星球大战的故事是由机器写的会怎么样?

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

作者图片

简介

想象一下,机器人带着未来的知识来到 21 世纪,却只有当前的技术来改写他们的星球大战故事。

在这篇文章中,我们将看到一个机器人(机器学习模型)如何利用未来的知识(星球大战书籍)生成它的星球大战故事。

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

来源: neonbrand

模型的架构

该模型采用单词的输入序列。我们用 LSTM 来理解句子的上下文。因为简单的 RNN 会有消失渐变问题,所以对于文本生成,我使用 LSTM。

该模型的输出是最可能的下一个单词的单词分数。下面的代码显示了使用 PyTorch 的模型架构。

故事生成

故事生成是通过将单个单词和文本长度作为输入来完成的。该单词被传递给模型以获得下一个最可能的单词,我们继续这个过程,直到达到文本长度。前 K 个采样用于在选择下一个最可能的单词时引入一些随机性。

生成的样本

以下是用各种输入单词和文本长度生成的文本的 12 个例子。

样品 1:

我觉得提到韩是个白痴很有趣。我们可以看到这个顺序,虽然不是很好,但很有意义。

输入单词:绝地

文本长度:12

生成的输出

jedi.
han was a idiot, not looking in his datapad

样品 2:

以下是为绝地武士生成的不同序列。到目前为止,较小的文本长度似乎更有意义。我不得不在《星球大战》故事中寻找与绝地、贸易联盟和十一人的联系🤔

输入单词:绝地

文本长度:12

生成的输出

jedi. and the trade federation, servers of the eleven, commissioned

样品 3:

这让我觉得它在说尤达无所不知!我喜欢尤达,所以我同意它😄

输入单词:尤达

文本长度:12

生成输出

yoda. the jedi had expanded on the galaxy, but he knew

样品 4:

这个文本长度更长。

“猎鹰的脸似乎,然后弹射出窗外”

对于这篇文字,我想象一个星际战斗机飞行员正透过他/她的窗户看着千年隼的前方。当千年隼移动时,飞船似乎从这个维度弹射到另一个维度😜

输入单词:尤达

文本长度:100

生成的输出

yoda. ”
“i don’t know—fly the fancy, ” yoda replied quietly.
“no, ” luke called, uncharacteristically the robot of happiness and disappointment.
“we know. ”
“and luke’s anger. ” lando yelled.
the falcon ’s face seemed, then catapulted out the window.
the phantom- cloaked girl swiveled at the princess of the death.
" i know you were dead."
" no, not...."
" i don't know about him," ferus said

样品 5:

这个很有趣,说维德在操纵他的方式!还提到了冲锋队的男子气概(我认为它是在说“匹配”,但男子气概更有趣)

输入单词:维达

文本长度:35

生成的输出

vader could react in the main navy, manipulating his way to the limit, then turned back to the main scout. the stormtrooper of the two- east jawas were just only a matchto

样品 6:

该序列正确地链接了 r2-d2,可能输入中提到了足够多的 r2-d2 名称实例。

“但是帝国将由帝国掌管!”

嗯,不知道 r2-d2 在想什么,但我们不能让这种事情发生😂

“我不认为我们能找到它”

看起来 r2-d2 正在和 c-3po 通话

输入字:r2

文本长度:75

生成输出

r2- d2. " i don't think we can find it," he said." but the imperials will be in charge of the empire!" he looked over to his chair." i can't have to be a long idea," ferus answered." we can get out of the temple." " we know, i have to tell you

样品 7:

同样,这里欧比和欧比旺的联系是正确的。

嗯,这似乎是一个很好的想象练习,如果奥比万的飞船是一架巴托克星际战斗机呢!哈哈,我可想不出这个🤣或者是巴托克偷了贸易联盟的星际战斗机,然后给了欧比万?我会让你弄明白的

输入单词:obi

文本长度:100

生成的输出

obi- wan's ship. the bartokk starfighter fired in a heap overlooking the arena with a violent, hanging out of the roof.
he had heard the emperor, and he wouldn't be happy for the time of his life.
" the queen has been destroyed to me."
" the senate is not a trap," obi- wan said.
" i can tell him. you can tell him that you have a chance to collect."
" i don't know."
" you don't

样品 8:

有原则的丘巴卡,是的,我喜欢!

输入单词:丘巴卡

文本长度:10

生成的输出

chewbacca, with the connectors and the principles.

样品 9:

“你根本不了解绝地,”费罗斯说。但绝地将是唯一的一个——原力”

看起来费罗斯·奥林正在教阿纳金·天行者关于绝地的知识。也许它会结束,因为绝地将是阻止邪恶的唯一力量。

输入单词:阿纳金

文本长度:50

anakin, and the naboo star destroyers and services."
" yes, master."
" what do we commit?"
" you have no idea of a jedi," ferus said." but the jedi will be the only one— the force

样品 10:

所以我们从下面的文本中了解到了索拉·纳贝里和绝地将在纳布之战中一起对抗抵抗组织的故事?

输入单词:sola

文本长度:100

生成的输出

sola. and the jedi had begun to overthrow the resistance."

" you don't know," ferus said.

" i don't know," he said." it is no of the founding reasons."
" you know you were a good one!" the boy asked irritably." but the chancellor are not happy to unravel the emperor's advisor in the galaxy," ferus said." i can see it." the boy nodded." i have a feeling,"

样品 11:

卢克·天行者似乎想通知某人关于联邦飞船的事。

输入单词:联邦

文本长度:22

生成的输出

federation droids of the rebel star cruisers, indomitable.
" i have to tell the first naval," the boy

样品 12:

我会把样品交给莱娅公主👸

下面的文字似乎把莱娅公主、纳尔·沙达和汉·索洛联系了起来。它似乎是从《走私者的月球之书》中获取上下文的。

输入单词:公主

文本长度:30

生成的输出

princess the freighters of his shaddaa, alerting the empire, and the jedicouncil of the sith lords of the force.
han was not nervous to triggerits his own

结论

生成的文本不是很好,因为模型需要更多的微调。虽然我们对最准确的模型来完美地预测训练数据中的每个单词不感兴趣,但我们希望推广该模型。在过度拟合和泛化之间保持平衡。模型的当前损失为 4.1。我想测试增加纪元,增加批量大小,降低学习率,增加层数和隐藏维度,以获得更低的损失和更好的预测。我的 1080Ti 需要很长时间来训练。我正在等待 AWS 团队给我 Sagemaker ml.p2 实例来对此进行微调!

创建可信数据科学组合项目的分步指南

原文:https://towardsdatascience.com/a-step-by-step-guide-for-creating-an-authentic-data-science-portfolio-project-aa641c2f2403?source=collection_archive---------35-----------------------

请跟随我一起探索德国最大的旅游论坛 Vielfliegertreff

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

作者图片

作为一名鼓舞人心的数据科学家,构建有趣的投资组合项目是展示你技能的关键。当我作为一名商科学生通过在线课程学习编码和数据科学时,我不喜欢数据集由的虚假数据组成,或者在之前就被解决,比如波士顿房价Kaggle 上的泰坦尼克号数据集

在这篇博客文章中,我想向你展示我是如何开发有趣的数据科学项目想法并一步一步实现它们的,比如探索德国最大的常旅客论坛 Vielfliegertreff。如果你时间不够,可以直接跳到结论 TLDR。

第一步:选择你感兴趣的相关话题

作为第一步,我想一个潜在的项目,满足以下三个要求,使它最有趣和愉快:

  1. 解决自己的问题或燃眉之急
  2. 与最近发生的一些事件相关联或特别有趣
  3. 在之前没有被解决或覆盖吗

由于这些想法仍然很抽象,让我给你简单介绍一下我的三个项目是如何满足需求的:

概述我自己的数据科学组合项目,以满足上述三个要求。

作为初学者不要追求完美,而是选择你真正好奇的事情并写下你想在你的话题中探索的所有问题。

第二步:开始收集你自己的数据集

鉴于你遵循了我的第三个要求,将不会有公开可用的数据集,你将不得不自己收集数据。在浏览了几个网站后,我在不同的场景中使用了三个主要的框架:

我使用的 3 个主要框架的概述。

对于 Vielfliegertreff,我使用 scrapy 作为框架,原因如下:

  1. 没有隐藏数据的 Java 脚本支持的元素。
  2. 网站的结构很复杂必须从每个论坛主题到所有主题,从所有主题到所有帖子网页。有了 scrapy,你可以很容易地实现复杂的逻辑,以一种有组织的方式产生新的回调函数。
  3. 有相当多的帖子,所以抓取整个论坛将需要一些时间。Scrapy 允许你以令人难以置信的速度异步抓取网站。

为了让你知道 scrapy 有多强大,我很快对我的 MacBook Pro (13 英寸,2018,四个雷电 3 端口)进行了基准测试,测试采用了 2,3 GHz 的四核英特尔酷睿 i5 处理器,能够每分钟刮 3000 页左右:

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

Scrapy 刮削基准。(图片由作者提供)

为了美观而不被堵塞,重要的是你要轻轻地刮,例如启用 scrapy 的 自动节流功能 。此外,我还通过项目管道将所有数据保存到一个 SQL lite 数据库,以避免重复,并打开记录每个 url 请求**,以确保如果我停止并重新启动抓取过程,不会给服务器带来更多负载。**

知道如何抓取给了你自己收集数据集的自由,同时也教会了你一些重要的概念,比如互联网如何工作,什么是请求,以及 html/xpath 的结构。

对于我的项目,我最终得到了 1.47 gb 的数据,这接近论坛中的 100 万个帖子。

步骤 3:清理数据集

随着你自己的杂乱数据集,投资组合项目最具挑战性的部分来了,数据科学家平均花费 60%的时间:

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

图片由众筹 2016

与干净的 Kaggle 数据集不同,你自己的数据集可以让你建立数据清理的技能,并向未来的雇主展示你已经准备好处理现实生活中杂乱的数据集。此外,您可以通过利用库来探索和利用 python 生态系统,这些库解决了其他人以前解决的一些常见数据清理任务。

对于我来自 Vielfliegertreff 的数据集,有几个常见的任务,比如将日期转换为熊猫时间戳,将数字从字符串转换为实际的数字数据类型,以及将非常混乱的 html post 文本清理为可读且可用于 NLP 任务的内容。虽然有些任务有点复杂,但我想分享一下我最喜欢的三个库,它们解决了我的一些常见数据清理问题:

  1. date parser**😗*轻松解析网页上常见的几乎任何字符串格式的本地化日期。
  2. 明文 : 用明文对抓取的数据进行预处理,创建一个规范化的文本表示。这也是惊人的删除个人身份信息,如电子邮件或电话号码等。
  3. fuzzywuzzy**😗*模糊串匹配像个 boss。

步骤 4:数据探索和分析

当在 Udacity 上完成数据科学 Nanodegree 时,我遇到了跨行业数据挖掘标准流程(CRISP-DM) ,我认为这是一个非常有趣的框架,可以用一种系统的方式来组织你的工作。

在我们当前的流程中,我们隐含地遵循了我们项目的 CRISP-DM:

通过在步骤 1 中提出以下问题来表达业务理解:

  1. 新冠肺炎如何影响像 Vielfliegertreff 这样的在线常旅客论坛?
  2. 论坛里有哪些最好的帖子?
  3. 作为新加入者,我应该关注哪些专家?
  4. 人们对航空公司或机场最差或最好的评价是什么?

利用收集到的数据,我们现在能够将上面的初始业务问题转化为具体的数据解释问题:

  1. 每月发布多少帖子?新冠肺炎之后,2020 年初的职位减少了吗?是否也有某种迹象表明,加入平台的人越来越少,无法旅行?
  2. 点赞数排名前 10 的帖子有哪些?
  3. 谁发布的帖子最多,平均收到的赞也最多?这些是我应该定期关注的用户,以便看到最好的内容。
  4. 对每个帖子进行情感分析,结合命名实体识别来识别城市/机场/航空公司,会产生有趣的正面或负面评论吗?

对于 Vielfliegertreff 项目,人们可以肯定地说,这些年来职位一直呈下降趋势。从 2020 年 1 月开始,我们可以清楚地看到新冠肺炎的职位数量迅速减少,当时欧洲正在关闭边境,这也严重影响了旅行:

按月创建的帖子。(图表由作者提供)

此外用户注册在过去几年里一直在下降,自 2009 年 1 月开始以来,论坛似乎越来越看不到它的快速增长:

几个月来注册用户的数量。(图表由作者提供)

最后但同样重要的是,我想检查一下最受欢迎的帖子是关于什么的。不幸的是,这是在德国,但这确实是一个非常有趣的帖子,一个德国人被允许在美国航空母舰上度过一段时间,并在 C2 飞机上体验了弹射起飞。帖子里有一些非常好看的图片和有趣的细节。如果你懂一些德语,请随意查看这里的:

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

Vielfliegertreff 上最受欢迎帖子的图片样本(图片由flekenmann提供)

第五步:通过博客或网络应用分享你的作品

完成这些步骤后,您可以更进一步,创建一个对某些数据点进行分类或预测的模型。对于这个项目,我没有进一步尝试以特定的方式使用机器学习,尽管我有一些关于对与某些航空公司相关的帖子的情感进行分类的有趣想法。

然而,在另一个项目中,我模拟了一个价格预测算法,允许用户获得任何类型拖拉机的价格估计。该模型随后被部署了 awesome streamlit 框架,可以在这里找到(请耐心加载,它可能会加载得慢一点)。

另一种分享你作品的方式是像我一样,在 Medium、 HackernoonKDNuggets 或其他热门网站上发表博文。写博文的时候,关于作品集项目或者其他话题,比如 牛逼的交互 AI 应用 ,我总是尽量让它们变得有趣,视觉化,互动性。以下是我的一些最佳建议:

  • 为了容易理解和打破一些长文本包括漂亮的图片
  • 包括互动元素,比如让用户互动的推文或视频
  • 通过 airtable 或 plotly 等工具和框架,将枯燥的表格或图表转变为交互式的表格或图表

结论& TLDR

想出一个博客帖子的主意,来回答你的一个紧迫问题或者解决你自己的问题。理想情况下,这个话题的时机是相关的,并且在之前没有被任何人分析过。根据你的经验、网站结构和复杂程度,选择一个最适合抓取工作的框架。在数据清理期间利用现有的库来解决棘手的数据清理任务,如解析时间戳或清理文本。最后,选择如何最好地分享你的作品。在成为数据科学家的征途上,一个交互式部署的模型/仪表板或者一篇写得很好的中型博客文章都可以让你与其他申请者区分开来。

一如既往,请随时与我分享一些伟大的数据科学资源或您的一些最佳组合项目!

成为数据产品经理的分步指南

原文:https://towardsdatascience.com/a-step-by-step-guide-to-becoming-a-data-product-manager-c1ad6d111160?source=collection_archive---------2-----------------------

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

林赛·亨伍德在 Unsplash 上的照片

在当今快速发展的世界中,技术比以往任何时候都占主导地位。随着越来越多的产品变得数字化,产生和收集的数据量也在增加,与数据相关的就业机会也在增加。

在当今的全球市场上,一个正在崛起的角色——产品经理。角色一直呈指数级增长,让您在管理产品和人员的同时又能接近数据的角色叫什么?数据产品经理—拥有数据科学和分析以及产品管理经验的专业人士是一个巨大的机会!

整个夏天,我发现了对产品管理的热情。我希望磨练一个下午的技能,正如他们所说,做一个“副业”。当我完成 Udacity 的产品经理 nanodegree 时,我正在探索数据中的 PM 角色:责任、技能、产品和工具。

随着数据访问量的增加,产品经理现在有机会利用数据优势,不仅增强现有产品,而且创造全新的产品。

在这篇博客中,我们试图了解数据产品经理在组织中的角色,以及他们如何利用数据科学、机器学习和人工智能来解决问题。

谁是数据产品经理?

你和其他任何产品经理都差不多,指导一个产品的成功,领导负责改进产品的跨职能团队;这里补充一点:你把数据放在你所做的一切的核心。

数据项目经理负责基于先进的数据驱动洞察设计产品和功能,使用 viz 工具可视化数据以进行统计分析,并通过假设测试和建模确定变量之间的独特关系。

旁注:一个好的数据产品经理角色更适合职业生涯中期的角色。

责任

数据产品经理的主要职责是分析市场数据,以提出新产品机会。

  1. 利用市场知识数据促进产品开发
  2. 应用数据科学技术、数据工程流程和市场实验测试来交付定制的产品体验
  3. 利用数据仓库和可视化的强大功能为产品战略提供信息
  4. 开发数据管道和仓储策略,准备从产品中收集的数据,以便进行稳健的分析
  5. 学习评估实时产品数据的技术,包括如何设计和执行各种 A/B 和多变量测试来塑造产品的下一个迭代
  6. 评估统计分析中捕获的输出,并将其转化为洞察,为产品决策提供信息

如何准备成为数据 PM!?

数据项目经理是专注于构建数据产品的多学科团队的一部分,对产品领域有兴趣和资质。

1.了解如何管理数据团队的复杂性

在任何组织中,数据科学团队都是不同业务部门的交叉部门,并在其感兴趣的特定领域内开展工作。话虽如此,数据科学团队都非常不同。

  1. 理解业务需求、团队目标和每个团队成员的动机
  2. 使用已建立的学习-计划-测试-测量流程,找到将数据输入产品的方法
  3. 根据所考虑的产品扩展数据科学团队
  4. 评估 DS 团队在产品决策过程中的作用
  5. 培养跨职能团队协作:让来自营销、设计、工程师的不同人员加入您的团队,与数据和 PM 团队紧密合作。

2.了解数据产品的生命周期和发展

数据生命周期管理是一个团队在组织中控制数据的过程。

当在团队中处理涉及数据的产品、解决方案或服务时,重要的是每个团队成员都了解从构思到需求收集、理解、项目规划、实现、迭代、评估和发布的产品生命周期。

数据产品的生命周期只是对产品生命周期的一种增强,只是数据的细微差别:可以是敏捷模型或瀑布模型,这取决于业务需求,但这无疑在您成为数据 PM 的过程中扮演着重要的角色。

  1. 数据采集
  2. 数据准备
  3. 假设和建模
  4. 评估和解释
  5. 部署
  6. 操作
  7. 最佳化
  8. 发动

3.磨练你的技术知识:统计、SQL、机器学习

当你是一个产品经理时,你需要学习和了解产品生命周期中所有方面的知识。同样适用于数据 PM。

数据是一种力量,它允许企业和利益相关者做出明智的决策,并利用数据为他们的产品解决问题。

从理论上来说,了解数据概念、统计学:至少回归和相关之间的区别、机器学习算法、何时使用什么模型的人,可以被定义为“好的”数据 PM。

高效数据产品管理的方法是不断学习。正如埃隆·马斯克所说,(在互联网上)学习是免费的;更多的是对学习的追求。任何人都可以用数据做一些普通的事情。区别线是你能比 x 人做得多好。

4。提高你的分析能力

产品经理是典型的问题解决者。不可避免地,当出现问题时,产品经理将需要分析技能来解决问题或改变方向。

了解你的技术团队正在发生什么是不可避免的。数据产品经理必须能够以熟练的技术进行分析和思考。

并不是说数据项目经理需要专注于具体的技术细节,但重点肯定应该更多地放在他们如何看待、分析问题,以及用强大的分析技能处理问题。

在产品及其管理的背景下,数据 PM 也做大量的分析:从创建定制的仪表板、报告工具来帮助表面到在整个组织中共享见解。数据项目管理的利益相关者多种多样,从精明的数据科学家到高管等只读消费者。

5.发展情商

随着我与职场人士的接触越来越多,我每天都在阅读情商的重要性。

“情商是理解和管理情绪的能力.”

情商涉及的技能有自我意识、自我调节、动机、同理心和社交技能。

我认为,情商之所以成为热门词汇,是因为它包含了人类情感在工作中的细微差别。这种东西正引领着员工之间更好的协作和更快乐的工作场所。随着全球化,情商比以往任何时候都更加重要,越来越多的团队变得跨文化和全球化,增加了情感互动及其表达方式的复杂性。

简而言之,情商就是理解、表达和管理与同龄人的良好关系,即使在压力下也能高效解决问题。

6.数据叙事

当我们谈论数据产品时,显然需要以能够帮助客户了解信息并做出更明智决策的方式向客户呈现数据。最优秀的产品经理将能够让数据看起来简单而吸引人,尽管其背后有很多复杂性。

当数据产品成功时,它们解决了客户、利益相关者的担忧,同时也产生了新的问题。然而,一个精通数据的项目经理将围绕产品创造一个故事,定义一个路线图,在产品推出之前,随着客户对数据变得更加聪明,该路线图将理解并结合客户的需求。

7.通过在职学习成为产品经理

你可能已经从一名初级数据科学家,甚至是一个对数据和产品管理充满热情的 SDE 角色开始了你的旅程。在工作中,你在工作中积累技能和经验。这无疑是一条缓慢的道路,但却是成为成功产品管理的最有效途径。

如果你没有或不能接受从事产品工作的专业培训,探索成为自由职业项目的产品经理的机会,或者作为副业参与公司的生产过程。

这就是我的博客的结尾。感谢您的阅读!我希望这有助于理解数据产品经理的角色。请务必让我知道你是否是一名数据项目经理,你正在寻找或已经学习或探索什么技能。

如果你喜欢阅读这样的故事,并希望支持我成为一名作家,可以考虑使用这个链接注册成为一名媒体会员(我可以赚取一小笔佣金,而不需要你额外付费!)

免责声明:本文表达的观点仅代表我个人,不代表严格的观点。

了解你的作者

拉什是芝加哥伊利诺伊大学的研究生。她喜欢将数据可视化,并创造有见地的故事。当她不赶着赶学校的最后期限时,她喜欢喝一杯热巧克力,写一些关于技术、UX 等的东西。

使用 Python 下载漫画的分步指南

原文:https://towardsdatascience.com/a-step-by-step-guide-to-download-manga-comic-using-python-581c10d732b9?source=collection_archive---------24-----------------------

网页抓取/ 采集

技术可以用来解决我们的日常问题。

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

奥拉夫·阿伦斯·罗特内Unsplash 上拍摄的照片

那些不熟悉漫画和动漫的人,让我为他们澄清一些事情。在日本文化中,漫画是包含故事的漫画,其中有卡通人物的精髓。动漫是在漫画出版并流行到足以制作动画并从中获利后由漫画改编而成的。在日本,所有年龄的人都阅读漫画。

有一天,我开始看《一拳》动漫,因为我的一个动漫爱好者朋友推荐我在这个疫情尽情观看。我不经常看动漫。但是,我只看推荐的和在 IMDB 上有很高人气的。所以,它总共有两季,而且都完成了。但是,它有更多的季节来晚了,由于这个疫情,整个日本的动画制作已经停止。所以,我告诉我的朋友,我已经完成了两季,在等待第三季的时候,我不能保持我的渴望,他告诉我有一个网站,你可以在那里阅读漫画。它叫做mangapanda.com

我看到有太多的广告弹出来创收,这太分散注意力了。开始在漫画网站搜索《一拳》,开始看了一段时间。我厌倦了阅读,因为每次你看到主屏幕和广告都会让你心烦。

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

来源

作为一名电脑极客,我开始使用 web developer 工具分析该网站,默认情况下,任何 web 浏览器都可以通过按 CTRL+SHIFT+I 来使用该工具。我发现该网站的主项目容器(包含漫画图像)有一个 HTTPS 链接。jpg 格式。

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

来源:(在网站上按 CTRL+SHIFT+I,选择图片查看此菜单)

点击该链接在浏览器中打开图像,没有广告。但是每次打开切换工具然后点击链接听起来很乏味,对吗?。于是,一个念头涌上心头,有没有办法把这些图像和其他图像在延续中提取出来?事实证明,在这种情况下,网络搜集会有所帮助。啊,我听说过它,但是从来没有时间使用它。

使用我们的大脑和编码技巧来解决问题的时候到了。

为此,我使用了 google-colab。如果你对它不熟悉的话 查一下 这个就出来了!

第一步:

引进必要的图书馆来建立我们自己。

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

来源:(美容)+ Colab( 代码)

第二步:

我们会将所有的 HTTPS 图片链接保存在 img[] 中。

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

来源:(美容)+ Colab( 代号)

漫画的每一部分总共有两个 for 循环。

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

来源:来自我笔记本电脑的截图

回路的第一个是零件号,回路的第二个是段号。在上面的例子中,它是第 135 部分和一拳漫画的第 5 部分。

在上面的代码中,我使用了 range (1,2) 来提取漫画的第一部分,在第二个循环中使用了 range (1,200) ,因为这部漫画的任何部分都没有超过 200 页。

使用请求库获取页面的链接,如果 URL 存在,使用漂亮的汤库解析它,并将这个解析包含在 page_content 中。这个页面 _ 内容页面的所有信息都以 HTML 标签的形式出现。

我们的图像链接在 *page_content 的一个脚本标签中。*因此,我们提取所有的脚本标签并添加到一个名为 *row_data 的列表中。*我们发现索引号 2 有我们的图像,所以我们使用正则表达式提取图像并添加到 img[] 。对我来说这是一个困难的部分,因为我对它不熟悉。

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

来源:(美容)+ Colab( 代号)

现在我们有了 img[]中的所有图像,所以我们剩下的就是使用我们在 starting 中导入的文件库来下载它(从 google.colab 导入文件)

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

来源:来自我笔记本电脑的截图

(注意:如果您使用另一种环境来下载图像,方法会有所不同。可以用 wget 下载)。

现在,你可以把所有这些图片做成 PDF 格式,开始阅读没有任何广告的漫画。万岁!!

如果你想下载你最喜欢的漫画,那么去漫画熊猫网站,获取网址并粘贴到网址变量中。

链接到 colab 笔记本

我相信它会对你有用,你会从这篇文章中有所收获。直到那时快乐编码!!

获得基线算法的逐步指南

原文:https://towardsdatascience.com/a-step-by-step-guide-to-getting-your-baseline-algorithm-5bba1b7ce047?source=collection_archive---------15-----------------------

在任何给定的数据科学解决方案中获得基准算法的逐步过程。

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

第一步

确定你的商业目标。我们最成功的目标(推动最大价值)是可衡量的、可操作的、可行的,并直接影响业务。例如,一个好的初始目标是“让我们建立一个算法模型,在评估我们业务的未来客户时,帮助我们识别坏客户和好客户”。假设我们有一个数据字典,它定义了潜在好客户和潜在坏客户的标准。

步骤 1a:

**建立你的评价标准。**什么指标将为我们提供实现业务目标所需的洞察力?例如,“我们想衡量我们的算法有多精确?”

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

第二步

采集数据&开始分析

从任何来源提取数据(这本身就是一个过程,并不是本文的基础)。成功导入文件后,观察列数、行数、列名等。仔细看看,检查各个列的名称,是否清楚您正在查看哪种数据?为什么或为什么不?在开始挖掘细节之前,先从高层次的概念上审视您的数据。即使您发现您的数据特别“脏”或不清楚,了解所有事物是如何联系在一起的也是很重要的。

步骤 2a:

确定它是数值型还是分类型。你的变量类型是什么?是正态分布吗?如果数据是分类的,那么你的数据是有序的还是名义的?如果你的数据是数值,你的数值是离散的还是连续的?我建议在你的 Jupyter 笔记本上记下这些信息,例如,通过注释(这里用#comment)。

步骤 2b:

确定您的数据是否有异常值。为了对您的数据进行适当的计算,您需要尽可能地将其标准化。去掉无关的数据点将有助于你的数据结构不会过于倾斜。

步骤 2c:

识别缺失值(如有)。通常,我们使用平均值,有时是中值或众数来给出最佳值,以填充数据集中的任何空白。

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

第三步

分割数据80/20 或 75/25,其中 80%或 75%是您的训练集,20%或 25%是您的测试集。你不需要在你所有的东西上训练你的算法——你的算法需要新的原始数据来测试。我们使用样本在新的东西上测试模型(模型以前没有见过这个数据)。我们基于训练数据集建立我们的预测结果。通过将我们的预测结果与测试数据集进行比较,我们可以衡量该算法的真正实力。

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

为了获得我们可以进行计算和预测的标准化数据,我们必须以各种方式清理数据。

第四步

对训练数据进行规范化和‘清洗’。填充缺失值、剩余的异常值以帮助规范化数据,以便您可以正确地使用它。

步骤 4a:

**对测试数据进行规范化和‘清洗’。**虽然这种方法可能被视为更加繁琐,但它被认为是将测试数据集与训练数据集分开进行清理的最佳实践——它有助于避免过度拟合。过度拟合是指当预测数据与历史数据过于接近时,模型中出现的错误。

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

第五步

建模阶段。确定哪些类型的模型,这取决于我们寻求应用哪种机器学习类型。我们自问,是分类问题,回归问题,还是无监督学习问题?

一旦确定,实现模型。在这里,您可以选择属于您的“问题类型”的 3-4 种不同的算法。

基本算法分解

分类:随机森林、朴素贝叶斯、逻辑回归、梯度推进、K 近邻。

**回归:**山脊、套索、弹性、网状、线性、非线性(这些算法不要与分类算法混淆,因为它们是回归算法——随机森林回归器、梯度推进回归器、K-最近邻回归器)。

**无监督学习:**降维((SVD:奇异值分解,PCA:主成分分析,LDA:潜在狄利克雷分配))、K-Means((分层的,基于密度的,基于距离的))。

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

第六步

**训练你的算法。**从上面的列表中选择,根据训练数据集训练你的算法。

第七步

**做个预测。**采用经过训练的算法,通过将您的预测结果应用到测试数据集来进行预测。接下来,我们将获取预测结果或输出,并对其进行分析。

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

第八步

**评估。**获取测试结果,并将其与真实值进行比较。将预测值与真实值进行比较的行为被归类为评估模型。一旦进行了比较,我们就会看到我们之间的差距(即准确度得分度量告诉我们有多远)。如果你的评价低于你的门槛,你应该高兴!如果您的预测结果非常不准确,也许您在第一次运行时看到了极高的准确度,您将不得不返回并检查您的数据和所做的任何调整。当您没有看到您希望的指标时,首先在内部解决您的问题,检查您是如何清理数据的,以确保您没有遗漏任何东西。尝试一种不同的算法,使用您可能创建的任何函数或新列或数据集。一旦你可以自信地确认你的过程和算法是合理的,然后从外部寻找不同的数据来源——也许有一些开源数据可以支持你的预测模型?

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

第九步

**特色工程。**如果你穷尽了所有不同类型的数据,穷尽了所有不同类型的算法,那么就开始特征工程。最好的做法是,一旦你开始第二轮,就开始特征工程。制作笔记本的副本,并开始在副本上重新制作模型,这样您就可以比较和对比过程差异和输出差异。创建新功能不是一件轻而易举的事情,所以要坚持做下去,并花时间进行评估。

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

第十步

把你的发现和分析放在一起。用一种最能引起受众共鸣的方式传达你的发现。考虑一个 Keynote、PowerPoint、Google Slides 演示文稿,它以一种有意义但易于理解的方式概括了你的发现,让你的业务伙伴能够最好地综合所有已经完成的工作。

Python 中的交互式 Choropleth 地图

原文:https://towardsdatascience.com/a-step-by-step-guide-to-interactive-choropleth-map-in-python-681f6bd853ce?source=collection_archive---------21-----------------------

学习使用 Python 的叶库轻松开发 Choropleth 地图

Choropleth 地图是最有趣和最有用的可视化工具之一。它们很重要,因为它们可以提供地理位置信息,它们看起来很漂亮,在演示中能吸引注意力。几个不同的库可以用来做这件事。在本教程中,我将使用叶。

什么是 choropleth 地图?

这是来自维基百科的定义:

Choropleth 图提供了一种简单的方法来可视化一个地理区域内的测量值如何变化,或显示一个区域内的可变性水平。一张热图是一张类似但不使用先验地理区域。它们是最常见的专题地图类型,因为发布的统计数据(来自政府或其他来源)通常被聚合到众所周知的地理单元中,如国家、州、省和县,因此使用 GIS电子表格或其他软件工具创建它们相对容易。

用简单易懂的话来说,choropleth 地图是通过在地图上使用颜色来显示地理位置信息的地图。看下面的一些图片,获得更多的理解。

数据准备

数据准备是所有数据科学家的一项重要而普遍的任务。我在这里使用的数据集相当漂亮和干净。但是对于这个可视化,我仍然需要做一些工作。让我们导入必要的库和数据集。

import pandas as pd
import numpy as npdf = pd.read_excel('[https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/DV0101EN/labs/Data_Files/Canada.xlsx'](https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/DV0101EN/labs/Data_Files/Canada.xlsx'),
                     sheet_name='Canada by Citizenship',
                     skiprows=range(20),
                     skipfooter=2)

我不能在这里显示数据集的截图,因为它太大了。我鼓励你自己运行代码。这是唯一的学习方法。

该数据集包含从 1980 年到 2013 年有多少来自世界不同国家的移民来到加拿大。让我们看看数据集的列名,以了解该数据集包含的内容:

df.columns#Output:
Index(['Type', 'Coverage', 'OdName', 'AREA', 'AreaName', 'REG', 'RegName', 'DEV', 'DevName', 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013],
dtype='object')

我们要绘制每个国家从 1980 年到 2013 年的移民总数。

我们需要国名和年份。从数据集中删除一些不必要的列。

df.drop(['AREA', 'REG', 'DEV', 'Type', 'Coverage', 'AreaName', 'RegName', 'DevName'], axis=1, inplace=True)

“OdName”列是国家的名称。为了便于理解,将其重命名为“国家”。

df.rename(columns={'OdName':'Country'}, inplace=True)

现在,做一个“总数”栏,这是每个国家所有年份的移民总数。

df['Total'] = df.sum(axis=1)

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

看,我们在最后有“总计”栏。它给出了每个国家的移民总数。

记住将这个设置为 1 是很重要的。它说求和操作应该是跨列的。否则,它将跨行求和,我们将得到每年的移民总数,而不是每个国家的移民总数。

基本 Choropleth 图

我将在这里展示,如何一步一步地绘制出一张 choropleth 地图。进口叶。如果您没有 lyum,请在 anaconda 提示符下运行以下命令进行安装:

conda install -c conda-forge folium

现在导入叶子,生成世界地图。

import folium
world = folium.Map(location=[0,0], zoom_start=2)

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

现在在这个世界地图中,我们将设置我们的数据。但它也需要包含每个国家坐标的地理数据。从此链接下载地理数据。我已经下载并把它放在了我在本教程中使用的笔记本所在的文件夹中。我现在只需要看那份文件。

wc = r'world-countries.json'

对于这张 choropleth 地图,你需要传递

  1. 我们在上面保存为“wc”的地理数据,
  2. 数据集,
  3. 我们需要从数据集中使用的列,
  4. 来自地理数据的“钥匙开启”参数。“key_on”参数的值始终以“feature”开头。然后,我们需要添加我们保存为“wc”的 geo_data 中的键。那个 JSON 文件太大了。因此,我展示了其中的一部分来解释 key_on 参数:
{"type":"Feature","properties":{"name":"Afghanistan"},"geometry":{"type":"Polygon","coordinates":[[[61.210817,35.650072],[62.230651,35.270664],[62.984662,35.404041],[63.193538,35.857166],[63.982896,36.007957],[64.546479,36.312073],[64.746105,37.111818],[65.588948,37.305217],[65.745631,37.661164],[66.217385,37.39379],[66.518607,37.362784],[67.075782,37.356144],[67.83,37.144994],[68.135562,37.023115],[68.859446,37.344336],[69.196273,37.151144],[69.518785,37.608997],[70.116578,37.588223],[70.270574,37.735165],[70.376304,38.138396],[70.806821,38.486282],[71.348131,38.258905],[71.239404,37.953265],[71.541918,37.905774],[71.448693,37.065645],[71.844638,36.738171],[72.193041,36.948288],[72.63689,37.047558],[73.260056,37.495257],[73.948696,37.421566],[74.980002,37.41999],[75.158028,37.133031],[74.575893,37.020841],[74.067552,36.836176],[72.920025,36.720007],[71.846292,36.509942],[71.262348,36.074388],[71.498768,35.650563],[71.613076,35.153203],[71.115019,34.733126],[71.156773,34.348911],[70.881803,33.988856],[69.930543,34.02012],[70.323594,33.358533],[69.687147,33.105499],[69.262522,32.501944],[69.317764,31.901412],[68.926677,31.620189],[68.556932,31.71331],[67.792689,31.58293],[67.683394,31.303154],[66.938891,31.304911],[66.381458,30.738899],[66.346473,29.887943],[65.046862,29.472181],[64.350419,29.560031],[64.148002,29.340819],[63.550261,29.468331],[62.549857,29.318572],[60.874248,29.829239],[61.781222,30.73585],[61.699314,31.379506],[60.941945,31.548075],[60.863655,32.18292],[60.536078,32.981269],[60.9637,33.528832],[60.52843,33.676446],[60.803193,34.404102],[61.210817,35.650072]]]},"id":"AFG"}

在 properties 键中,我们有国家的名称。这就是我们需要传递的。因此,key_on 参数的值将是“feature.properties.name”。

5.我还将使用一些样式参数:fill_color、fill_opacity、line_opacity 和 legend_name。我觉得这些都是不言自明的。

这是我们第一张 choropleth 地图的代码:

world.choropleth(geo_data=wc,
                data=df,
                columns=['Country', 'Total'],
                key_on='feature.properties.name',
                fill_color='YlOrRd',
                fill_opacity=0.8,
                line_opacity=0.2,
                legend_name='Immigration to Canada'
                )
world

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

这张地图是互动的!你可以用鼠标导航。而且,它会随着强度改变颜色。颜色越深,越多的移民从那个国家来到加拿大。但是黑色意味着没有可用的数据或者没有移民。

添加图块

这张地图可能看起来有点平面。我们可以用瓷砖让它看起来更有趣:

world_map = folium.Map(location=[0, 0], zoom_start=2, tiles='stamenwatercolor')
world_map.choropleth(geo_data=wc,
                     data=df,
                     columns=['Country', 'Total'],
                     threshold_scale=threshold_scale,
                     key_on='feature.properties.name',
                     fill_color='YlOrRd',
                     fill_opacity=0.7,
                     line_opacity=0.2,
                     legend_name='Immigration to Canada'
                    )

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

是不是更好看!我们可以通过使用一些瓷砖来使它变得更有趣,这将为我们提供根据需求更改瓷砖的选项。我们将使用 follow 的 TileLayer 方法在地图上添加不同的平铺层。最后,我们还将包含 LayerControl 方法,以获得更改图层的选项。

world = folium.Map(location=[0, 0], zoom_start=2, tiles='cartodbpositron')
tiles = ['stamenwatercolor', 'cartodbpositron', 'openstreetmap', 'stamenterrain']
for tile in tiles:
    folium.TileLayer(tile).add_to(world)

world.choropleth(
    geo_data=wc,
    data=df,
    columns=['Country', 'Total'],
    threshold_scale=threshold_scale,
    key_on='feature.properties.name',
    fill_color='YlOrRd', 
    fill_opacity=0.7, 
    line_opacity=0.2,
    legend_name='Immigration to Canada',
    smooth_factor=0
)folium.LayerControl().add_to(world)
world

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

看,在传说的右上角下面,有一堆瓷砖。如果你点击它,你会得到一个列表。您可以在那里更改瓷砖样式。我觉得这个选项很酷!

添加信息标签

最后,我想向您展示另一个有用且有趣的选项。那就是使用一个信息标签。我们不能指望每个人通过看地图就知道国家的名字。地图上有国家的标签会很有用。我们会让它变得有趣。Folium 有一个名为“GeoJsonTooltip”的功能可以做到这一点。首先,我们需要像往常一样制作世界地图。将所有参数添加到其中并保存在一个变量中。然后使用带有 add_child 方法的“GeoJsonTooltip”添加此附加功能。这是完整的代码。

world = folium.Map(location=[0,0], zoom_start=2, tiles='cartodbpositron')
choropleth = folium.Choropleth(geo_data=wc,
    data=df,
    columns=['Country', 'Total'],
    threshold_scale=threshold_scale,
    key_on='feature.properties.name',
    fill_color='YlOrRd', 
    fill_opacity=0.7, 
    line_opacity=0.2,
    legend_name='Immigration to Canada',
).add_to(world)choropleth.geojson.add_child(
    folium.features.GeoJsonTooltip(['name'], labels=False))
world

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

注意,我把光标放在法国,它显示法国这个名字。同样的方法,你可以把光标放在地图上的任何地方,得到这个地方的名字。

结论

我想展示如何开发一个交互式 choropleth 地图,设计它的样式,并向它添加信息标签。我希望它有帮助。

阅读推荐

** [## Python 中的交互式地理空间数据可视化

绘制世界特定地区的地图,在地图上展示活动,并四处导航

towardsdatascience.com](/interactive-geospatial-data-visualization-in-python-490fb41acc00) [## 使用 Python 的 Matplotlib 的华夫饼图表

如何使用 Matplotlib 库在 Python 中绘制华夫饼图表

towardsdatascience.com](/waffle-charts-using-pythons-matplotlib-94252689a701) [## Matplotlib 中的气泡图

通过使用 Python 的 Matplotlib 库的例子学习绘制气泡图

towardsdatascience.com](/bubble-plots-in-matplotlib-3f0b3927d8f9) [## 用于数据建模的探索性数据分析

如何了解数据集,定义因变量和自变量,计算相关系数…

towardsdatascience.com](/exploratory-data-analysis-intro-for-data-modeling-8ff019362371) [## 置信区间的完整指南,以及 Python 中的示例

对统计学中一个非常流行的参数——置信区间及其计算的深入理解

towardsdatascience.com](/a-complete-guide-to-confidence-interval-and-examples-in-python-ff417c5cb593) [## 在 Python 中生成任意形状的单词云

学习生成一个单词云,设计它的样式并使用自定义形状

towardsdatascience.com](/generate-word-clouds-of-any-shape-in-python-e87f265f6352)**

在 macOS/Linux 上运行 Cron 和 Launchd 的完整指南

原文:https://towardsdatascience.com/a-step-by-step-guide-to-scheduling-tasks-for-your-data-science-project-d7df4531fc41?source=collection_archive---------2-----------------------

编程;编排

计划任务的逐步指南

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

左图由 Unsplash 上的 Mindspace 工作室拍摄。作者的正确图像

**Table of contents**[**Introduction**](#7f32)1\. [Papermill and terminal-notifier](#b73c)
2\. [cron for Linux/macOS](#919e)
3\. [launchd for macOS](#bfcb)

[**Conclusion**](#c03d)

[更新:2021 年 5 月 28 日]

介绍

你有一个需要你每天花费时间的数据科学项目吗?您是否使用每天更新的数据馈送?例如,约翰霍普金斯大学 CSSE 分校的 2019 新型冠状病毒新冠肺炎(2019-nCoV)数据仓库每天更新,我在我的个人项目中使用它。

我手动启动 Jupyter,打开一个项目,重启内核并运行所有单元,然后 git add/commit/push。这是一点工作。在本文中,我将分享为您的数据科学项目设置launchdcron作业的一步一步的过程,这样它将在后台自动更新您的项目,甚至通知您。

用于 Linux/macOS 的**cron** 和用于 macOS 的 **launched**

虽然 launchd 是 macOS 中的首选方法,但是cron方法在 macOS 中也同样适用。

cron是一个 Linux 实用程序,它可以安排服务器/计算机上的命令或脚本在指定的时间和日期自动运行。cron 作业是计划任务,它对于自动化重复任务非常有用。

launchd 是苹果公司创造的,是许多 Unix 工具的替代品,如croninetdinit

看完这篇文章,你就可以开始安排任务了,节省了你很多宝贵的时间。

** [## 用 Jupyter 笔记本写作的 7 个基本技巧

第一篇数据科学文章指南

towardsdatascience.com](/7-essential-tips-for-writing-with-jupyter-notebook-60972a1a8901) [## 手把手的 Jupyter 笔记本黑客

您应该使用的技巧、提示和快捷方式

towardsdatascience.com](/hands-on-jupyter-notebook-hacks-f59f313df12b)

步骤 0:造纸厂和终端通知程序

造纸厂

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

造纸厂标志

Papermill 是一个参数化和执行 Jupyter 笔记本的工具。我可以用它在 cron 和 launchd 作业文件中运行 Jupyter 笔记本文件。

$ pip install papermill

或者

$ pip3 install papermill$ papermill --help

你可以在这里找到命令行界面帮助。

造纸厂的用途:

papermill [OPTIONS] NOTEBOOK_PATH OUTPUT_PATH

我很快会给你看一个例子。

终端通知程序

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

运行中的终端通知程序。作者图片

终端通知器是一个发送 macOS 用户通知的命令行工具。当计划的作业完成时,我将用它来通知我。

安装终端通知程序。

$ brew install terminal-notifier
$ terminal-notifier -help

[## 终端改造的终极指南

今天你将度过的最好的 11 分钟:程序员的终端提示

towardsdatascience.com](/the-ultimate-guide-to-your-terminal-makeover-e11f9b87ac99)

用于 Linux/macOS 的 cron

在 macOS 中,您可以通过两种方式定时运行后台作业:启动作业和 cron 作业。请注意,macOS v10.15 仍然支持它,尽管cron不是推荐的解决方案,并且launchd已经被取代。

步骤 1:设置 cron 作业

您可以使用您的用户名设置 cron 作业:

$ whoami
your-name$ sudo crontab -u your-name -e
Password:
sh-3.2#

您可以在 macOS 中使用sudo su来启用 root 用户,这样您就不需要输入密码了。

$ sudo su
$ crontab -u your-name -e

-u指定用户的名称。-e编辑当前的 crontab。

句法

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

cron 语法指南。作者图片

如上所述,添加五个数字和一个要执行的文件的路径。

示例:

0 10 * * * ~/DataScience/covid-19-stats/covid19-cron

上面会在每天 10:00 运行文件~/DataScience/covid-19-stats/covid19-cron

如果系统关闭或休眠,cron 作业不会执行。如果您错过了指定的时间,它将在您的系统打开时的下一个指定时间执行。

可以输出stdoutstderr:

# log stdout and stderr
42 6 * * * ~/DataScience/covid-19-stats/covid19-cron > /tmp/stdout.log 2> /tmp/stderr.log

>将标准输出重定向至/tmp/stdout.log,而>2将标准误差重定向至/tmp/stderr.log

一旦设置了 cron 作业,您可以列出它:

$ crontab -l
0 20 * * * ~/DataScience/covid-19-stats/covid19-cron

如果要删除所有 cron 作业:

$ crontab -r

您可以在 crontab 中添加多个 cron 作业。

0 20 * * * ~/DataScience/covid-19-stats/covid19-cron
0 7 * * * Path/to/file/to/execute
0 7 * * 0 Path/to/another/file/to/execute

crontab guru 是一个快速简单的 cron 计划工具。

步骤 2:编写 cron 作业

您可以将所有 cron 作业文件放在一个目录中,但是我将它放在项目根目录中。将当前工作目录更改为您的项目,创建一个 cron 作业文件,并在编辑器中打开它。根据谷歌风格指南,可执行文件不应该有.sh扩展名。

$ cd path/to/project
$ touch covid19-cron
$ vim covid19-cron

步骤 3:定义 shebang

脚本第一行中使用的 shebang 表示要执行的 UNIX/Linux 操作系统。

尽管 Papermill 和 terminal-notifier 在终端中工作,但我们需要添加它们的路径。

让我们找到他们。

$ which papermill
/usr/local/bin/papermill$ which terminal-notifier
/usr/local/bin/terminal-notifier

在我的 covid19-cron 文件中:

#!/usr/bin/env bash
# run covid-19 files 
# git add, comit and push

dir=/Users/shinokada/DataScience/covid-19-stats
papermill=/usr/local/bin/papermill
notifier=/usr/local/bin/terminal-notifier

cd $dir
$papermill covid-19-matplotlib.ipynb ./latest/covid-19-matplotlib.ipynb
# more files ...
$papermill covid-19-plotly.ipynb ./latest/covid-19-plotly.ipynb git add . 
git commit -m "update" 
git push
$notifier -title Covid19 -subtitle "Daily Updated" -message "Completed" -open "https://mybinder.org/v2/gh/shinokada/covid-19-stats/master"
now=$(date)
echo "Cron job update completed at $now"

我在根目录中创建“最新”目录。造纸厂将文件输出到这个“最新”目录。因为我们将使用 git,所以您需要确保在项目根目录中有.git

如果您使用的是%run somefile,我建议您将它们添加到 cron-file 中。

我使用titlesubstitlemessageopen作为终端通知器选项

终端通知程序快速指南

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

终端通知程序快速指南。作者图片

步骤 4:添加执行权限

这个 bash 文件需要权限才能执行。

$ chmod u+x covid19-cron

chmod设置文件权限。

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

chmod 用户指南。作者图片

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

chmod 行动指南。作者图片

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

chmod 权限指南。作者图片

chmod u+x covid19-cron允许用户执行 covid19-cron。

上述命令与以下命令相同:

$ chmod 744 covid19-cron

邮寄

在运行 cron 作业后,您的终端通过邮件发送其输出和错误消息。让我们检查一下 cron 的工作是否有效。

$ mail

你需要按回车键来阅读信息,然后按 q 和回车键退出。使用j查看下一行。你需要检查邮件是否没有错误。如果出现错误,您需要关注问题。

测试 cron 作业

您需要重置 crontab 时间来测试您的 cron 作业。launchd允许我们测试工作,但对于cron这是唯一的测试方式。

$ sudo crontab -u your-name -e# change time 
5 20 * * * ~/DataScience/covid-19-stats/covid19-cron
$ crontab -l
5 20 * * * ~/DataScience/covid-19-stats/covid19-cron

测试完成后,它会显示通知。

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

终端通知。作者图片

macOS 的启动

[launchd](https://www.launchd.info/)是一个统一的开源服务管理框架,用于启动、停止和管理守护程序、应用程序、进程和脚本。

如果您通过设置 StartCalendarInterval 键来计划一个启动的作业,并且计算机在该作业应该运行时处于睡眠状态,则您的作业将在计算机唤醒时运行。

然而,如果在作业本应运行时机器关闭,则作业不会执行,直到下一个指定时间出现。

步骤 1: plist 文件

一个 PLIST 文件是一个系统范围的和每个用户的守护进程/代理配置文件。守护程序/代理是在后台运行的程序,无需用户输入。你定义程序的名字,什么时候运行,你想运行什么,等等。您将所有 plist 文件存储在~/Library/LaunchAgents 目录中。

[Update.1]如果您没有~/Library/LaunchAgents,您需要创建它。

# check ~/Library if it has LaunchAgents
$ ls ~/Library
# if not create the directory
$ mkdir ~/Library/LaunchAgents

创建一个plist文件:

$ cd ~/Library/LaunchAgents
$ touch com.shinokada.covid19.plist

在 com.shinokada.covid19.plist 中:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>com.shinokada.covid19</string>
        <key>Program</key>
        <string>/Users/shinokada/DataScience/covid-19-stats/covid19-launchd</string>
        <key>EnvironmentVariables</key>
        <dict>
            <key>PATH</key>
            <string>/bin:/usr/bin:/usr/local/bin</string>
        </dict>
        <key>StandardInPath</key>
        <string>/tmp/covid.stdin</string>
        <key>StandardOutPath</key>
        <string>/tmp/covid.stdout</string>
        <key>StandardErrorPath</key>
        <string>/tmp/covid.stderr</string>
        <key>WorkingDirectory</key>
        <string>/Users/shinokada/DataScience/covid-19-stats</string>
        <key>StartCalendarInterval</key>
        <dict>
            <key>Hour</key>
            <integer>8</integer>
            <key>Minute</key>
            <integer>0</integer>
        </dict>
    </dict>
</plist>

在这里我每天早上八点跑/Users/shinokada/DataScience/covid-19-stats/covid19-launchd

plist 文件快速指南中的配置

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

plist 文件快速指南中的配置。更多关于发射配置。作者图片

步骤 2:创建 bash 文件

在项目根目录下创建一个名为 covid19-launchd 的文件。这与上面的covid19-cron非常相似。

#!/usr/bin/env bash
# run covid-19 files 
# git add, comit and pushpapermill covid-19-data.ipynb ./latest/covid-19-data.ipynb
papermill multiplot.ipynb ./latest/multiplot.ipynb 
# more files ...
papermill uk-japan.ipynb ./latest/uk-japan.ipynb 
papermill Dropdown-interactive.ipynb ./latest/Dropdown-interactive.ipynbgit add . 
git commit -m "update" 
git push
terminal-notifier -title Covid19 -subtitle "Daily Updated" -message "Completed" -open "[https://mybinder.org/v2/gh/shinokada/covid-19-stats/master](https://mybinder.org/v2/gh/shinokada/covid-19-stats/master)"
now=$(date)
echo "launchd update completed at $now"

因为我们在 plist 文件中设置了PATH EnvironmentVariables,所以我们不需要担心 Papermill 和终端通知程序的绝对路径。

你可以通过bash covid19-launchd测试一下是否有效。

步骤 3:添加执行权限

这个 bash 文件需要权限才能执行。

$ chmod u+x covid19-cron

步骤 4:测试 launchd

lauchctl控制 macOS 启动过程。它有liststartstoploadunload子命令。

为了我的案子;

$ launchctl list | grep covid
-  0  com.shinokada.covid19# test/debug 
$ launchctl start com.shinokada.covid19# if you need to stop
$ launchctl stop com.shinokada.covid19# load the job
$ launchctl load ~/Library/LaunchAgents/com.shinokada.covid19.plist# unload the job
$ launchctl unload ~/Library/LaunchAgents/com.shinokada.covid19.plist# get help
$ launchctl help

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

作者图片

再装

launchctl没有用于读取 config.plist 文件更改的 reload 命令。相反,您必须卸载然后重新加载 plist 文件,例如:

$ launchctl unload ~/Library/LaunchAgents/com.shinokada.covid19.plist$ launchctl load $_

$_!$一样,指的是前一条命令的最后一个参数。

如果您对脚本或 plist 进行了任何更改,请确保卸载并加载 plist。

启动快速指南

launchctl多个子命令,下图显示了重要的子命令。

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

启动快速指南。作者图片

结论

计划任务节省您的时间,并且易于设置。您不仅可以为您的数据科学项目设置它,还可以为您的日常工作设置它,例如更新节点包、自制公式等。如果你每天节省 3 分钟,一年就能节省 18 个小时以上!如果你有兴趣,可以在这里看到我的样本项目

通过 成为 会员,可以完全访问媒体上的每一个故事。

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

请订阅。

参考

[## 使用 Jupyter 笔记本进行版本控制

Jupytext 分步指南

towardsdatascience.com](/version-control-with-jupyter-notebook-b9630bc5996e) [## Jupyter 用户的生产力提示

使用 Jupyter 笔记本和 JupyterLab 让您的工作流程更加高效

towardsdatascience.com](/stepping-into-intermediate-with-jupyter-f6647aeb1184) [## 用 Jupyter 笔记本探索正态分布

使用 scipy 和 matplotlib 的正态分布初学者指南

towardsdatascience.com](/exploring-normal-distribution-with-jupyter-notebook-3645ec2d83f8)**

微软新闻推荐竞赛分步指南

原文:https://towardsdatascience.com/a-step-by-step-guide-to-the-microsoft-news-recommendation-competition-700ab00831a?source=collection_archive---------28-----------------------

微软新闻推荐大赛如何入门

本文作者是吴、易经纬、、应乔、和米盖尔冈萨雷斯-菲耶罗,他们都在微软工作。

介绍

新闻推荐已经成为许多新闻服务的关键机器学习技术,也是数百万人消费新闻时的重要体验。为了促进新闻推荐的公开研究,微软的几个团队最近发布了微软新闻数据集(MIND) ,并发起了微软新闻推荐竞赛。这篇博客文章提供了一个关于为竞赛中的新闻推荐问题开发一个算法,然后提交给竞赛进行评估的演练。这篇文章中描述的代码可以在微软推荐者 Github 知识库中找到。

竞争基准

为了帮助微软新闻推荐竞赛的参与者开始,我们提供了五个基线:深度知识感知网络(DKN)、长期和短期用户表示(LSTUR)、注意力多视图学习(NAML)、个人注意力(NPA)和多头自我注意力(NRMS)。这些模型在 MIND 上的性能在这篇 ACL 论文中进行了评估。在这篇博文中,我们以 NRMS 为例来说明提交过程,所有五个基线的代码都在微软推荐库上。

NRMS

NRMS 是一种基于内容的神经新闻推荐算法。它使用多头自我关注来捕捉单词之间的相关性以学习新闻表示,并捕捉之前点击的新闻文章之间的交互以学习用户表示。它还通过选择重要的单词和新闻,使用附加注意力来学习信息性新闻和用户表示,如下图所示。

关于算法的细节可以在本文中找到,核心的 NRMS 算法可以在这里找到。

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

NRMS 算法的体系结构

代码示例

我们提供了一本 Jupyter 笔记本来帮助参赛者开始学习 NRMS 算法。在笔记本中,首先下载思维数据集。为了训练 NRMS 模型,应该从竞争平台复制原始数据集。代码示例中的实用函数使这一步变得很方便。应该注意的是,用于比赛的数据集是“MINDlarge”集。建议先熟悉“MINDdemo”或“MINDsample”数据。

有关培训和评估流程的更多详细信息,请参见笔记本。为了确保结果符合提交要求,预测分数保存在压缩文件夹中以便上传。

服从思维竞赛

提交前应进行注册。关于注册的细节可以在这里找到。发送标题为**“头脑大赛报名”**的邮件至 mind[at]microsoft.com 并附上您的信息(CodaLab 账号昵称、真实姓名、联系邮箱和所属关系)以及您对微软头脑新闻推荐大赛官方规则的同意(请在邮件中写上“我同意微软头脑新闻推荐大赛官方规则”)。如果提供了完整的所需信息,注册将在一两天内获得批准,并将向参与者发送一封确认电子邮件。

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

确认电子邮件

一旦参与者的批准完成,就允许提交结果。竞赛分为两个阶段,即开发和测试阶段。在开发阶段,您可以将开发集上的结果提交到 Codalab 系统,以获得官方分数。在测试阶段,我们将发布测试集,您可以在截止日期前将您对它的预测结果提交给 Codalab。

在 CodaLab 上提交需要几个步骤:

  • 导航至“参与”。
  • 简要描述您的模型(可选)。

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

模型描述

  • 点击“提交”按钮。
  • 上传您提交的压缩文件。我们使用在前面步骤中获得的压缩文件夹(参见笔记本),在那里训练 NRMS 模型。

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

压缩提交

  • 等待评估状态变为“已完成”或“未通过”。下图显示了一个成功的提交。除了提交状态,系统还返回从模型评估中生成的分数。

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

提交结果

如果提交状态为“失败”,您可以单击“查看评分输出日志”,然后单击“查看评分错误日志”来查看调试日志。当评估完成后,您可以决定是否在排行榜上显示您的分数。

在开发阶段,参与者可以在验证集上上传他们的预测,并根据结果调整他们的模型。虽然这种提交不是强制性的,但我们强烈建议您提交,以防您在获得正常评估结果时遇到困难。对于那些不熟悉 CodaLab 的参与者来说,这也是一个有用的实践。

后续步骤

在我们的研究中,NRMS 在思想上超越了其他基线,但仍有可能改进:

  • 目前,我们不考虑单词和新闻的位置信息,但它们可能对学习更准确的新闻和用户表示有用。
  • 用户通常既有长期偏好,也有短期兴趣。然而,我们的方法只学习短期兴趣,即在当前印象之前从点击的新闻中学习用户表示。通过学习长期用户表征,我们可以将信息整合到多重印象中,从而潜在地获得更好的用户表征。
  • 最近,图形神经网络(GNNs)已经被证明在图形数据的学习上是强大的。一个基于用户行为的精心构建的图表可能会达到这个目的。

注册参加比赛,祝黑客快乐!

参考

1.微软推荐库:【https://github.com/microsoft/recommenders

2.心里话:【https://msnews.github.io/assets/doc/ACL2020_MIND.pdf】T4

3.注意 Azure 开放数据集:https://Azure . Microsoft . com/en-us/services/Open-Datasets/catalog/Microsoft-news-dataset/

Python 中 Web 抓取的分步指南

原文:https://towardsdatascience.com/a-step-by-step-guide-to-web-scraping-in-python-5c4d9cef76e8?source=collection_archive---------3-----------------------

抓取任何有请求和美丽声音的网页

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

照片由卡伊奥派克斯拍摄

作为数据科学家,我们总是在寻找新的数据和信息来分析和处理。现在查找数据的一个主要方法是在网上搜索特定的查询。

当我们浏览互联网时,我们会遇到大量的网站,这些网站在浏览器上显示各种数据。如果我们出于某种原因想要将这些数据用于某个项目或 ML 算法,我们可以——但不应该——手动收集这些数据。因此,我们将复制我们想要的部分,并将其粘贴到 doc 或 CSV 文件中。

[## 为您的应用选择最佳的 Python Web 抓取库

前 5 个库的概述以及何时使用它们。

towardsdatascience.com](/choose-the-best-python-web-scraping-library-for-your-application-91a68bc81c4f)

不用说,那将是一项相当乏味的任务。这就是为什么大多数数据科学家和开发人员使用代码进行网络搜集。编写代码从一个 100 美元的网页中提取数据比手工操作更容易。

Web 抓取是程序员使用的一种技术,用于在相对较短的时间内自动完成从互联网上查找和提取数据的过程。

说到网络抓取,最重要的问题是,它合法吗?

网络抓取合法吗?

简答,

更详细的答案是,在 2020 年 1 月下旬,出于非商业目的收集公共可用数据被宣布为完全合法。

你可能想知道,公开可用是什么意思?

公开可用的信息是任何人都可以在互联网上看到/找到的信息,而不需要特殊访问。因此,维基百科、社交媒体或谷歌搜索结果上的信息都是公开可用数据的例子。

现在,社交媒体有些复杂,因为它有一部分是不公开的,比如当用户将他们的信息设为私有时。在这种情况下,该信息是非法的要被抓取。

最后一点,公开的和有版权的是有区别的。例如,你可以取消 YouTube 的视频标题,但你不能将这些视频用于商业用途,因为它们是受版权保护的。

如何报废 web?

有不同的编程语言可以用来抓取 web,在每种编程语言中,都有不同的库来实现相同的目标。

那么,用什么呢?

在本文中,我将使用 Python请求BeautifulSoup 从维基百科中删除一些页面。

要从互联网上截取和提取任何信息,你可能需要经历三个阶段:获取 HTML,获得 HTML 树,然后从树中提取信息。

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

作者图片(使用 Canva 制作)

我们将使用请求库从特定的 URL 获取 HTML 代码。然后,我们将使用 BeautifulSoup 来解析和提取 HTML 树,最后,我们将使用纯 Python 来组织数据。

基本 HTML

在我们开始之前,让我们快速复习一下 HTML 基础知识。HTML 中的一切都是在标签中定义的。最重要的标签是,这意味着后面的文本是 HTML 代码。

在 HTML 中,每个打开的标签都必须关闭。所以,在 HTML 文件的末尾,我们需要一个结束标签

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

作者图片(使用 Canva 制作)

HTML 中不同的标签意味着不同的东西。使用标签的组合来表示网页。任何包含在开始和结束标签之间的文本被称为内部 HTML 文本

如果我们有多个具有相同标签的元素,我们可能——实际上,总是——想要以某种方式区分它们。有两种方法可以做到这一点,要么使用类,要么使用 id。id 是唯一的,这意味着两个元素不能有相同的 id。另一方面,类不是。多个元素可以有相同的类。

这里有 10 个你在浏览网页时会经常看到的 HTML 标签。

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

作者图片(使用 Canva 制作)

基本刮削

太棒了,现在我们知道了基础知识,让我们从小做起,然后逐步积累!

我们的第一步是通过在命令行中键入以下内容来安装 BeautifulSoup。

pip install bs4

为了熟悉抓取基础知识,我们将考虑一个示例 HTML 代码,并学习如何使用 BeautifulSoup 来探索它。

BeautifulSoup 不从网络上获取 HTML,但是它非常擅长从 HTML 字符串中提取信息。

为了在 Python 中使用上述 HTML,我们将它设置为一个字符串,然后使用不同的 BeautifulSoup 来探索它。

注意:如果您正在使用 Jupyter Notebook 来跟踪这篇文章,您可以键入以下命令在笔记本中查看 HTML。

from IPython.core.display import display, HTML
display(HTML(some_html_str))

例如,上面的 HTML 看起来会像这样:

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

接下来,我们需要将这个 HTML 馈送给 BeautifulSoup,以便生成 HTML 树。HTML 树是 HTML 代码不同层次的表示,它显示了代码的层次结构。

上面代码的 HTML 树是:

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

图片由作者提供(使用 Canva 制作)

为了生成树,我们编写

some_html_str = """
<HTML>
    <HEAD>
        <TITLE>My cool title</TITLE>
    </HEAD><BODY>
    <H1>This is a Header</H1>
    <ul id="list" class="coolList">
        <li>item 1</li>
        <li>item 2</li>
        <li>item 3</li>
    </ul>
</BODY>
</HTML>
"""
#Feed the HTML to BeautifulSoup
soup = bs(some_html_str)

变量soup现在有了从 HTML 字符串中提取的信息。我们可以使用这个变量从 HTML 树中获取信息。

BeautifulSoup 有许多函数可以用来提取 HTML 字符串的特定方面。不过,两个函数用得最多:findfind_all.

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

作者图片(使用 Canva 制作)

函数find只返回搜索查询的第一个匹配项,而find_all返回所有匹配项的列表。

比方说,我们正在搜索代码中的所有

头。

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

如你所见,find函数给了我< h1 >标签。标签什么的。通常,我们只想提取内部的 HTML 文本。为此,我们使用.text

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

这仅仅是因为我们只有一个

标签。但是如果我们想寻找列表项呢——在我们的例子中,我们有一个包含三项的无序列表——我们不能使用find。如果我们这样做,我们只会得到第一项。

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

为了找到所有的列表项,我们需要使用find_all

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

好了,现在我们有了一个项目列表,让我们回答两个问题:

1-如何获取列表项的内部 HTML?

为了只获得内部文本,我们不能使用。文本,因为现在我们有了一个元素列表,而不仅仅是一个。因此,我们需要遍历列表并获取每个列表项的内部 HTML。

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

2-如果我们在代码中有多个列表怎么办?

如果我们在代码中有不止一个列表——这是通常的情况——我们可以精确地搜索元素。在我们的例子中,列表有 id='list '和 class='coolList '。我们可以通过find_allfind函数使用这两个或一个函数来精确获取我们想要的信息。

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

这里需要注意的一点是findfind_all函数的返回是漂亮的一组对象,它们可以被进一步遍历。因此,我们可以像直接从 HTML 字符串中获取对象一样对待它们。

本节的完整代码:

我们可以使用其他漂亮的组函数遍历 HTML 树,比如childrenparentnext等。

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

作者图片(使用 Canva 制作)

抓取一个网页

让我们考虑一个更现实的例子,我们从一个 URL 获取 HTML,然后使用 BeautifulSoup 提取模式和数据。

我们将从获取一个网页开始。我喜欢咖啡,所以让我们试着通过咖啡生产获取列出国家的维基百科页面,然后使用 Pygal 绘制这些国家。

[## 用 Pygal 实现 Python 中的交互式数据可视化

一步一步的教程,创造惊人的可视化

towardsdatascience.com](/interactive-data-visualization-in-python-with-pygal-4696fccc8c96)

为了获取 HTML,我们将使用请求库,然后将获取的 HTML 传递给 BeautifulSoup。

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

如果我们打开这个 wiki 页面,我们会发现一个大表格,上面有各个国家和不同的咖啡产量指标。我们只想提取国家名称和咖啡产量

为了提取这些信息,我们需要研究页面的 HTML,以知道要查询什么。我们可以只突出显示一个国家名称,右键单击,然后选择检查

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

通过检查页面,我们可以看到国家名称和数量都包含在“table”标签中。由于它是页面上的第一个表,我们可以使用find函数来提取它。

然而,直接提取表格会给我们所有的表格内容,包括表头(表格的第一行)和不同度量的数量。

所以,我们需要微调我们的搜索。让我们与排名前 10 的国家一起尝试一下。

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

注意,为了清理结果,我使用了字符串操作来提取我想要的信息。

[## Python 中所有字符串格式的指南

关于 Python 中格式化字符串的五种方法,您只需要知道

towardsdatascience.com](/a-guide-to-everything-string-formatting-in-python-e724f101eac5)

我可以使用这个列表最终用 Pygal 绘制出前 10 个国家。

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

十大咖啡生产国

本节的完整代码:

抓取多个网页

哇,太多了!😃

但是,我们还没有写代码,碎片不同的网页。

在这一部分,我们将删除维基页面上的有史以来最好的 100 本书,然后我们将根据它们的类型对这些书进行分类。试着看看我们是否能找到流派和列表之间的关系——哪种流派表现得最好。

维基页面包含了这 100 本书的链接以及它们的作者。我们希望我们的代码导航列表,进入图书 wiki 页面,提取诸如流派、名称、作者和出版年份等信息,然后将这些信息存储在 Python 字典中——您也可以将数据存储在 Pandas 框架中。

因此,要做到这一点,我们需要几个步骤:

  1. 获取主 URL HTML 代码。
  2. 将 HTML 输入 BeautifulSoup。
  3. 从列表中提取每本书,并获得每本书的 wiki 链接。
  4. 获取每本书的数据。
  5. 获取所有书籍数据,整理并绘制最终结果。

让我们开始吧…

步骤#1:获取主 URL HTML 代码

url = '[https://en.wikipedia.org/wiki/Time%27s_List_of_the_100_Best_Novels'](https://en.wikipedia.org/wiki/Time%27s_List_of_the_100_Best_Novels')
page = rq.get(url).text

第二步:将 HTML 输入到 BeautifulSoup

soup = bs(page)

步骤#3:从列表中提取每本书,并获得每本书的维基链接

rows = soup.find('table').find_all('tr')[1:]
books_links = [row.find('a')['href'] for row in rows]
base_url = '[https://en.wikipedia.org'](https://en.wikipedia.org')
books_urls = [base_url + link for link in books_links]

步骤#4:获取每本书的数据

这是最漫长也是最重要的一步。我们首先只考虑一本书,假设它是列表中的第一本书。如果我们打开这本书的 wiki 页面,我们会在屏幕右侧的表格中看到这本书的不同信息。

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

浏览 HTML,我们可以看到所有的东西都存储在哪里。

为了使事情变得更容易和更有效,我编写了自定义函数来从该书的 wiki 中提取不同的信息。

现在,我们有了这些很酷的函数,让我们写一个函数来使用这些函数,这将帮助我们实现自动化。

在这个函数中,我使用了 try…除了格式,以避免崩溃,如果书的一些信息丢失。

步骤#5:获取所有书籍数据,清理并绘制最终结果

我们已经拥有了自动化代码并运行它所需的一切。

最后要注意的一件事:废弃维基百科是合法的,然而,他们不喜欢你每秒废弃一页以上。因此,我们需要在每次获取之间添加暂停,以避免破坏服务器。

数据收集完毕!这需要 100 秒才能完成,所以在你等待的时候,请随意做些别的事情😉

最后,让我们清理数据,获得流派计数,并绘制结果。

我们完了。

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

我不得不说,收集数据并不总是 100%准确,正如你在图中看到的,最长的柱属于“无”值。这意味着两件事之一

  1. 要么是维基页面没有包括这本书的类型。
  2. 或者,这本书的代码与其他书不同。

这就是为什么在自动化数据收集后,我们经常检查奇怪和不寻常的结果,并手动重新检查它们。

结论

网络搜集是数据科学家需要的基本技能之一。没有比使用 Python、Requests 和 BeautifulSoup 更简单的了。

我们永远不能相信完全自动化,有时我们需要手动检查最终结果,重新检查异常信息。

图书部分的完整代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值