TowardsDataScience 博客中文翻译 2021(三百八十二)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

如何使用 SAS Studio 轻松地在地图上叠加数据

原文:https://towardsdatascience.com/how-to-overlay-data-on-maps-easily-using-sas-studio-3b85de998e5e?source=collection_archive---------29-----------------------

SAS Studio 中的地图非常简单

动机

每年,我的许多朋友都会问我最安全的纽约区,在那里他们可以为他们的孩子租一个地方。许多学生来纽约参加暑期培训或工作。我住在纽约,但不是纽约市。因此,我总是去寻找数据来回答这个问题,并在我的书《使用 SAS Studio学习数据科学》中添加了这个过程,该书于 2020 年由 Apress 出版。

地图

在地图上显示数据增加了新的视角。它可以自己讲述整个故事。SAS Studio 使在地图上显示数据变得容易。此外,使用颜色和气泡自定义地图会为您的数据添加新的维度。本节将使用现实生活中的数据引导您完成这一过程。它将逐步向您展示如何下载数据并准备在地图上显示。

气泡图

气泡图任务创建一个覆盖有气泡图的地图。对于这个例子,我们将使用纽约市的犯罪数据来创建一个气泡图,显示 2018 年纽约市不同行政区的犯罪率。这些数据可通过纽约市开放数据项目网站获得。

您将在“数据集”文件夹中找到该数据文件;文件命名为 NYPD _ 投诉 _ 数据 _ 当前 _ _ 年度 _ 截止日期. csv,或者,您可以从以下网址下载数据集:https://Data . cityofnewyork . us/Public-Safety/NYPD-投诉-数据-当前年度至今-/5uac-w243/data [1]。

要从链接下载数据集,如图 1 所示,单击 Export,然后单击 CSV。

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

图 1:符合 NYPD 标准的数据——NYC open Data(图片由作者提供)

数据集包含大量信息。利用这些数据可以进行大量的调查和分析。例如,每个区最普遍的犯罪类型是什么?犯罪最有可能发生的时间是什么时候?大多数犯罪发生在一周的哪一天?

对于这个例子,我们只对回答哪个区的犯罪率最高和哪个区的犯罪率最低感兴趣。要回答这个问题,我们需要以下三列:行政区、经度和纬度。因此,我们删除了所有其他列。然后,我们计算每个区的犯罪数量,用地图上的气泡来表示。

在清理和准备数据之后,我们得到了下表所示的数据集。

表:每个区的犯罪数量

行政区|犯罪数量|纬度|经度

布朗克斯| 50153 | 40.82452 | -73.8978

布鲁克林| 67489 | 40.82166 | -73.9189

曼哈顿| 56691 | 40.71332 | -73.9829

皇后区| 44137 | 40.74701 | -73.7936

斯塔滕岛| 10285 | 40.63204 | -74.1222

为了加载数据,我们在 SAS Studio 中编写清单 1。

清单 1:为每个区的犯罪数量创建数据集

data NYC_crime;
input Borough $13.;
datalines;
BRONX
BROOKLYN
MANHATTAN
QUEENS
STATEN ISLAND
;
run;data NYC_crime_dim;
set nyc_crime;
input count Latitude Longitude;
datalines;
50153 40.82451851 -73.897849
67489 40.82166423 -73.91885603
56691 40.71332365 -73.98288902
44137 40.74701026 -73.79358825
10285 40.63203653 -74.1222402
;
run;

在这个程序中,我们没有导入原始数据文件。我们在数据步骤中使用 DATALINES 关键字将表的值插入到代码中。在清单 1 中,我们有两个数据步骤。第一个叫 NYC_crime。第二行使用 INPUT 语句指定列的名称和类型。在这个表中,我们只定义了一列作为区名,它的类型是 character,因为我们使用了$。最大字符数为 13。然后,我们使用 DATALINES 语句插入实际值,并以分号结束。

第二个数据步骤创建另一个名为 NYC_crime_dim 的表,在每个表中插入行政区的维度和犯罪数量。该表由前面的表 nyc_crime 使用 SET 语句初始化。同样,我们使用 INPUT 语句来指定我们应该向 borough 中再添加三列。我们添加计数、纬度和经度。记住在列名之间留一个空格,不要使用逗号。同样,使用数据行插入实际值,并以分号结束。

运行清单 1 后,将在工作库中创建两个名为 NYC_crime 和 NYC_crime_dim 的新表。要查看输出表,请单击库➤工作;在它下面,你会找到 NYC_crime 和 NYC_crime_dim。如果没有,请刷新您的库。

现在,点击任务和工具➤任务➤地图➤气泡图,如图 2 所示。

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

图 2:创建气泡图(图片由作者提供)

如图 2 所示,选择数据集工作。数据字段中的 NYC_CRIME_DIM。在角色中,选择纬度和经度。在气泡大小中,选择计数,即犯罪的数量。最后,在“组”中,选择“区”列。

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

图 3:每个区的犯罪数量(图片由作者提供)

对于基本地图,选择 OpenStreetMap。在本章的后面,我们将尝试 Esri maps 来查看输出中的差异。保留其余的默认值,然后单击 Run。将显示图 4 中的气泡图。

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

图 4:每个区的犯罪数量(图片由作者提供)

从泡沫大小可以清楚地看出,布鲁克林的犯罪率最高,而斯塔滕岛的犯罪率最低。SAS Studio 会自动调整气泡的位置、大小和颜色。此外,它还在地图底部添加了一个图例,用于表示行政区的颜色代码。

现在,让我们增强气泡图的外观。我们可以给带有犯罪数量的气泡添加一个标签,并给地图添加一个标题。如图 5 所示,在 Appearance 选项卡的 Data Labels 中,从 Bubble label 的数据集中选择 count 列。然后,在“标签选项”中,选择“粗体”作为“字体粗细”。在标签位置,选择“居中”。最后,在标题和脚注中,输入“纽约市行政区的犯罪数量”

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

图 5:增强外观(图片由作者提供)

单击运行以检查新的更改。输出如图 6 所示。

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

图 6:纽约市各区的犯罪数量(图片由作者提供)

清单 2 显示了 SAS Studio 通过用户界面从我们的选项中自动生成的代码。

清单 2:为每个区的犯罪数量创建数据集

ods graphics / reset width=6.4in height=4.8in;
proc sgmap plotdata=WORK.NYC_CRIME_DIM;
openstreetmap;
title ‘Number of crimes in NYC Boroughs’;
bubble x=Longitude y=Latitude size=count/ group=Borough datalabel=count
datalabelpos=center
datalabelattrs = (color=CX0f0e0e size=7pt weight=bold)
name=”bubblePlot”;
keylegend “bubblePlot” / title = ‘Borough’ ;
run;
ods graphics / reset;
title;

SAS Studio 功能强大,因为它提供了两种类型的底图:OpenStreetMap 和 Esri maps。现在,让我们尝试另一种底图类型。如图 3–48 所示,返回数据选项卡,选择 Esri maps,然后单击运行。输出图如图 7 所示。

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

图 7:使用 Esri maps 的地图(图片由作者提供)

SAS Studio 将为这个 Esri 地图选项生成清单 3 中的代码。

清单 3:使用 Esri Map 生成地图

ods graphics / reset width=6.4in height=4.8in;
proc sgmap plotdata=WORK.NYC_CRIME_DIM;
esrimap url= ‘http://server.arcgisonline.com/arcgis/rest/services/
World_Street_Map/MapServer’;
title ‘Number of crimes in NYC Boroughs’;
bubble x=Longitude y=Latitude size=count / group=Borough
datalabel=count datalabelpos=center
datalabelattrs=(color=CX0f0e0e size=7pt weight=bold)
name=”bubblePlot”;
keylegend “bubblePlot” / title =’Borough’;
run;
ods graphics / reset;
title;

结论

如您所见,通过输入 SAS studio clean 数据集,您可以在地图上叠加数据,而无需编写任何代码。事实上,SAS Studio 会生成代码供您编辑,这太棒了。如果你试图用其他编程语言来完成同样的任务,那将会令人望而生畏。我强烈推荐数据科学新手使用 SAS Studio。

参考

[1] NYPD 投诉数据当前,https://Data . cityofnewyork . us/Public-Safety/NYPD-Complaint-Data-Current-Year-Date-/5uac-w243/Data,NYC 开放数据项目。(条款:【https://www1.nyc.gov/home/terms-of-use.page】T2)

如何在高分辨率地图上叠加多边形形状

原文:https://towardsdatascience.com/how-to-overlay-shapefile-data-on-pygmt-maps-3a2d84550780?source=collection_archive---------13-----------------------

我们将学习如何在 PyGMT 地图上使用 geopandas 绘制选定的 shapefile 数据。

Python 中的 PyGMT 库使绘制高分辨率地形图变得轻而易举。它带有海岸线、国界和地形数据。通常,我们需要使用可用的 shapefile (SHP)数据在地图上高亮显示任意选择的多边形形状或区域。

https://www.earthinversion.com/utilities/pygmt-high-resolution-topographic-map-in-python/ 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

安德鲁·斯图特斯曼在 Unsplash 上的照片

在本帖中,我们将看到如何使用 geopandas 库将 shapefile 数据叠加在 PyGMT 地图上。例如,在这里,我获得了。来自data.gov.tw的 shp 格式,并叠加在台湾的高分辨率地图上。

导入库

我们将使用 geopandas 库来读取。shp 文件。

import pygmt
import os
import geopandas as gpd

shp数据

我从各县下载了shp数据,并将其保存在countiesData的工作目录中。countiesData中有多个文件,但我们只需要COUNTY_MOI_1090820.shp文件。其他的都是相关的扩展文件。

我们选择了两个县在地图上突出显示——台北市和台南市。

countiesShp = os.path.join("countiesData","COUNTY_MOI_1090820.shp")gdf = gpd.read_file(countiesShp)all_data = []
all_data.append(gdf[gdf["COUNTYENG"]=="Taipei City"])
all_data.append(gdf[gdf["COUNTYENG"]=="Tainan City"])

使用 PyGMT 绘制底图

现在,我们可以使用 PyGMT 绘制简单的底图。使用 PyGMT 的好处是我们不需要单独的海岸线和地形数据,并且输出是高分辨率的。

region = [119, 123, 21, 26]fig = pygmt.Figure()
fig.basemap(region=region, projection="M4i", frame=True)fig.coast( 
    water='skyblue', 
    shorelines=True)

覆盖各县

现在,我们可以覆盖所选的县,用绿色填充它们,然后用背景色(白色)填充所有其他的县。

for data_shp in all_data:
    fig.plot(data=data_shp,color="green")
fig.plot(data=countiesShp)

以栅格和矢量格式保存地图

现在,我们可以保存地图的光栅和矢量格式供以后使用。

fig.savefig('map1.png')
fig.savefig('map1.pdf')

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

简单的台湾县地图(图片由作者提供)

地形图

我们可以使用地形背景,而不是使用简单的白色作为背景(顺便说一句,我觉得这看起来很不错):

import pygmt
import os
import geopandas as gpdcountiesShp = os.path.join("countiesData","COUNTY_MOI_1090820.shp")gdf = gpd.read_file(countiesShp)all_data = []
all_data.append(gdf[gdf["COUNTYENG"]=="Taipei City"])
all_data.append(gdf[gdf["COUNTYENG"]=="Tainan City"])region = [119, 123, 21, 26]fig = pygmt.Figure()
fig.basemap(region=region, projection="M4i", frame=True)
fig.grdimage("[@srtm_relief_03s](http://twitter.com/srtm_relief_03s)", shading=True, cmap='geo')fig.coast( 
    water='skyblue', 
    shorelines=True)for data_shp in all_data:
    fig.plot(data=data_shp,color="white", pen=["0.02c", 'white'])
fig.plot(data=countiesShp, pen=["0.02c", 'white'])fig.savefig('map1.png')
fig.savefig('map1.pdf')

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

台湾各县地形图(图片由作者提供)

结论

我们已经看到了如何轻松地将 shapefile 数据添加到 PyGMT 地图上。我们在台湾的底图上绘制了各县的数据。此外,我们创建了一个覆盖了 shapefile 数据的高分辨率地形图。

https://www.earthinversion.com/utilities/how-to-overlay-shapefiles-on-pygmt-maps/

原载于 2021 年 7 月 17 日【https://www.earthinversion.com】

如何打包您的 Python 代码

原文:https://towardsdatascience.com/how-to-package-your-python-code-df5a7739ab2e?source=collection_archive---------0-----------------------

了解 Python 代码应该如何为 PyPI 打包

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

不法分子在 Unsplash 上抓拍的照片

Python 最强大的特性是它的社区。几乎每个用例都有一个专门为它构建的包。

需要发送手机/电子邮件提醒?pip install knockknock —构建 ML 应用?pip install streamlit —厌倦了你的终端?pip install colorama——太简单了!

我知道这是显而易见的,但那些库并没有神奇地出现。对于每一个包,都有一个人,或者许多人,积极地开发和部署这个包。

每一个都是。

全部 30 万以上。

这就是 Python 之所以是 Python 的原因,它的支持程度是惊人的— 令人兴奋

在本文中,我们将学习如何构建我们自己的包。并将它们添加到 Python 包索引(PyPI)中。之后,我们将能够使用pip install来安装我们的软件包!让我们开始吧。

建什么?

第一步是弄清楚我们应该建造什么。一旦我们有了想法,就去 PyPI 搜索相同的包,它存在吗?如果是的话,你的想法有什么新的或更好的吗?

一旦我们得到了一些独特的东西,我们需要再次检查我们的包名是否已经被占用。

在本文中,我们将构建一个名为aesthetic_ascii的包——它将产生随机的受 synthwave 启发的 ASCII 艺术。这是一个相当独特的想法,尽管可能不太有用。

目录设置

我们需要创建一个新的目录来包含我们的包,并作为我们的包名( aesthetic_ascii )。

在这个目录中,我们有我们的__init__.py文件,它将我们的目录初始化为一个 Python 模块——并成为该模块的顶层脚本。

我们可以通过在包目录中添加子目录并在这些子目录中添加__init__.py文件来添加子模块。

比如我们知道可以写from os import path。其目录结构如下所示:

os/
    LICENSE
    MANIFEST.in
    pyproject.toml
    README.md
    setup.cfg
    ...
    os/
        __init__.py
        ...
        path/
            __init.py__
            ...

我们很快会谈到这里的其他文件。但首先,我们需要了解__init__.py实际上在做什么。

init。巴拉圭

在其核心__init__.py,将一个目录标记为一个 Python 包。因此,我们包含了顶层的__init__.py文件,它将目录标记为我们的“包”。

然后我们将实际的代码文件(或模块)放在我们的__init__.py文件旁边。所以,如果我们有这样的结构:

**aesthetic_ascii/**
    *all config files*
 **aesthetic_ascii/**
        __init__.py
        synthesize.py

安装包后,我们将像这样导入synthesize模块:

from aesthetic_ascii import synthesize

我们将在整篇文章中使用这种结构。

配置文件

setup.cfg

除了代码文件,我们还需要几个配置文件。配置我们的包最重要的是setup.cfg文件。

这个文件很关键,它是我们的设置配置文件。在pip install期间,这个文件告诉 pip 如何安装我们的包。

为了声明我们正在使用 setuptools 来打包我们的项目,我们首先在我们的顶层目录中创建一个pyproject.toml文件,包含:

然后我们创建我们的setup.cfg文件。对于审美 _ascii ,看起来是这样的:

这里发生了很多事情,但是每一项都很有描述性,所以我不会一一描述,但是有几项不太清楚。

  • long_description —参数名告诉我们这是什么,我们可以在这里提供不同的文件格式。尽管许多软件包坚持降价,这也是我们将要使用的——正如long _ description _ content _ type中所指定的。
  • 分类器——PyPI 将用来对我们的包进行分类的一组标识符,我们可以在这里找到有效分类器的完整列表
  • —我们的包运行所需的依赖包列表。
  • python_requires —对库的 python 版本要求。
  • include _ package _ data——是否包含MANIFEST.in中定义的附加文件——稍后将详细介绍。

许可证

接下来是我们的许可证,这是软件包中非常重要的一部分——即使你不关心谁在使用它,他们为什么使用它,以及他们是否从中赚钱。

我们包含了一个许可证来消除软件包用户的任何疑虑。选择许可证非常简单,只需从这里复制并粘贴最合适的文本即可——并且记得更新任何自定义部分!

README.md

这个文件充当我们的包的long_description——我们在setup.cfg文件中设置了这个包。

此外,回到我们的setup.cfg——我们在long_description_content_type中指定了我们将使用一个text/markdown文件——因此,我们使用一个降价文本文件!

添加资源

我们已经设置了配置文件,但是我们缺少一样东西——我们的图像将在生成随机 ASCII 图片时使用。

这些图像可以是我们的包所依赖的任何类型的文件。从 Python 3.7 开始,我们通过使用importlib.resources模块来处理这个问题。

首先,我们需要将它导入到我们的代码中,并更新读取这些文件的代码部分,以使用importlib.resources:

这两个函数的第一个参数指的是存储文件的目录。此外,任何资源必须存储在包含__init__.py文件的目录中。

因此,在我们的例子中,我们需要将所有图像文件存储在aesthetic_ascii 子目录中:

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

审美 _ ascii/审美 _ascii 目录包括我们所有的图像文件和字体文件,以及 init。pysynthese . py模块

一旦一切就绪,我们必须确保我们的图像文件将包含在包中——我们通过MANIFEST.in文件来完成:

然后我们确保MANIFEST.in文件被添加到setup.cfg:

...
[options]
include_package_data = True
...

我们准备好了!

本地安装

在将我们的包上传到 PyPI 之前,我们可以确认我们的包可以通过pip install安装,方法是导航到我们的包目录并输入:

pip install .

这应该会像通过pip安装任何其他软件包一样安装我们的软件包:

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

本地 **pip 安装的屏幕截图。**测试

然后,我们可以像对待任何其他产品一样import包装我们的产品:

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

现已安装的 aesthetic_ascii 包的用法示例

建设

一旦我们编写了代码文件、设置了配置并测试了安装——我们就准备好构建我们的包发行版了。

构建过程创建了一个新目录dist,其中包含一个.tar.gz.whl文件——这是我们将包发布到 PyPI 所需要的。

为了构建我们的dist文件,我们创造性地使用了一个名为build的工具。首先,我们pip install build,然后,在我们的包目录中键入:

python -m build

一旦完成,我们应该在我们的包目录中找到一个新的/dist目录。

发布到 TestPyPI

最后,我们准备好发布我们的新 Python 包了!同样,我们使用另一个名为twine的包。我们安装该软件时使用了:

pip install twine

安装完成后,我们上传到TestPyPI——一个 PyPI 的“测试”版本,这样我们可以再次检查我们是否已经正确设置了所有内容。我们通过键入以下命令来实现:

python -m twine upload --repository testpypi dist/*

此时,我们需要登录 TestPyPI——如果您没有帐户,请在这里注册一个。如果一切设置正确,我们的包将被上传:

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

测试 PyPI 上审美 _ascii 的成功上传过程

现在,我们可以通过另一个pip install来测试我们的新包是否工作——但是这次是通过 TestPyPI:

pip install -i https://test.pypi.org/simple/ aesthetic-ascii

(如果发现包已经安装好了——就pip uninstall aesthetic-ascii)。

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

通过 TestPyPI 安装美学-ascii

PyPI

一旦我们确认这个包可以工作,我们就要进行最后一步,发布到 PyPI。同样,你需要在这里注册。

接下来,我们将我们的包上传到 PyPI,包含:

python -m twine upload --repository pypi dist/*

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

上传我们的包到 PyPI

我们完事了。

这是我们的第一个 Python 包部署——出乎意料的简单。我们可以继续和pip install aesthetic_ascii使用这个包。

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

我们的一些 ascii 杰作

包括设置/配置文件的完整代码可以在 GitHub 这里找到。

我希望你喜欢这篇文章。如果你有任何问题或建议,请通过推特或在下面的评论中告诉我。如果你对更多类似的内容感兴趣,我也会在 YouTube 上发布。

感谢阅读!

进一步阅读

如何打包你的 Python 代码,Python 打包

[打包项目](/*All images are by the author except where stated otherwise),Python 打包

风筝,把任何图像变成 ASCII 艺术!(易 Python PIL 教程),YouTube

页(page 的缩写)伯克,灰度图像的字符表示 (1997),paulbourke.net

🤖《变形金刚》NLP 课程 70%的折扣

*除另有说明外,所有图片均出自作者之手

如何使用 Pytest 参数化 Python 测试

原文:https://towardsdatascience.com/how-to-parameterize-python-tests-using-pytest-e8800bf288c5?source=collection_archive---------2-----------------------

向夹具和测试函数传递参数

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

Joshua Lawrence 在 Unsplash 上拍摄的照片

给不耐烦的人:

  1. 如何对 Pytest 夹具进行参数化
  2. 如何使用 Pytest 对测试函数进行参数化

介绍

软件开发的一个固有挑战是随着功能和范围的增长,保持对代码库的控制。一个软件变得越复杂,这种复杂性失控的威胁就越大。

自动化测试套件可以帮助开发人员处理这种复杂性。随着代码库的增长、发展和成熟,测试套件也在增长、发展和成熟,但是如何确保测试本身也是可管理的呢?

对 python 开发人员来说幸运的是,pytest 提供了重用测试函数和作为测试例程的一部分创建的对象的机制,这有助于保持所有测试逻辑的组织性和可维护性。

激励的例子

我正在开发一个实现单变量多项式的类,这是一个项和的数学表达式,其中每一项都是一个常数乘以变量的非负幂。

举个例子,

4x - 2x

是一个多项式表达式。这个多项式可以被建模为一个列表,其中每个元素是一个项,每个项本身是一个具有系数和指数的列表。上述多项式可以用以下方式建模:

[[4,3],[-2,1]]

使用我的多项式类,我可以通过以下方式创建相应的多项式对象:

随着多项式类功能的增加,我需要测试它。多项式的一个特征是指数是非负整数,所以我将编写一个测试来检查指数是否满足该条件。多项式的导数也是多项式,所以我也应该检查那些指数。此外,如果指数最大的系数是负的,那么我的多项式的字符串表示必须有一个前导负号,所以需要检查一下。

现在对于以上的 poly,我有 3 个测试:

  1. 所有指数都是非负整数吗?
  2. 导数的所有指数都是非负整数吗?
  3. 如果指数最高的项的系数为负,字符串表示是否有前导负号?

这里有一种非常直接的方式来编写这些测试:

这让我可以用那些特定的项来测试多项式对象的功能,但是如果我想用不同的项来测试一个多项式,那么我必须编写一个新的测试。

这可能适用于极少数的对象和边缘案例,但是随着更多的对象需要测试,每个对象需要检查更多的测试案例,它将很快变得势不可挡。

如何使用 Pytest 夹具

Fixtures 是返回可以被多个测试访问的对象的函数。在 fixture 函数上方用@pytest.fixture() decorator 声明一个 fixture。然后,将 fixture 函数名作为一个参数放入测试函数的定义中,测试函数现在可以使用 fixture,而无需显式实例化它返回的对象。使用 fixture,我可以如下重构我的测试:

现在,我想添加的任何测试函数都可以访问同一个多项式,测试本身只有测试所需的逻辑。理所应当!

不幸的是,我认为我定义的单个多项式不足以真正测试我的字符串表示。它甚至不需要前导负号。我可以添加另一个装置,但是我必须为每个装置添加测试:

如何参数化 Pytest 夹具

@pytest.fixture decorator 允许您向 fixture 传递一个参数列表。对于每一个请求这个 fixture 的测试,这个测试会为这个 fixture 的每一个参数化版本运行一次。例如:

现在,我可以简单地向 TERMS_LIST 添加额外的多项式项列表,每个请求 poly fixture 的测试将使用 TERMS_LIST 中每组项的多项式对象运行一次。

如果测试失败,pytest 将让您知道哪些参数导致了失败的测试:

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

上面的“test_str_leading_minus[poly0]”指的是 TERMS_LIST 中参数在 0 索引处的 poly fixture。

另一个激励的例子

正如我上面写的,多项式必须有非负指数。当我为我的多项式类实现接口时,我决定如果一个多项式试图用无效的指数创建,我要抛出一个异常。我可以尝试创建一个带有无效术语列表的参数化 fixture,

但这是行不通的!fixture 将尝试创建一个新的多项式对象,如果希望接口引发异常,那么任何引用该 fixture 的测试都不会完成。测试会因为异常而失败,但是失败是预期的结果,所以测试应该通过。那我该怎么办呢?

如何使用 Pytest 对测试函数进行参数化

@ py test . mark . parameterize()decorator 允许您独立于您创建的 fixtures 来参数化测试函数的参数。现在,我可以传递一个无效参数列表,并使用 pytest.raises(AssertionError)断言无效术语会导致预期的异常。

现在,只有当无效术语在对象初始化期间导致断言错误时,测试才会通过。此外,如果有我想定义为无效的其他术语列表,我可以简单地将它们添加到 INVALID_TERMS_LIST 中,而无需编写另一个测试。

摘要

您可以在 fixture decorator 中使用 params 关键字参数将参数传递给 fixture,也可以使用@ py test . mark . parameter ize decorator 将参数传递给单独测试的测试。

编码快乐!

如何使用 Python 解释文本

原文:https://towardsdatascience.com/how-to-paraphrase-text-using-python-73b40a8b7e66?source=collection_archive---------5-----------------------

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

envato elementsalexdndz 使用图像创建(经许可)。

数据科学 | 机器学习

使用人工智能进行内容创作的循序渐进教程

作为作家,我们经常寻找工具来帮助我们变得更有效率或更有成果。Grammarly 之类的工具可以帮助语言编辑。文本生成工具可以帮助快速生成原始内容,只需给人工智能一些关键字想法即可。

也许这可以帮助结束作家的阻滞?这是一个有争议的问题,最好留待以后解决。

转述内容也是另一种获取现有内容(无论是你自己的还是别人的)并加入你自己观点的好方法。如果我们可以自动解释文本,那不是很好吗?

在本文中,您将学习如何使用PARROT库在 Python 中免费套用文本。特别是,在引擎盖下,PARROT 的解释技术基于 T5 算法(文本到文本转换转换器的首字母缩写),该算法最初由 Google 开发(有关更多信息,请参考代码为的论文中的 T5 资源)。在高层次上,文本生成是自然语言处理(NLP)令人兴奋的领域的利基领域,当向普通观众解释时,通常被称为人工智能或 AI。

需要注意的是,一个附带的 YouTube 视频( *如何使用 PARROT 库套用 Python 中的文本(Ft。*肯吉))此文如下所示。

如何使用 PARROT 库(Ft。肯吉)

1.推出 Google Colab 笔记本电脑

我们将使用 Google Colab 在云上执行文本解释,这是 Jupyter 笔记本的在线版本,允许您在云上运行 Python 代码。如果你是 Google Colab 的新手,你会想在入门笔记本中温习一下基础知识。

  1. 登录你的 Gmail 账户,然后进入 Google Colab
  2. 首先转到File > Open Notebook,然后点击Upload选项卡(最右边),启动教程笔记本。
  3. 在搜索框中输入dataprofessor/parrot
  4. 点击parrot.ipynb文件

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

加载鹦鹉教程笔记本截图。

2.安装 PARROT 库

PARROT 库可以通过 pip 安装,方法是在 code 单元格中键入以下内容:

! pip install git+[https://github.com/PrithivirajDamodaran/Parrot.git](https://github.com/PrithivirajDamodaran/Parrot.git)

库安装需要一点时间。

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

显示 PARROT Python 库安装的屏幕截图。

3.导入库

这里,我们将导入由parrottorchwarnings组成的 3 个 Python 库。您可以将以下内容键入(或复制粘贴)到代码单元格中,然后通过按下CTRL + Enter按钮(Windows 和 Linux)或CMD + Enter按钮(Mac OSX)来运行它。或者,也可以通过单击代码单元格左侧的播放按钮来运行代码单元格。

from parrot import Parrot
import torch
import warnings
warnings.filterwarnings("ignore")

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

允许代码单元运行的 play 按钮的屏幕截图。

parrot库包含预训练的文本解释模型,我们将使用它来执行解释任务。

在引擎盖下,预先训练的文本解释模型是使用 PyTorch ( torch)创建的,因此我们在这里导入它以便运行该模型。这款机型名为[parrot_paraphraser_on_T5](https://huggingface.co/prithivida/parrot_paraphraser_on_T5/tree/main),在抱脸网站上列出了。需要注意的是,拥抱脸是开发托管parrot_paraphraser_on_T5模型的transformer库的公司。

正如代码所暗示的,出现的警告将通过warnings库被忽略。

4.文本释义的再现性

为了允许文本释义的再现性,将设置随机种子号。这样做的目的是对相同的种子号产生相同的结果(即使重新运行多次)。

要为再现性设置随机种子数,请在代码单元格中输入以下代码块:

**def** random_state(seed):
  torch.manual_seed(seed)
  **if** torch.cuda.is_available():
    torch.cuda.manual_seed_all(seed)

random_state(1234)

5.加载文本解释模型

我们现在将加载并初始化 PARROT 模型,方法是在一个代码单元中输入以下内容并运行该单元。

parrot = Parrot(model_tag="prithivida/parrot_paraphraser_on_T5", use_gpu=False)

模型将按如下所示加载:

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

初始化模型的屏幕截图。

6.输入文本

本例中的输入文本What’s the most delicious papayas?将被分配给phrases变量,我们一会儿就会用到它。

要找到这个问题的答案,请务必观看随附的 YouTube 视频( *如何使用 PARROT 库在 Python 中解释文本(Ft。*肯吉))。

phrases = ["What's the most delicious papayas?"]

7.生成释义文本

现在,到了使用 PARROT T5 模型生成释义文本的有趣部分。

7.1.代码

将以下代码块输入到代码单元格中,并运行该单元格。

for phrase in phrases:
  print("-"*100)
  print("Input_phrase: ", phrase)
  print("-"*100)
  para_phrases = parrot.augment(input_phrase=phrase)
  for para_phrase in para_phrases:
   print(para_phrase)

7.2.逐行解释

这里,我们将使用一个for循环来遍历phrases变量中的所有句子(在上面的例子中,我们只给这个变量分配了一个句子或一个短语)。

对于phrases变量中的每个phrase:

  • 打印 100 次-字符。
  • 打印"Input phrase: ",后跟被迭代的phrase的返回输出。
  • -字符打印 100 次。
  • 使用parrot.augment()函数执行解释,该函数将被迭代的phrase作为输入参数。生成的释义被分配给para_phrases变量。
  • para_phrases变量执行嵌套的for循环:
    —打印从para_phrases变量返回的重复输出,这些重复已经迭代生成(4 个重复的文本,我们将很快在下一节中看到)。

7.3.代码输出

此代码块生成以下输出:

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

在这里,我们可以看到 PARROT 产生了 4 个释义文本,您可以选择其中的任何一个进行进一步的使用。

8.下一步是什么?

恭喜你,你可以成功地使用人工智能产生转述文本!

如果你有兴趣更进一步的话。

这里有一些项目想法,您可以尝试并构建来扩展您自己的项目组合。说到投资组合,你可以从我最近写的这篇文章中免费学习如何建立一个投资组合网站:

[## 如何免费建立一个简单的作品集网站

towardsdatascience.com](/how-to-build-a-simple-portfolio-website-for-free-f49327675fd9)

项目创意 1

创建一个 Colab/Jupyter 笔记本,通过创建一个可以接受多个短语作为输入的版本来扩展这个示例(为单个输入短语生成解释文本)。例如,我们可以将一个由几个短语组成的段落分配给一个输入变量,然后代码使用它来生成解释文本。然后,对于每个短语的返回输出,随机选择单个输出来表示每个短语(即,每个输入短语将相应地具有 1 个释义文本)。把转述的短语组合成一个新段落。比较原始段落和新的转述段落。

项目创意 2

使用Streamlit(也可以查看 Streamlit 教程播放列表)或PyWebIO)将项目想法 1 扩展成一个 web 应用程序。特别是,web 应用程序会将一段短语作为输入,并应用代码来生成释义文本,并将它们作为输出返回到 web 应用程序的主面板中。

分享你的创作

我很想看看你的一些作品,所以请随意把它们贴在评论区。快乐创作!

信用

本文中使用的代码改编自 Parrot 创建者 Prithiviraj Damodaran 提供的示例。

订阅我的邮件列表,获取我在数据科学方面的最佳更新(偶尔还有免费内容)!

关于我

我是泰国一所研究型大学的生物信息学副教授和数据挖掘和生物医学信息学负责人。在我下班后的时间里,我是一名 YouTuber(又名数据教授)制作关于数据科学的在线视频。在我做的所有教程视频中,我也在 GitHub 上分享 Jupyter 笔记本(数据教授 GitHub 页面)。

https://www.youtube.com/dataprofessor

在社交网络上与我联系

YouTube:【http://YouTube . com/data proper/
网站:【http://data proper . org/【正在建设】
LinkedIn:【https://www . LinkedIn . com/company/data proper/

如何使用 Python 和 Selenium 解析数据

原文:https://towardsdatascience.com/how-to-parse-data-using-python-and-selenium-907a95239ee0?source=collection_archive---------14-----------------------

使用分页从网站解析数据

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

博伊图梅洛·菲特拉Unsplash 上的照片

以前我谈到过硒以及如何在 Ruby 中使用它。今天,我将向您展示如何在 Python 中使用 Selenium。如果你想了解硒的基本知识,可以看看下面的帖子。在那篇文章中,我简要介绍了什么是硒以及我们何时可以使用它。

通过这篇文章,您将了解如何使用 Python、Selenium 和 ChromeDriver 解析一些数据。

设置

对于这个设置,我们需要安装一个 Python ChromeDriver 。另外,确保你的机器上安装了 Python 。我用的是 macOS。您可以使用以下命令快速检查您运行的 Python 版本。

python --version

在我的例子中,我运行的是 Python 版本 3.8.8。现在,在您的终端中运行以下命令。这里我们使用pip(Python 的包安装程序)来安装这个包。

pip install selenium

安装 Selenium 之后,我们需要安装 ChromeDriver。我正在用自制软件安装驱动程序。

brew install chromedriver

如果您在驱动程序方面遇到任何问题,以下是 macOS 的一些基本故障诊断步骤。

解决纷争

  1. 无法打开 Chromedriver,因为无法验证开发者。
open /opt/homebrew/Caskroom/chromedriver

首先,在 finder 中打开 chromedriver 文件夹。之后,右键点击 chromedriver 文件,选择打开。这应该可以解决问题。

2.该版本 ChromeDriver 仅支持 Chrome 版本#当前浏览器版本为二进制路径的#

我们需要确保 ChromeDriver 和 Chrome 浏览器的版本是相同的。

brew upgrade --cask chromedriver

太好了,我们完成了初始设置。现在你可以从 GitHub 下载 Python 脚本。让我们来分解一下web_scraper.py文件的各个组成部分。

web_scraper.py

首先,我们添加了一个headless选项。然后我们用选项初始化一个 Chrome webdirver。现在,我们沿着页码导航 URL。之后,我们使用find_elements_by_class_name方法从页面中提取所有元素,最后,我们遍历所有元素,使用 find_element_by_class_name方法提取单个元素。现在,我们可以将页码增加 1,并重复相同的过程,直到没有数据需要解析。你可以从这里阅读所有可用的 WebDriver API。

如果你不提供headless选项,它将打开一个 chrome 浏览器并运行剩下的代码。如果这是您想要的行为,删除第 23、24 行,并修改第 25 行,如下所示。

driver = webdriver.Chrome()

我希望这篇文章能帮助你开始使用 Python、Selenium 和 ChromeDriver。如果你访问 toscrape 网站,你可以找到不同的浏览数据的方法。例如,我们可以使用无限滚动分页,而不是使用分页来导航页面。如果你有兴趣学习 Python,那么可以在 GitHub上查看我的 Python cheatsheet。编码快乐!

相关帖子

如何使用 Ruby 和 Selenium 解析数据

原文:https://towardsdatascience.com/how-to-parse-data-using-ruby-and-selenium-5cf11605340c?source=collection_archive---------19-----------------------

了解硒的基础知识

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

国立癌症研究所Unsplash 上拍摄的照片

人工测试可能效率低下且容易出错。但是,它可以通过自动化消除。Selenium 是一个自动化测试的开源自动化工具。例如,我们可以用它来测试 web 应用程序。

在本文中,我们将使用 Selenium ( RubyChrome 来解析数据。我们将使用一个名为selenium-webdriver的 ruby gem,它为 Selenium 和 ChromeDriver 提供 ruby 绑定来使用 Chrome web 浏览器。Selenium 拥有对 C#、Python、JavaScript 和 Java 的支持。而且支持的平台有 Firefox,Internet Explorer,Safari,Opera,Chrome,Edge。

设置

首先,我们需要安装一个 ruby gem 和 ChromeDriver。对于这个设置,我使用的是 macOS。如果你的机器上没有安装 Ruby,那么从这里获取。

在您的终端中运行以下命令。

gem install selenium-webdriver

现在,在您的终端中运行以下命令来安装 ChromeDriver。在这里,我使用自制软件来安装驱动程序。

brew install chromedriver

如果你在初始设置时遇到任何问题,看看我的 GitHub 或者使用错误信息来解决问题。好了,我们可以走了。你可以从 GitHub 下载以下代码。让我们来分解一下web_scraper.rb文件的各个成分。在这篇文章中,我们将从名为 toscrape 的网站收集数据。这是一个网页抓取沙盒。

首先,我们用一个无头的 chrome 浏览器初始化我们的 selenium WebDriver。

def init_selenium_webdriver
 options = Selenium::WebDriver::Chrome::Options.new
 options.add_argument('--headless')
 return Selenium::WebDriver.for :chrome, options: options
end

现在,我们有了将用来解析数据的 URL。这里,我们从第一页开始。在循环内部,我们使用驱动程序、URL 和页码来导航网页。

def main
 driver = init_selenium_webdriver
 url = "http://quotes.toscrape.com/page/"
 page_no = 1
 loop do
  navigate(driver, url, page_no)
  data = get_data(driver, {class_name: 'quote'})
  parse_data(data, {text: {class_name: 'text'}, author: {class_name: 'author'}})
  page_no += 1
  break unless has_data?(data)
 end
 driver.quit
end

navigate方法中,我们使用基本 URL 和页码构建最终的 URL。

def navigate(driver, url, page_no)
 driver.navigate.to URI.join(url, page_no.to_s)
end

我们使用get_data方法从navigate方法返回的数据中提取报价。find_elements方法将返回所有匹配给定参数的元素。

def get_data(driver, pattern)
 return driver.find_elements(pattern)
end

之后,我们遍历所有报价,使用parse_data方法在控制台中打印单个报价信息。find_element方法将返回匹配给定参数的第一个元素。你可以在这里阅读更多相关信息

def parse_data(data, pattern)
 data.each do |quote|
  text = quote.find_element(pattern[:text]).text
  author = quote.find_element(pattern[:author]).text
  puts "#{text} -- #{author}"
 end
end

完成此步骤后,我们将页码增加 1,并对页码 2 重复此过程。最后,我们将增加页码,直到没有需要解析的引号。

def has_data?(data)
 return data.size() > 0
end

太棒了,现在您知道如何使用 Selenium 解析数据了。继续尝试使用不同的导航技术解析数据,比如滚动。我希望你从这篇文章中学到了一些新的东西。如果你有兴趣了解 Ruby,那么可以在 GitHub 上查看我的 Ruby Cheatsheet。编码快乐!

看看我关于 Ruby 的其他帖子

</17-useful-ruby-string-methods-to-clean-and-format-your-data-9c9147ff87b9>

如何通过面试的数据展示部分

原文:https://towardsdatascience.com/how-to-pass-the-data-presentation-part-of-interviewing-e6b2e4274444?source=collection_archive---------8-----------------------

有时候越简单越好

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

杰森·古德曼在 Unsplash 上的照片

可怕的数据展示。这通常是面试过程中的一部分,候选人要么大放异彩,要么自掘坟墓。

一些候选人一旦发现他们实际上需要做一些分析并展示他们的发现,就会完全退出。你想让我做几个小时的工作!?你怎么敢问?

我个人认为这是过程中最能说明问题的部分。

首先,你可以看到有人愿意付出多少努力在你的数据中发现一些有趣的模式。

第二,它证明了候选人可以创造性地思考,并实际做好该职位要求他们每天做的技术工作。

如果你申请的是数据分析师的职位,而公司要求你使用他们的数据来制作演示文稿,你应该渴望完成它。你不是每天都能看到一家公司的真实数据,更不用说探索它来回答一些有趣的问题了。

如果你害怕陈述,也许这个角色或公司不适合你。作为数据人,我们会抓住任何机会查看来自真实用户和产品的真实数据。

因此,如果你愿意投入工作并对演示感到兴奋,为了成功,你需要确保做好以下几件事。

清理您的数据。

你会惊讶地发现,候选人经常连清理数据都不提。作为一个数据科学迷,我一次又一次地认识到拥有干净数据的重要性。这对我来说是非常重要的。

提及你做了什么来修复给你的数据集中的错误。你必须转换任何数据类型吗?剔除离群值?替换任何空值吗?简要概述你所采取的步骤。

垃圾数据输入等于垃圾数据输出。你的分析的准确性取决于你用来支持它的数据。

现在你不必在这里进行超深入的探讨,这取决于你申请的职位。如果你申请的是数据科学家的职位,这一点可能非常重要。然而,如果你申请的是数据分析师的职位,这可能是你想简单接触的。

超越自我。

我对候选人仅仅触及我们给他们的数据集表面的次数感到震惊。一直有人只提出了基本的计数和平均数,指望我们印象深刻。

计数和平均数在意料之中,并不令人印象深刻。确保你总是在做超出要求的事情。这些陈述的全部意义在于表明你是一个有创造力的思考者,并且能够执行你的想法。

集思广益有趣的假设,并使用数据来支持这些预感是否正确。我们希望看到战略思维。

在我的一次面试中,候选人只做了前五分钟的介绍。五分钟后,她完成了!她只给我们看了一些用 Excel 构建的基本图表,甚至没有看我们给她的整个数据集。

她做的绝对是最少的。如果你能这么说的话。如果你的演示不占会议时间的 75%,那它可能太短了。

虽然定量分析显然很重要,但定性分析也是你成功的重要部分。你需要说明为什么你认为这些数字是这样的。数据中会有季节性趋势吗?也许是收集收视率的后台问题?

与其说这些假设是正确的,不如说是你首先想到了它们。数据分析师做的很多事情都涉及实验和测试。证明你能以那种方式思考。

展示清晰的视觉效果。

如果你想恰当地传达你的发现,你的数据可视化需要强大和简洁。在我看来,这是一个人作为数据分析师最重要的一部分。

您工作的很大一部分是以业务团队,特别是非技术团队理解的方式可视化数据。你不希望这些形象化的东西容易被误解。

以下是我创建强大可视化效果的最佳技巧:

  • 按颜色分类。
  • 不要使用饼图。
  • 确保你给每个图表一个标题和轴标签。
  • 在整个演示文稿中,对相同的尺寸使用相同的配色方案。
  • 越简单越好。不要放入不必要的信息。

人们很容易陷入证明可以用图表做的所有很酷的事情。很酷的图表让人印象深刻!但是它们有用吗?不完全是。

总是从功能和讲故事的角度来思考独一无二的东西。不要仅仅为了炫耀而使用某些技能。这是可视化变得混乱和失去价值的时候。

不要超过时间限制。

这个让我抓狂。如果为您的演示安排的会议只有 30 分钟,请确保您的演示不超过 25 分钟。如果你的演示计划是一个小时,确保它不超过 45 分钟。

在给你面试的公司的人演示之前,你应该练习多次演示。给自己计时,确保你不会超过这些限制。

没有什么比浪费别人的时间更失礼的了。你的面试被安排在某个时间段是有原因的。尊重这一点,并保持在这些限制之内。

有一次,我在面试一位候选人,他的陈述超过了我们预定的时间 10 分钟。他还没有完成!这表明他并不像他试图表现出来的那样了解数据和他的工作。这让我感到恼火。采访你的人应该总是带着灵感和兴奋离开谈话。

超过这个时间限制说明你根本没有练习你的演示,你不尊重别人的时间。作为一名面试官,做一次又一次的数据展示已经相当累人了。你最不希望的就是有人超越你设定的界限。

最后留出 5 到 10 分钟时间供团队成员提问。总会有问题,所以,再一次,留点时间让你尊重别人设置的限制。

结论

记住,最重要的是你玩得开心,炫耀你能做什么!面试官想了解你的战略思维过程,以及你如何执行你的想法。

你不必为宏大的可视化而疯狂,只要确保你在定性和定量两个方面进行思考。确保你的可视化讲述一个故事,并清楚地传达你的想法。

当我面试目前的职位时,我遵循了上面列出的所有建议。我每天下班后花几个小时,周末也花几个小时做数据演示。我努力工作,结果显示出来了。面试官知道你是否投入了几个小时,而不是你所有的空闲时间。

如果你真的对公司和这个角色充满热情,你会喜欢这个过程。我坚信,当我们对正在做的工作感到兴奋时,成功就会自然而然地到来。

使用 Google Sheets 和 Tableau Public 获取和分析大量拍摄数据

原文:https://towardsdatascience.com/how-to-perform-a-data-analysis-of-mass-shootings-in-the-united-states-57a4290f9175?source=collection_archive---------28-----------------------

大规模枪击事件每天发生一次以上,不必要地摧毁生命。使用数据创建数据分析和数据科学解决方案,为决策提供信息并推动决策制定,从而降低其频率和规模。

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

音乐会观众和乐队音乐家在室外舞台上的照片。照片由 Julio ReynaldoUnsplash 上提供。

内容警告:枪支暴力,大规模枪击。

2017 年 10 月 1 日,数千名狂欢者在拉斯维加斯大道的91 号公路丰收音乐节上聆听现场音乐。晚上 10 点 05 分,斯蒂芬·帕多克(Stephen Paddock)从他位于曼德勒湾酒店 32 层的套房中用半自动步枪向下面的人群开火。在 10 分钟内,他发射了 1000 多发子弹。帕多克杀害了 60 人,打伤了 411 人。随之而来的恐慌使受伤人数上升到 867 人。

拉斯维加斯的大屠杀震惊了全国和世界。多年来,美国经常发生大规模枪击事件。但是拉斯维加斯枪击案是美国现代史上最血腥的单人大屠杀。尽管如此,大规模枪击事件仍以每年超过 400 起的速度继续发生。

如何利用数据分析来了解更多关于大规模枪击事件的信息?准备充分的数据数据分析仪表板能说服当选官员颁布将有所作为并拯救生命的法律和政策吗?

本文将向您展示如何获取大规模枪击事件数据,为分析做准备,并在 Tableau Public 中创建一个仪表板,以确定大规模枪击事件及其造成的死亡和伤害的趋势。

大规模拍摄问题概述

在美国,术语大规模枪击没有标准定义。枪支暴力档案 (GVA)将其定义为“至少有四名受害者被枪击,要么受伤要么死亡,不包括任何枪手……”的事件美国国会 2012 年《暴力犯罪调查援助法》将大规模杀戮定义为导致至少三名受害者的事件,不包括肇事者。

GVA 报告称,2019 年美国大规模枪击事件造成 417 人死亡。美国联邦调查局(FBI)报告称,2019 年美国发生了16425 起谋杀案。鉴于这些数据,大规模枪击案占当年美国所有凶杀案的 2.54%。

主数据源示例

很多机构都提供免费的海量拍摄文件。以下是几个例子。请注意,每个组织可能对大规模枪击事件有不同的定义。

GVACSV 文件包含 2014 年至 2019 年每起大规模枪击事件的数据。

大规模枪击事件追踪器(MST)JSON 文件包括 2013 年至 2021 年初每起大规模枪击事件的数据。

暴力项目Excel 文件包含 100 多个关于每次大规模枪击的变量。

从批量拍摄跟踪器复制和准备数据

我使用下面列出的步骤将 MST 网站上的大量拍摄数据转录到 Google Sheets 的电子表格中。

将数据从 MST 复制到 Google Sheets

对于我的海量拍摄数据分析项目,我选择了来自 MST 的数据。虽然我可以下载 JSON 格式的数据,但我直接从它的网页上复制数据,并将其粘贴到名为mass shooting tracker . site SourceGoogle Sheets 中的工作表中。

我通常通过下载文件来获取公共数据。当需要多次检索数据时,如果可能的话,我更喜欢从程序调用应用程序编程接口(API)来获取数据。虽然手动将网页上的数据转录到电子表格中不是我首选的数据获取方法,但从 MST 的网站上复制八年多的大规模拍摄数据只用了不到十分钟。电子表格格式比 JSON 格式更能满足我的需求。

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

大规模拍摄跟踪器—包含 2020 年数据的网页。作者捕获的图像。

准备工作表草稿

本节描述了我从 MST 准备数据以在 Tableau 公共可视化仪表板中使用的步骤。下面显示的 Google Sheets 工作表显示了从 MST 网页复制的数据和我创建的额外的临时列,以便为以后使用这些数据做准备。

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

Google Sheets 工作表,包含来自 MST 的大量拍摄数据和用于数据准备目的的新增列。图片由作者提供。

将 MST 网页中的数据转录到 Google Sheets 工作表中后,请遵循以下步骤(参考上面显示的工作表):

  1. 日期 列对工作表进行升序排序。
  2. 通过将单元格 A2 的值设置为 1 并将公式 =A2+1 粘贴到行号列的所有后续行中,从 1 到 n 计算行号列的值。
  3. 将原 # 列重命名为批量拍摄跟踪器#
  4. 使用此公式创建原始标准日期列:= TO _ TEXT(YEAR(F2))&“-”&TEXT(MONTH(F2)," 00") & “-” & TEXT(DAY(F2)," 00))
  5. 使用以下公式创建原始 ID 列: =CONCATENATE(C2,“-”,TEXT(A2," 0000"))
  6. 接下来,仅将原始 ID 列的值复制到拍摄 ID 列。枪击 ID 是每个大规模枪击事件的唯一标识符。假设稍后将辅助数据源添加到数据分析项目中。在这种情况下,我会将拍摄 ID 添加到他们的记录中,以加入各种来源(例如,在关系数据库或 Tableau 这样的商业智能工具中)。
  7. 使用以下公式将位置列的值拆分到城市列: =SPLIT(G2,“,”

复制并简化最终工作表

完成上述准备步骤后,将数据复制粘贴到一个名为的新工作表中。但是请确保只粘贴没有公式的值。

创建新工作表后,删除除以下列之外的所有列:

  • 拍摄 ID
  • 日期
  • 死亡的
  • 受伤的
  • 射手
  • 新闻文章
  • 城市
  • 状态

大规模枪击案工作表应该如下所示。

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

Google Sheets 中完全准备好的大规模拍摄工作表,可用作 Tableau Public 中的数据源。图片由作者提供。

数据分析设计

虽然我对大规模拍摄数据有更雄心勃勃的计划,可能来自比 MST 报告的数据更多的来源,但我将演示如何用 Tableau Public 连接数据,为本文构建一个基本的仪表板。以下是我创建的图表和图形,用于查看数据随时间的变化趋势:

  • 按年份分列的死亡受害者
  • 按年份分列的受伤受害者
  • 按年份分列的受害者总数
  • 按年份分列的大规模枪击事件数量

仪表板还显示死亡的受害者,受伤的受害者,以及在地图上按州的事件数量。

最后,包括以下过滤器以允许数据的子集:

  • 年份范围
  • 死亡受害者范围
  • 受伤受害者范围
  • 状态
  • 城市和州

数据可视化仪表板

本节描述了 Tableau Public 中开发的大规模拍摄仪表盘。请随意下载仪表板,并将其作为您自己项目的起点。

Tableau 公共

对于这个项目和这篇文章,我使用了 Tableau Public ,一个流行的 Tableau 商业智能和数据可视化软件的免费版本。虽然它可以用来创建令人惊叹和有影响力的数据可视化,但与完整的 Tableau 桌面和服务器产品相比,它有一些局限性:

  • 仪表板和工作表只能保存到 Tableau 公共服务器,任何人都可以访问。因此,不要用它来展示机密、敏感或可能令人尴尬的信息。
  • 虽然完整的 Tableau 桌面应用程序可以使用各种数据,包括关系数据库,但 Tableau Public 可以使用相对较少的数据源。

要安装 Tableau Public,请在其主页上输入您的电子邮件地址,然后点击[下载应用程序]。

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

下载并安装 Tableau 公共商业智能和数据可视化软件。作者捕获的图像。

使用 Tableau Public 连接到 Google Sheets 中的数据

Tableau Public 可以连接到各种数据源,包括 Microsoft Excel、文本文件(包括 CSV 文件)、JSON 文件和 Google Sheets。它不能连接到数据库。

在本例中,当您打开 Tableau 公共应用程序时,将显示 连接 页面。

按照以下步骤连接到上一节中创建的 Google Sheets 电子表格:

  1. 在“发送到服务器”标题下,单击[更多…]。
  2. 点击【谷歌工作表】。
  3. 点击包含大量拍摄数据的谷歌电子表格的名称。在这个例子中,名字是 美国大规模枪击事件
  4. 时钟[连接]。

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

将 Tableau Public 连接到在 Google Sheets 中创建的大规模枪击电子表格。作者捕获的图像。

选择数据源

要选择在 Tableau 公共工作表和仪表板中使用的数据源,请单击屏幕左下角的[数据源]。然后,将 批量拍摄 表拖动到数据窗格。正如你在下面的截图中看到的,Tableau Public 显示了它从电子表格中导入的数据。

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

从 Google Sheets 电子表格中选择一张工作表,用作 mass shooting 仪表盘中的数据源。作者捕获的图像。

Tableau 工作表和仪表板

我用 Tableau Public 创建了美国的大规模枪击事件仪表盘,如下所示。虽然本文不是 Tableau 教程,也没有提供关于构建仪表板或其他设计的细节,但是您可以通过免费培训视频学习如何创建可视化和仪表板。

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

美国仪表盘中的大规模枪击事件描述了自 2019 年以来的大规模枪击事件、受伤的受害者和死亡的受害者。图片由作者提供。

其他感兴趣的数据点和潜在的改进

如下图所示, 大规模拍摄 仪表盘(如上图)包含这些工作表:

  • 受害者
  • 各州死亡人数-地图
  • 受伤的州-地图
  • 按州划分的事件—地图

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

Tableau Public 中的受害者工作表。此工作表是大规模枪击仪表板的一个组件。图片由作者提供。

来自大规模枪击仪表板的观察

虽然 Tableau 可视化中呈现的图表是初步的,包括有限的数据,但我使用它们得出了关于美国大规模枪击事件的以下结论:

  • 随着时间的推移,大规模枪击事件、死亡和受伤的人数持续增长。
  • 我听说在新冠肺炎疫情期间,大规模枪击事件减少了。根据给定的数据,相反的情况似乎是准确的。
  • 2020 年,每次事故的平均死亡人数减少,而事故数量增加。

其他感兴趣的潜在数据点和分析

上面描述和显示的基本图表说明了大规模枪击问题的趋势。但是,当增加额外的数据和设计良好的图表、图形和统计数据时,熟练的数据分析师或数据科学家可以创建丰富的信息源和决策工具。

以下是扩展和改进大量拍摄数据分析解决方案的一些想法。当然,并不是所有这些数据类型都能被公众轻易获得。

  • 受害者的人口统计数据(年龄、性别、种族、民族、国籍、宗教、其他群体)
  • 射击者的人口统计数据(年龄、性别、种族、民族、国籍、宗教、其他分组)
  • 枪手的动机
  • 射击运动员的心理健康
  • 枪手获得枪支(合法或合法)
  • 枪手的犯罪记录
  • 枪手和受害者的关系
  • 枪手与国际或国内恐怖组织的联系
  • 枪击地点(例如,教堂、学校、企业、农村或城市)
  • 枪手与枪击地点的关系(例如,枪击是否发生在前雇主的地点?)
  • 无论枪手是否在事件中死亡或受伤
  • 枪手死亡原因(自杀或被警察或其他人杀死)
  • 各州每 100,000 名居民的死亡和受伤人数
  • 各州枪支管理条例
  • 对幸存枪手的定罪和监禁

结论

虽然大规模枪击是摧毁生命的可怕罪行,但它们只占美国每年凶杀案的一小部分。尽管如此,像其他暴力犯罪一样,它们表明了严重的社会和个人问题。有了适当的数据和良好的演示,精心调整的分析可以更好地让公众了解问题。它们还可以为当选官员提供制定法律法规以拯救生命的工具。

关于作者

Randy Runtsch 是一名作家、数据工程师、数据分析师、程序员和摄影师。他和妻子住在美国明尼苏达州东南部。

Randy 讲述了如何利用公共数据集中的数据。有关如何在数据分析和数据科学项目中使用公共数据集的更多想法,请参见他最近的文章, 使用 Python 获取和分析天气和气候数据和 Tableau使用 Data.gov 上编目的公共数据集推动数据科学项目

什么是象限分析&如何用 Python 进行象限分析

原文:https://towardsdatascience.com/how-to-perform-a-quadrant-analysis-in-python-9f84d36f8a24?source=collection_archive---------10-----------------------

解释什么是象限分析以及在哪里使用它。关于如何使用 pandas、matplotlib 和 seaborn 库在 python 中实现的分步指南。

什么是象限分析?

象限分析图是一种非常常用的决策工具,尤其是在商业环境中。象限图在技术上是一个散点图,它被分成四个部分或象限,因此得名。在象限分析中,根据两个参数评估每个实体的绩效。根据实体在任一 KPI 下的表现,实体被分组到任一象限。
在确定实体属于哪个象限后,可以采取措施来提高相关 KPI 下的绩效。

在 Power BI 和 Tableau 等数据可视化工具中准备象限分析非常简单。然而,这个过程在 python 中并不那么简单。

我们将使用由联合国开发计划署发布的人类发展指数中的一些 KPI,完整的 kaggle 数据集可以在这里访问。

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

数据集的头部(图片由作者提供)

我们的数据集由以下数据组成:
一、国家:国家名称
二。hdi : 人类发展指数 三。life_ex : 出生时预期寿命 四。人均国民总收入

象限分析的组成部分

象限分析图有三个组成部分:

i .轴 在 X 轴和 Y 轴中定义了图表中绘制数据所基于的参数(KPI)。
我们将对 20 国集团在两个关键绩效指标方面的表现进行象限分析:
i 。人均国民总收入
。出生时预期寿命
X 轴代表人均国民总收入,Y 轴代表出生时预期寿命,数据将根据这两个指标绘制到相应的象限。

二。基准 X 轴和 Y 轴的阈值极限可定义为基准。
这将轴分成四个象限。当盈利、增长、改善等。都被认为是 y-o-y 基础,一般用‘0’作为客观基准。在一些需要相对比较的情况下,平均值或中间值也可以用作基准。
我们将使用 KPI 的平均值作为基准。

三世。分组 分组指定如何对 X 轴和 Y 轴上测量的数据进行分组。在我们的例子中,唯一可能的分组是国家级的。
如果其他数据可用,即洲级、语言级或其他特定类别,也可用于根据用例进行分组。

准备散点图

准备散点图,X 轴为人均国民总收入,Y 轴为出生时预期寿命*。* 国家标签也被添加到散点图*。*

你可以参考下面这篇关于如何给散点图添加标签的文章*。*

plt.figure(figsize=(12,8))
sns.scatterplot(data=hdi_df, x='gni_pc', y='life_ex')plt.title(f"G 20 Countries : {abbr['gni_pc']} vs {abbr['life_ex']}")
plt.xlabel(abbr['gni_pc'])
plt.ylabel(abbr['life_ex'])

for i in range(hdi_df.shape[0]):
          plt.text(hdi_df.gni_pc[i], y=hdi_df.life_ex[i], s=hdi_df.Country[i], alpha=0.8)

plt.show()

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

散点图(图片由作者提供)

添加基准线

通过添加将图表分成 4 个象限的基准线,散点图可以转换为象限分析图。
标示为 Q1、Q2、Q3 和 Q4 的象限供以后参考。
散点图中增加了分别对应于 x 轴和 y 轴 KPI 平均值的垂直线和水平线。

作者 GitHub 要点

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

分析

一旦数据被分组为 4 个象限,就可以根据用例对这些组进行分析。它可以用来寻找有利可图的产品,最有生产力的工人,落后的国家等。一旦确定了实体的象限,就可以采取具体的行动来将其 KPI 提高到期望的水平。

如上所示,G20 国家被分为 4 个象限。
水平虚线代表平均预期寿命,垂直虚线代表人均国民总收入。

Q1:人均国民总收入>平均值和预期寿命>平均值
Q2:人均国民总收入<平均值和预期寿命>平均值
Q3:人均国民总收入<平均值和预期寿命<平均值
Q4:人均国民总收入>平均值和预期寿命<平均值

在 bot KPI 下,Q1 的国家比其他国家表现更好。每个国家的目标都应该是到达 Q1。(这是我的假设 )
墨西哥,Q2 的预期寿命比平均值高,但是这个国家必须提高人均国民总收入。在这两个参数下,第三季度的国家都落后了,这些国家必须采取具体措施来提高到发达国家的标准。
第四季度沙特阿拉伯的人均收入很高,但人均寿命却低于平均水平。该国必须确定影响其公民预期寿命的因素,并解决这些因素,以达到 Q1。

资源:

这篇文章的笔记本可以在我的 Git Repo 中找到。

成为会员

我希望你喜欢这篇文章,我强烈推荐 注册中级会员 来阅读更多我写的文章或成千上万其他作者写的各种主题的故事。
你的会员费直接支持我和你看的其他作家。你还可以在 Medium 上看到所有的故事。

作者的其他文章:

</5-methods-to-check-for-nan-values-in-in-python-3f21ddd17eed> https://medium.datadriveninvestor.com/visualizing-option-trading-strategies-in-python-35bfa61151d9 https://medium.com/mlearning-ai/stock-market-data-visualization-using-mplfinance-1d35a8d48e4

你可以看看我的 EPL 预测系列中的下面这篇文章,在这篇文章中,我使用象限分析来比较基于 xG 得分和 xG 失球的足球队

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

Nicolas Solerieu 在 Unsplash 上拍摄的照片

如何用 PEGASUS 执行抽象概括

原文:https://towardsdatascience.com/how-to-perform-abstractive-summarization-with-pegasus-3dd74e48bafb?source=collection_archive---------8-----------------------

像马一样工作来完成抽象的摘要任务?不,我们可以骑在飞马上取得好成绩

作者提供的视频

注意:如果你喜欢看视频,请随意播放以上相同内容的视频。

面对冗长的文件,我们自然倾向于不读,或者至少浏览要点。所以做一个总结对节省我们的时间总是有好处的⏳和大脑处理能力。

然而,自动总结曾经是一项不可能完成的任务。具体来说,抽象概括非常具有挑战性。不同于提取摘要(从文档中提取重要的句子并组合它们以形成一个“摘要”),抽象摘要涉及释义单词,因此更困难,但可能给出更连贯和更精炼的摘要。

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

抽象与提取摘要的图解|作者图片

直到 seq2seq 学习和无监督语言模型(如 ELMo 和 BERT)等技术的发展,抽象摘要才变得更加可行。

在自然语言处理(NLP)领域早期突破的基础上,谷歌的 PEGASUS 进一步改进了抽象摘要的最新(SOTA)结果,特别是在资源较少的情况下。更具体地说,与以前的模型不同,PEGASUS 使我们能够通过 1,000 个例子,而不是数万个训练数据,获得接近 SOTA 的结果。

在本文中,我们将着眼于 PEGASUS 的高级工作方式,以及它如何帮助我们完成总结任务。

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

代码为的论文摘要排行榜(截至 2021 年 2 月 4 日)

飞马是如何工作的

1.体系结构

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

PEGASUS 使用编码器-解码器模型|图片由作者提供

在高层次上,PEGASUS 使用编码器-解码器模型进行序列到序列的学习。在这种模型中,编码器将首先考虑整个输入文本的上下文,并将输入文本编码成称为上下文向量的东西,它基本上是输入文本的数字表示。这个数字表示然后将被馈送到解码器,其工作是解码上下文向量以产生摘要。

与最近的 SOTA NLP 模型一致,PEGASUS 也采用了 transformer 架构,如果你想了解更多关于什么是 transformer 的信息,我强烈建议你阅读这篇文章,标题是 Jay Alammar 的“图解 Transformer”

2.预培训

飞马座与以前的 SOTA 模型的区别在于预先训练。

作者(张等。艾尔。)假设预训练模型以输出重要的句子是合适的,因为它非常类似于抽象概括需要做的事情。使用一种称为 ROUGE1-F1 的度量标准,作者能够自动选择“重要”的句子,并在大型语料库上对模型进行预训练,即 3.5 亿个网页和 15 亿篇新闻文章。

有了预先训练好的模型,我们就可以在数量少得多的实际数据上对模型进行微调。事实上,对各种数据集的评估结果表明,仅用 1000 个训练数据,该模型就取得了与以前的 SOTA 模型相当的结果。这具有重要的实际意义,因为我们大多数人没有资源来收集成千上万的文档摘要对。

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

评价结果摘自 PEGASUS 的论文

如何使用飞马

看到 PEGASUS 的评估结果后,您可能想知道如何编写代码来使用该模型。幸运的是,拥抱脸🤗店内有 PEGASUS 模型,使我们很容易利用 PEGASUS。

1.推理

为了进行推理,我们可以遵循拥抱脸网站上提供的示例脚本。

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

拥抱脸上的示例代码截图

根据您的用例与用于微调的数据集的相似程度,您可以将 model_name 与此处列出的各种其他微调模型(除了 google/pegasus-large )进行交换。

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

抱脸上的飞马模特截图

2.微调

如果您想为您的用例定制一个模型,您可以在您的数据集上微调 google/pegasus-large 模型。

为此,请参考我们的 Github 代码,这是我们从 Hugging Face 的示例代码中改编而来的关于微调的

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

我们用于微调的 PyTorch 脚本截图

但是请注意,微调编码器和解码器可能会占用大量内存。如果你的本地计算机不幸不能胜任这个任务(像我的)😅),可以考虑使用谷歌云。由于谷歌云对新注册用户提供免费试用,你可以免费试用。😎

通过上面的指南,我们希望你现在能够适应并采用 PEGASUS 来完成你的抽象概括任务。打个比方,我们不再需要像马一样工作,而是可以骑在飞马上达到很高的高度😉。

感谢阅读,我希望这篇文章是有用的:)也请随时评论您可能有的任何问题或建议。

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

参考

如何使用隔离林算法执行异常检测

原文:https://towardsdatascience.com/how-to-perform-anomaly-detection-with-the-isolation-forest-algorithm-e8c8372520bc?source=collection_archive---------7-----------------------

如何使用这种基于树的算法来检测数据中的异常值

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

史蒂文·卡梅纳在 Unsplash 上拍摄的照片

异常检测是机器学习中经常被忽视的领域。它看起来不像深度学习或自然语言处理那样浮华,并且经常在机器学习课程中被完全跳过。

然而,异常检测仍然很重要,其应用范围从数据预处理到欺诈检测,甚至系统健康监控。有许多异常检测算法,但在撰写本文时,最快的算法是隔离林,也称为 iForest。

在本文中,我将简要解释隔离森林算法的工作原理,并演示如何在 Python 中使用该算法进行异常检测。

隔离林算法的工作原理

隔离林算法利用异常样本(通常称为异常值)的以下属性:

  • 少数 —异常样本是少数,在任何数据集中只有少数。
  • 不同 —异常样本的值/属性与正常样本的值/属性非常不同。

与正常点相比,这两个属性更容易将异常样本从其余数据中分离出来。

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

隔离异常点和正常点。图片由作者提供。

请注意,在上图中,我们只用一条线就可以将异常点从其余数据中隔离出来,而右边的正常点需要四条线才能完全隔离。

该算法

给定数据点 X 、*、*的样本,隔离森林算法使用以下步骤构建隔离树(iTree)、 T

  1. 随机选择一个属性 q 和一个分割值 p.
  2. 使用规则 q < pX 分成两个子集。这些子集将对应于 T. 中的左子树和右子树
  3. 递归地重复步骤 1-2,直到当前节点只有一个样本或者当前节点的所有值都具有相同的值。

然后,该算法多次重复步骤 1–3,以创建几个隔离树,从而生成一个隔离林。基于隔离树是如何产生的以及异常点的属性,我们可以说大多数异常点将位于更靠近树的根的位置,因为与正常点相比,它们更容易被隔离。

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

从小型数据集创建的隔离树示例。图片由作者提供。

一旦我们有了一个隔离森林(隔离树的集合),给定数据点 x 和样本大小 m ,算法使用以下异常分数:

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

隔离林算法的异常分数。图片由作者提供。

在上式中, h(x) 表示给定隔离树中数据点 x i n 的路径长度。表达式 E(h(x))表示穿过所有隔离树的该路径长度的预期或“平均”值。表达式 c(m) 表示给定样本量 mh(x) 的平均值,并使用以下等式定义。

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

h(x)的平均值为样本大小 m。图像由作者提供。

上面的等式是从隔离树与二叉查找树具有相同结构的事实中推导出来的。就路径长度而言,隔离树中节点的终止类似于二叉查找树中的不成功搜索。一旦为给定点计算了异常分数 s(x,m) ,我们可以使用以下标准来检测异常:

  1. 如果 s(x,m) 接近 1,那么 x 极有可能是异常。
  2. 如果 s(x,m) 小于 0.5,则 x 可能是正常点。
  3. 如果 s(x,m) 对于数据集中的所有点都接近 0.5,那么数据可能不包含任何异常。

请记住,对于所有点来说,异常分数总是大于零但小于 1,因此它非常类似于概率分数。

在 Scikit-learn 中使用隔离森林算法

隔离森林算法是 Scikit-learn 中的一个模块。在本教程中,我将演示如何使用 Scikit-learn 通过该算法执行异常检测。你可以在 GitHub 上找到本教程的完整代码

导入库

在下面的代码中,我从 Scikit-learn 导入了一些常用的库以及隔离森林模块。

import numpy as np
import pandas as pd
from sklearn.ensemble import IsolationForest
import matplotlib.pyplot as plt
%matplotlib inline

构建数据集

为了创建一个数据集用于演示目的,我使用了 Scikit-learn 的 make_blobs 函数来创建一个集群,并在下面的代码中添加了一些随机离群值。整个数据集包含 500 个样本,在这 500 个样本中,只有 5%或 25 个样本实际上是异常的。

from sklearn.datasets import make_blobsn_samples = 500
outliers_fraction = 0.05
n_outliers = int(outliers_fraction * n_samples)
n_inliers = n_samples - n_outliersblobs_params = dict(random_state=0, n_samples=n_inliers, n_features=2)X = make_blobs(centers=[[0, 0], [0, 0]], 
               cluster_std=0.5,
               **blobs_params)[0]rng = np.random.RandomState(42)X = np.concatenate([X, rng.uniform(low=-6, high=6, size=(n_outliers, 2))], axis=0)

训练算法

使用 Scikit-learn 的 API 训练隔离林很容易,如下面的代码所示。注意,我在 n_estimators 参数中指定了 iTrees 的数量。还有另一个名为污染的参数,我们可以用它来指定包含异常的数据的百分比。然而,我决定省略这个参数并使用默认值,因为在实际的异常检测情况下,这些信息可能是未知的。

iForest = IsolationForest(n_estimators=20, verbose=2)
iForest.fit(X)

预测异常

预测异常很简单,如下面的代码所示。

pred = iForest.predict(X)

预测函数将为 x 中的每个样本赋值 1 或-1。值 1 表示一个点是正常点,而值-1 表示它是异常点。

可视化异常

现在我们已经为 X 中的每个样本预测了一些标签,我们可以用 Matplotlib 可视化结果,如下面的代码所示。

plt.scatter(X[:, 0], X[:, 1], c=pred, cmap='RdBu')

上面的代码产生了下面的可视化效果。

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

异常点显示为红色,正常点显示为蓝色。图片由作者提供。

在下图中,标记为异常的点显示为红色,正常的点显示为蓝色。该算法似乎在检测异常方面做得很好,尽管在中心的聚类边缘的一些点可能是被标记为异常的正常点。查看异常分数可能有助于我们更好地理解算法的性能。

可视化异常分数

我们可以使用 score_samples 函数生成简化的异常分数,如下所示。

pred_scores = -1*iForest.score_samples(X)

请注意, score_samples 函数返回的分数将全部为负,并且对应于本文前面定义的异常分数的负值。为了保持一致,我将这些分数乘以-1。

我们可以使用下面的代码来可视化分配给每一点的分数。

plt.scatter(X[:, 0], X[:, 1], c=pred_scores, cmap='RdBu')
plt.colorbar(label='Simplified Anomaly Score')
plt.show()

上面的代码给了我们以下有用的可视化。

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

异常分数的可视化。图片由作者提供。

当查看上面的可视化时,我们可以看到算法确实如预期的那样工作,因为靠近中间蓝色聚类的点具有较低的异常分数,而较远的点具有较高的异常分数。

摘要

隔离森林算法是一种快速的基于树的异常检测算法。该算法使用二分搜索法树中路径长度的概念来为数据集中的每个点分配异常分数。该算法不仅快速高效,而且由于 Scikit-learn 的实现,它还可以广泛使用。

像往常一样,你可以在 GitHub 上找到这篇文章的完整代码

加入我的邮件列表

你想在数据科学和机器学习方面变得更好吗?您想了解数据科学和机器学习社区的最新图书馆、开发和研究吗?

加入我的邮件列表,获取我的数据科学内容的更新。当你注册时,你还会得到我免费的解决机器学习问题的逐步指南!也可以在 Twitter 关注我,获取内容更新。

当你这么做的时候,考虑加入媒体社区,阅读成千上万其他作家的文章。

来源

  1. F.刘,丁国明,周志宏,隔离森林,(2008),2008 年第八届 IEEE 数据挖掘国际会议。
  2. F.Pedregosa 等,sci kit-learn:Python 中的机器学习,(2011),机器学习研究杂志。

如何在一行代码中执行近似的字符串匹配

原文:https://towardsdatascience.com/how-to-perform-approximate-string-matching-in-one-line-of-code-76fae5d7efc?source=collection_archive---------4-----------------------

使用 Python 对客户名称列表进行模糊字符串匹配(适用于所有人)

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

图片由来自 Unsplash 的托尔加·乌尔坎拍摄

您是否曾经尝试过使用不完全匹配的键或查找值来连接两个表?也许你在金融或市场部门工作,你必须匹配来自两个不同数据源的两个客户列表。虽然客户名称应该是相同的,但是他们的拼写不同,这对于 VLOOKUP 函数来说是一个不可克服的挑战。如果您要匹配不匹配的字符串列表(例如,客户名称、产品、交易、地址),请继续阅读——本文可能会节省您的工作时间。

文章首先介绍了用于执行近似匹配的科学方法,即 Levenshtein 距离。然后,通过一个案例研究,展示如何将数据从 Excel 导入 Python,在一行代码中执行匹配,并将 1:1 匹配和相似性得分的结果表导出到 Excel。

方法: Levenshtein 距离和 FuzzyWuzzy

模糊字符串匹配或近似字符串匹配是一种技术,给定一个目标字符串,它将从非精确匹配列表中找到其最接近的匹配。如果您尝试使用 Excel 的近似 VLOOKUP 来执行模糊匹配,您会知道它适用于数字的排序列表,但不适用于字符串。原因是 Excel 函数从查找范围中返回一个低于查找值的匹配项,并且其后继值大于查找值。Excel 逻辑很难应用于字符串,所以我们求助于 Levenshtein 距离来进行近似的字符串匹配。

Levenshtein 距离是两个序列之间的距离的稳健且有效的度量。该算法计算编辑距离,即单个单词序列匹配目标序列所需的最小编辑次数(插入、删除或替换)。自 1965 年发明以来,这一指标从未改进过,它有许多应用,包括不同物种基因组的比较。本文不提供算法的数学解释;希望你相信麻省理工学院的研究人员,他们认为是我们将得到的最好的编辑距离算法。

我们可以写一个计算 Levenshtein 距离的函数,但是 FuzzyWuzzy 包已经为我们做了。一旦安装完毕,该软件包将提供一系列方法,最终计算 Levenshtein 距离相似性比率。让我们来看一个案例研究,它将帮助您开始进行近似的字符串匹配。

案例研究:两个客户名称列表的近似匹配

问题陈述

假设我们的任务是匹配两个客户名称列表。客户名来自两个不同的来源:名单 A 是干净的,而名单 B 是被污染的。30 个客户名称应该是 1:1 匹配,但是列表 B 中的名称拼写错误。此外,列表 B 包含空白单元格、标点符号和重复名称(见下图)。虚拟数据集是通过从标准普尔 500 指数中随机选取公司名称生成的。

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

图片作者。虚构客户名称列表

解决这个任务的一个选择是手动执行匹配(Accenture:Accent llxure,Adobe:Addobbe 等)。).然而,如果列表太长或者任务需要重复,人们应该选择更有效的解决方案,通过 FuzzyWuzzy 包利用 Levenshtein 距离。

第一步:数据导入和数据清理

第一步是将 customer names 表从 Excel 导入 Python,并准备好匹配的客户列表。如果您已经知道如何做到这一点,请跳到步骤 2,但是要记住导入相关的包。

在导入 FuzzyWuzzy 包之前,我们必须安装它。我们可以在 Anaconda 提示符下使用命令行pip install fuzzywuzzy。为了将字符串匹配的速度提高 4-10 倍,我们建议安装 Levenshtein Python C(使用命令行pip install python-Levenshtein)。

现在,让我们导入相关的包:

# Import packages
import os
import pandas as pd
from fuzzywuzzy import fuzz

如果输入文件的位置与 Python 文件的位置不同,则需要更改目录。然后,我们使用pandas.read_excel()将客户列表导入到 pandas 数据框架中。使用列表理解,我们遍历列表 A 中的客户名称,删除列表底部的空白。类似地,我们使用列表理解来删除列表 B 中缺少的值,只保留唯一的客户名称。精简列表将减少模糊字符串匹配算法的工作量。

# Change directory
# os.chdir(r"Your file path")# Import the customers data
filename = "customers lists input.xlsx"
customers = pd.read_excel(filename)# Clean customers lists
A_cleaned = [customer for customer in customers["list_A"] if not(pd.isnull(customer))]
B_cleaned = [customer for customer in customers["list_B"].unique() if not(pd.isnull(customer))]

瞧,客户名称已经准备好匹配了。

第二步:用 FuzzyWuzzy 在一行中执行近似匹配

目标是在一行代码中从列表 B 中生成相似性得分和匹配字符串的元组列表。为此,我们使用嵌套列表理解,这被认为比嵌套 For 循环更“pythonic 化”。

Python 化描述了一种编码风格,利用 Python 独有的特性来编写可读性强且美观的代码
( 什么是 Python 化风格?| Udacity

从下面代码片段中的外部循环开始,对于 A_cleaned 中的每个客户名称,我们生成一个元组列表。每个元组由列表 B 中的客户名称及其相对于列表 A 中客户名称的相似性得分组成。列表 A_cleaned 计数 30 个客户名称,因此循环生成 30 个列表,每个列表由 31 个元组组成(在 B_cleaned 中有 31 个客户名称)。因为我们只对列表 B 中最匹配的客户名称感兴趣,所以我们将内部循环包装到内置函数max()中,从而将列表列表转换为元组列表。这样,列表 A 中的每个客户名称只被分配一个元组。

# Perform fuzzy string matching
tuples_list = [max([(fuzz.token_set_ratio(i,j),j) for j in B_cleaned]) for i in A_cleaned]

相似性得分由函数token_set_ratio()生成。在预处理字符串(标记化、小写和删除标点符号)之后,token_set_ratio()计算 Levenshtein 距离,控制两个字符串之间的交集。在比较不同长度的字符串时,FuzzyWuzzy 的token_set_ratio()是首选比率,就像我们的例子一样。

当打印元组列表时,部分输出类似于下面的代码片段:

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

图片作者。相似性得分和匹配字符串的元组列表

步骤 3:将输出导出到 Excel

最后一步是创建一个熊猫数据框架,并将其导出到 Excel。数据帧应该包括:
1)列表 A 中的客户名称
2)列表 B 中的匹配项
3)相似性得分
为了创建数据帧,我们将元组列表解包为两个列表。这可以通过用zip(*)解压缩元组并用内置函数map()将元组转换成列表来实现。

# Unpack list of tuples into two lists
similarity_score, fuzzy_match = map(list,zip(*tuples_list))# Create pandas DataFrame
df = pd.DataFrame({"list_A":A_cleaned, "fuzzy match": fuzzy_match, "similarity score":similarity_score})

创建数据框架后,我们将其导出到名为模糊字符串匹配的新 Excel 工作簿中:

# Export to Excel
df.to_excel("Fuzzy String Matching.xlsx", sheet_name="Fuzzy String Matching", index=False)

查看您保存 Jupyter 笔记本的文件夹,您会发现带有数据框的 Excel 工作簿。看起来所有的比赛都进行的很正确。工作表的一部分应该如下图所示:

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

图片作者。Excel 工作表输出

结论

在 Excel 中,尝试匹配两个不完全匹配的字符串列表是一项具有挑战性的任务。这篇文章展示了如何使用 Python 使近似字符串匹配这一艰巨任务变得简单。事实上,通过利用强大的软件包 FuzzyWuzzy 和 Python 的 list comprehensions,只需一行代码就可以完成匹配。

下面,您可以找到 Jupyter 笔记本,以便于复制。

关于我

我现在是诺维信公司的国际金融毕业生。此前,我在 Novo Holdings 担任初级分析师,同时在哥本哈根商学院完成了金融和投资硕士学位。我对金融数据科学充满热情📈🐍。

如果你对这篇文章有任何问题或建议,你可以写信给 lorenzotracanna@gmail.com 或通过 LinkedIn 联系我。

如何使用 Python 进行债券估值

原文:https://towardsdatascience.com/how-to-perform-bond-valuation-with-python-bbd0cf77417?source=collection_archive---------12-----------------------

Python 中通过贴现现金流分析进行债券估值的实用介绍。

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

照片由像素皮克斯拜拍摄

债券是一种固定收益证券,也总是被称为债券持有人和债券发行人之间的 I.O.U ,包括贷款及其支付的细节。债券就像一种“债务资产”,每天都可以在市场上买卖。

在本文中,我们将了解如何使用 Python 对债券进行估值。这将给我们一些关于“债务”如何变成资产的想法。我们将从理解债券过程开始,然后对债券的估值进行贴现现金流分析。

必备 Python 库

  1. 数字财政——https://numpy.org/numpy-financial/

开源代码库

本文中的原始完整源代码可以在我的 Github Repo 上获得。如果你想用它来关注我的文章,请随意下载(Bond _ evaluation . ipynb)。

粘合过程

债券支付固定金额的利息——以向债券持有人支付息票的形式。一旦债券发行过程开始,债券发行人将开始在特定的时间间隔向债券持有人支付利息(例如每年一次或每年两次等)。在到期日结束时,债券持有人还将获得贷款本金或面值。

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

作者准备的图像

债券持有人作为债券的所有者,有权在到期日之前收到所有的息票付款。这意味着债券持有人从支付给债券发行人的债券价格中获得利息,同时等待到期日结束以收回贷款本金。

债券价格的计算

我们购买债券时的价格是所有未来支付流的现值。

例如,有一种面值为 2000 美元的债券,每年支付 8%的票面利率。如果债券将在 5 年内到期,所有贷款期限的年复合利率为 6%,债券的价格是多少?

债券价格的计算过程如下:

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

作者准备的图像

从上面债券价格计算的图解中,我们可以看到价格是债券期限内 贴现现金流 的总和。利率越高,债券价格越低。这意味着债券价格与利率负相关。

我们可以很容易地使用 Python Numpy-Financial pv 函数将整个计算过程简化成几行脚本。

**第 1–2 行:**导入所需的库。

**第 4–7 行:**定义并给所有需要的参数赋值。

**第 9 行:**应用 Python Financial-Numpy pv 函数计算债券价格。

(注意:原始结果值将是负值,这就是我们将该值乘以-1 以将其变为正值的原因。)

**第 10 行:**显示结果。

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

作者准备的图像

如上面的脚本所示,所有繁琐的计算都被封装在 Numpy-Financial pv 函数中。我们需要做的就是将适当的参数应用到函数中。

到期收益率

债券收益率是衡量我们购买的债券投资回报的指标。最常见的债券收益率指标是到期收益率(YTM) 。YTM 是投资者持有债券至到期时的总预期回报,用年利率表示。YTM 也被认为是债券投资的内部收益率。

近似 YTM 的公式如下:

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

作者准备的图像

例如,我们支付 9000 美元购买面值为 10000 美元的债券。该债券的票面年利率为 5%,将于 4 年后到期。债券投资的 YTM 是多少?

**第 1–4 行:**定义并给所有需要的参数赋值。

**第 6 行:**应用公式近似 YTM。

**第 7 行:**显示结果

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

该债券的 YTM 约为 7.89%。由于债券票面利率(5%)低于其 YTM,债券被折价出售。另一方面,如果票面利率高于 YTM,债券溢价出售。

YTM 有助于投资者判断购买债券是否划算。因为所有债券的所有 YTM 都以相同的年期表示,所以它可以用来比较不同到期日和票面利率的债券。

结论

在本文中,我们已经完成了确定债券理论公允价值的过程,并估算了 YTM。值得注意的是,息票的支付频率可以是一年一次、半年一次、每季度一次或其他周期性间隔,尽管为了简单起见,我们只关注年度支付。无论支付频率如何,债券票面利率总是以年利率表示。

我希望你喜欢阅读这篇文章。

如果你喜欢我关于 Python for Finance 的文章,可以随意 订阅 Medium 。我会坚持不懈地不时发表相关文章。

参考

  1. https://www.investopedia.com/terms/b/bond-valuation.asp
  2. https://courses . lumen learning . com/unlimited-finance/chapter/validating-bonds/
  3. https://www.investopedia.com/terms/y/yieldtomaturity.asp
  4. https://financeformulas.net/Yield_to_Maturity.html
  5. https://scripbox . com/MF/yield-to-maturity/# yield-to-maturity-formula

如何在 Flask 和 Tornado 中执行多任务处理

原文:https://towardsdatascience.com/how-to-perform-multitasking-in-flask-and-tornado-3f00945f4510?source=collection_archive---------2-----------------------

提高阻塞和非阻塞 web 服务器的性能

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

马文·迈耶在 Unsplash 上的照片

M 多任务处理是指(几乎)同时执行多个任务或流程的能力。像 Flask、Django 和 Tornado 这样的现代 web 服务器都能够同时处理多个请求。由于多种解释,多任务的概念实际上非常模糊。您可以使用多重处理、多线程或异步来执行多任务处理。在本文中,我将解释这些概念之间的区别,以及如何在 Flask 和 Tornado 中执行多任务处理。如果你有使用这两个框架的经验,请告诉我们你什么时候更愿意使用其中一个。我挺好奇的:)

抢占式多任务 vs .协作式多任务

一个操作系统有两种多任务选择:抢占式和协作式。在抢占式多任务处理中,应用程序可以共享操作系统(OS)及其底层资源。换句话说,允许操作系统停止当前正在运行的进程,并切换到不受应用程序控制的另一个进程。这意味着操作系统必须优雅地切换上下文。进程的隔离确保了一个进程的无限循环不会阻塞其他进程,但是,当涉及到与其他进程交换数据时,它会带来更多的复杂性。

另一方面,在协同多任务中,一个应用只使用一个主机进程,应用中的任务共享这个单个主机进程的资源。当每个任务不再需要资源时,它必须将控制权让给宿主进程。因此,操作系统对应用程序的控制较少,因为它不允许执行上下文切换。这种方法在某种程度上获得了大部分 CPU,易于扩展,并且易于与其他任务交换数据。但是如果任何一个任务停滞不前(不放弃控制权),整个应用程序也会停滞不前。这就是 asyncio 的基本工作原理,我们将在后面详细讨论。

这张图表直观地显示了这两种类型之间的区别。

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

合作多任务 vs .抢先多任务,由创造

并行性与并发性

多任务处理是在同一时间内运行几项任务的能力。这并不一定意味着这些任务必须在完全相同的时刻开始。这两种场景有不同的名称:并行和并发。

并行是指任务实际上同时开始。这可能发生在多核处理器或多线程处理器上,其中每个核/线程可以独立地启动一个任务。并发是指任务在重叠的时间段内开始、运行和完成,这可能发生在单核服务器上。如果你熟悉 Python 中的全局解释器锁(GIL),你一定知道 Python 在一个进程中只允许一个线程控制解释器,也就是说一个单进程多线程程序最多可以达到 100%的 CPU 利用率。真正的 Python 已经给出了关于 GIL 的很好的教程。

https://realpython.com/python-gil/

在我看来,并行性相当于抢先式多任务处理,并发性相当于协作式多任务处理。

多重处理 vs .多线程 vs .异步

Python 中的多任务问题一般可以使用这些库之一来解决:multiprocessingthreadingasyncio。就使用哪个库而言,取决于用例,用例可以分为 CPU 受限或 I/O 受限。

CPU 绑定问题是指性能由 CPU 的能力决定的情况。CPU 越快或者 CPU 的内核越多,程序的性能就越高。例如处理图像、进行计算等。

I/O 受限问题是指性能由输入/输出操作完成的等待时间决定的情况。I/O 越快,我们获得的性能就越高。例如发出 HTTP 请求、读取文件等。

一个简单的规则是,multiprocessing适合 CPU 受限的问题,threadingasyncio适合 I/O 受限的问题。但是threadingasyncio有什么不同呢?如果用我们目前掌握的知识,threading解决抢占式多任务,asyncio解决协作式多任务。Python 维护一个线程池,当需要时,可以从池中检索新的线程。应该注意的是,所有线程共享相同的内存,因此需要锁定来确保一次只有一个线程可以写入内存中的相同对象。

asyncio中你不用担心这个,因为它在单个进程中使用单线程。但是,asyncio的缺点是你应该记得把控制权还给事件循环(通过yield),否则程序会被阻塞。此外,一旦你使用了asyncio,所有的内部函数/库也应该支持异步。这需要在编码方面付出更多的努力。

如果你想深入研究threadingasyncio,我也推荐以下来自《真实的 Python》的优秀文章。

https://realpython.com/intro-to-python-threading/ https://realpython.com/async-io-python/

我花了相当多的时间介绍多任务处理的问题和理论,我认为在进入代码之前了解这些是非常重要的。我希望你现在已经打好了基础。让我们进入有趣的部分吧!

烧瓶 vs .龙卷风

Flask 和 Tornado 都是 Python 世界中流行的 web 框架,目的不同。Flask 是一个基于 WSGI 的轻量级 web 框架,Tornado 是一个 web 框架,也是一个异步网络库。

如何处理并发请求?

这种不同的设置也意味着它们将以不同的方式处理并发请求。从 Flask 1.0 开始,默认情况下 flask server 是多线程的。每个新请求都在一个新线程中处理。

这是一个使用默认设置的简单烧瓶应用程序。出于演示目的,我在返回响应之前放置了sleep(1)。它能够在大约 2 秒钟内处理 10 个并发请求。

带螺纹的烧瓶应用程序=True

如果我禁用线程模式,您可以看到性能的巨大差异。是因为这个同步服务器现在只有一个线程,所以每个请求都是在前一个完成之后开始的。

带螺纹的烧瓶应用程序=假

现在,让我们来看看龙卷风。这也是一个响应中带有sleep(1)的简单例子。然而,处理 10 个并发请求需要 10 秒钟。嗯,这里出了什么问题?

带同步代码的 Tornado 应用

原因是 Tornado 是一个只有一个线程的异步服务器。这个例子实际上与第二个烧瓶例子的情况相同。为了使用异步服务器,阻塞代码time.sleep(1)(实际上是您可能有的所有阻塞代码)必须被非阻塞代码替换。这就是为什么我之前说过,我们需要更多地了解异步中的编码部分,因为任何隐藏的阻塞代码都可能阻塞整个应用程序,而且我们大多数人更习惯于编写同步代码而不是异步代码。

解决方案之一是使用异步版本的sleep,即tornado.gen.sleep。结果与第一个烧瓶示例相同。此外,完整功能与async/await关键字异步。

带有异步代码的 Tornado 应用程序

如何在请求过程中进行多任务处理?

我们讨论了如何在 Flask 和 Tornado 中处理并发任务,这是多任务处理的一种。另一种类型的多任务发生在请求的处理过程中。例如,在返回响应之前,服务器需要从 5 个不同的端点收集数据。如果服务器逐个执行请求,将会对性能产生巨大影响。

在这种背景下,我们不需要太依赖框架本身。这是如何在同步和异步应用程序中处理并发 web 请求的问题。由于是 I/O 操作,threadingasynciomultiprocessing要好。

下面是ThreadPoolExecutor在 Flask 中的实现。性能和前面的例子一样高。

Flask 中的并发请求

这就是你在龙卷风中可以做到的。请记住,在异步应用程序中,一切都应该是异步的。出于演示的目的,我使用了一个模拟函数,但是实际上,您应该使用一个类似于aiohttp的异步 HTTP 库。

Tornado 中的并发请求

如何运行后台任务?

最后但同样重要的是,我想向您展示如何在 Flask 和 Tornado 应用程序中运行后台任务。如果您想要调度作业或让某些东西连续运行而不干扰主进程,后台任务会非常有用。

一般来说,Tornado 更支持后台任务,但您也可以在 Flask 中实现这一点。

就像前两个场景一样,我们可以再次使用threading在 Flask 中实现这一点。需要注意的是,后台作业的启动要在 Flask app 启动之前完成。

烧瓶中的后台任务

查看这个博客,看看如何使用 uWSGI 在 Flask 中进行后台作业。

在这种情况下,Tornado 有两种不同的方式使用其本机功能来实现这一点:[spawn_callback](https://www.tornadoweb.org/en/stable/ioloop.html#tornado.ioloop.IOLoop.spawn_callback)[PeriodicCallback](https://www.tornadoweb.org/en/stable/ioloop.html#tornado.ioloop.PeriodicCallback)。它们的主要区别在于,spawn_callback是一个“一劳永逸”的功能,在启动作业后你没有任何控制权,而PeriodicCallback返回给你一个任务实例,你可以在以后启动和停止。

在龙卷风中使用 spawn_callback

这是一个周而复始的例子。在启动 web 服务器之前,不要忘记启动该任务。

在 Tornado 中使用 PeriodicCallback

结论

在本文中,我们从 3 个不同的角度讨论了如何在 Flask 和 Tornado 中执行多任务。在此之前,我们详细介绍了两种多任务模式以及多处理、多线程和异步之间的区别。

希望这篇文章对你有帮助!如果你有任何想法,请在下面留下你的评论。

参考

https://leimao.github.io/blog/Python-Concurrency-High-Level/

如何在 PyTorch 中执行有序回归/分类

原文:https://towardsdatascience.com/how-to-perform-ordinal-regression-classification-in-pytorch-361a2a095a99?source=collection_archive---------4-----------------------

订购标签时提高模型性能的一个简单技巧。

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

由 vectorjuice 创建的抽象向量—www.freepik.com

当你有一个多类分类问题,并且这些类是有序的,这就是所谓的“有序回归”问题。一个例子可以是将学生的表现分类为 A > B > C > D > E。使用普通分类器解决这类问题的问题是,模型会假设将 A 误分类为 D 的错误与将 A 误分类为 B 的错误一样严重——这显然是不正确的,因为 AD 之间的差异要比它们之间的差异大得多有序回归的另一个名字是有序分类或者甚至排序学习;你可能已经猜到了,这些方法让模型知道类的顺序关系,让模型学习排序,而不是学习分类

这篇文章将展示一个使用自定义损失函数在 PyTorch 中执行有序回归的简单技巧。虽然我将针对一个特定的问题介绍这个技巧,但是你可以将它应用于任何顺序回归问题和任何其他框架。

一个序数问题的例子

让我们首先找到一个数据集进行测试。我最近写了一篇关于如何预测化学分子的性质的帖子——通常对于这类问题,预测分子性质是否在给定范围内是很有趣的,例如,我们可能在预测不同分子对于给定任务的效率,我们希望将这种效率分为高>中>低

为了测试,我从 GitHub 获取了一个“亲脂性”回归数据集,其中包含 2100 个分子及其相关的亲脂性测量值(在油中的溶解度)。我将数据集转换为多类有序分类问题,目标是将分子分为 5 类:最低<低<中<高<最高。

以下是序数问题的数据分布概述:

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

**左)**回归数据集中目标的原始分布。**右)**左边的数据集转换成五个大小相等的顺序标签,对应最低<低<中<高<最高。由作者策划。

基线模型:正常分类

正如我在上一篇文章中所展示的,很容易为我们的数据集快速训练一个标准分类模型,“标准”,这意味着它是用给定 5 个定义的类的正常交叉熵损失函数来训练的。作为最初的评估,我将数据集分为 50%的训练和 50%的测试,并在测试数据集上运行我的评估。结果如下:

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

用交叉熵损失训练的模型的混淆矩阵。由作者策划。

它的表现不太稳定;它在划分低等级和高等级方面相当不错,但是对于中等等级就不那么好了。

有序回归模型

现在让我们试着训练一个序数模型;我们使用的技巧是由程等人在 2008 年介绍的。我们的想法是将每个类转换成以下向量:

Lowest  -> [1,0,0,0,0]
Low     -> [1,1,0,0,0]
Medium  -> [1,1,1,0,0]
High    -> [1,1,1,1,0]
Highest -> [1,1,1,1,1]

这个简单编码(或类似的变体)的酷之处在于,类之间的差异遵循一个顺序尺度;即最低最高之差大于最低中等之差。

我们的网络的想法是为每个标签输出一个具有二进制分数的 5 维向量(例如,最终层上的 sigmoid 激活函数),并训练它来预测这些独一无二的嵌入。一旦我们对其进行了训练,我们就可以通过对我们的预测应用大于 0.5 的阈值,并从左到右计数预测中(即代码中)出现了多少个连续的True值,来将预测转换回目标标签:

显示如何将预测转换为目标标签的示例代码。作者代码。

为了训练网络,我们需要一个合适的损失函数。2008 年的论文指出,这可以是二元交叉熵损失,也可以是平方误差损失。要了解误差如何随着类间距离的增加而增加,请考虑以下平方误差函数的情况:

Lowest vs. Lowest: (1-1)²+0+0+0+0 = 0
Lowest vs. Low: (1-1)²+(0–1)²+0+0+0 = 1
Lowest vs. Medium: (1–1)²+(0–1)²+(0–1)²+0+0 = 2
Lowest vs. High: (1–1)²+(0–1)²+(0–1)²+(0–1)²+0 = 3
Lowest vs. Highest: (1–1)²+(0–1)²+(0–1)²+(0–1)²+(0–1)² = 4

损失函数应该以两个参数作为输入,即predictionstargets。在我们的设置中,predictions数组的输入维数是[batch_size × 5],而targets数组只是一个标签 id 列表。为了执行有序回归,我们需要根据我们之前的编码将targets列表扩展为[batch_size, num_labels]张量,并返回预测和扩展目标之间的均方误差损失:

损失函数的代码,它首先对目标标签进行编码,然后计算 MSE。作者代码。

如果我们用这个损失函数重新训练我们的模型,结果是:

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

用有序损失函数训练的模型的混淆矩阵。由作者策划。

显然,结果看起来比之前的分类运行更“斜”,这表明,事实上,我们更多地惩罚了在序数尺度上偏离几个标签的模型。我们能量化这种方法的效果吗?一种选择是查看标签指数的均方根误差(RMSE ),即我们的预测距离目标大约有多少个类别。在这个测试案例中,分类模型的 RMSE 是 1.06,而顺序模型的是 0.93,提高了 12%!

但是!这只是针对一个数据集的一个随机训练测试分割——为了完整起见,我使用 10 倍交叉验证(CV)对多个数据集和不同数量的标签进行了量化;这应该让我们更现实地了解这两种方法的优劣。折叠外的结果如下,其中我列出了 RMSE 误差的%改进:

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

顺序训练代替交叉熵训练对 RMSE 的改进。每一列都是一个独立的数据集,分为 3、5、10 或 20 个标签。

在大多数情况下,我们实现了改进,但是偶尔结果是相反的——性能随着顺序损失而降低。怎么会这样呢?除了数据集和我们正在建模的内容的根本差异之外,还有一些潜在的因素浮现在脑海中:

  • **数据集大小;**如果我们有一个大的数据集,我们可能对每个标签有足够数量的样本来执行正常分类,交叉熵损失可能比有序损失函数表现得更好。为了测试这一点,我们可以运行相同的 CV,其中我们只从每个数据集挑选 500 个分子(明显少于完整的数据集)。结果(如下所示)好得多;但是,对于某些数据集组合,有序损失函数的性能仍然比多类模型差。天下没有免费的午餐,所以这种序数伎俩显然不能保证奏效。

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

在只有 500 个分子的数据集上,通过顺序训练而不是交叉熵训练来改善 RMSE。每一列都是一个独立的数据集,分为 3、5、10 或 20 个标签。

  • **排名不一致;**如果我们的顺序预测输出[0.9, 0.9, 0.49, 0.72, 0.1]会怎么样。从左到右的迭代将导致预测标签为 2(因为 0.49 < 0.5),即使正确答案也可能是 4(因为 0.72 > 0.5)。我发现在任何预测中几乎没有等级不一致,所以这不是性能下降的原因。

结束语

使用有序目标类时,使用有序损失函数可以快速获得显著的性能提升。然而,没有免费的午餐,我们应该用不同的损失函数训练模型,看看什么对给定的数据集最有效

在 2020 年,Cao 等人在[2]中发表了一种方法,该方法使用神经网络的共享倒数第二层,对每个二进制输出使用单独的偏置单元,以秩一致的方式执行有序回归。他们在这个 Github 库中发布了他们的 Coral 方法。尽管本帖中提出的问题集中没有等级不一致,但我确实尝试在本帖中执行的 CV 测试中使用 Coral,但这些数据集的性能一直较差。这再次表明,没有免费的午餐,一个人应该总是尝试多种事情。

[1] 简麟程郑旺Gianluca Pollastri ,有序回归的神经网络方法(2008 年) IEEE 国际神经网络联合会议

[2]曹,瓦希德米尔贾利利,塞巴斯蒂安拉什卡,秩一致序贯回归神经网络及其在年龄估计中的应用(2020),模式识别字母

如何用 Top2Vec 进行主题建模

原文:https://towardsdatascience.com/how-to-perform-topic-modeling-with-top2vec-1ae9bb4e89dc?source=collection_archive---------3-----------------------

介绍一种更复杂的主题建模方法。

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

格伦·卡丽在 Unsplash 拍摄的照片

主题建模是自然语言处理中的一个问题,在现实世界中有许多应用。能够在大段文本中发现主题有助于我们更详细地理解文本数据。

多年来,潜在狄利克雷分配(LDA)一直是主题建模最常用的算法。该算法于 2003 年首次推出,将主题视为不同单词出现的概率分布。如果你想看看 LDA 的实际应用,你应该看看我下面的文章,我在假新闻分类数据集上执行了 LDA。

然而,随着 transformer 模型和嵌入算法(如 Doc2Vec)的引入,我们可以创建更复杂的主题模型来捕捉单词中的语义相似性。事实上,一种叫做 Top2Vec 的算法使得使用嵌入向量和聚类建立主题模型成为可能。在本文中,我将展示如何使用 Top2Vec 通过嵌入向量和聚类技术来执行无监督的主题建模。

Top2Vec 是如何工作的?

Top2Vec 是一种算法,它检测文本中存在的主题,并生成联合嵌入的主题、文档和单词向量。在高层次上,该算法执行以下步骤来发现文档列表中的主题。

  1. 为文档和文字生成嵌入向量。
  2. 使用 UMAP 等算法对向量进行降维。
  3. 使用聚类算法(如 HDBSCAN)对向量进行聚类。
  4. 给每个集群分配主题。

我在下面详细解释了每个步骤。

为文档和单词生成嵌入向量

嵌入向量是允许我们在多维空间中表示单词或文本文档的向量。嵌入向量背后的思想是相似的单词或文本文档将具有相似的向量。

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

一个句子的单词嵌入,每个单词有 5 维向量。图片由作者提供。

生成嵌入向量的算法有很多。Word2Vec 和 Doc2Vec 非常流行,但近年来,NLP 开发人员和研究人员已经开始使用转换器来生成嵌入向量。如果你有兴趣了解更多关于变形金刚的知识,可以看看我下面的文章。

为每个文档创建嵌入向量允许我们将每个文档视为多维空间中的一个点。Top2Vec 还创建了联合嵌入的单词向量,这使得我们可以在以后确定主题关键词。

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

联合嵌入的单词和文档向量。图片由作者提供。

一旦我们有了一组单词和文档向量,我们就可以进入下一步。

执行降维

在我们有了每个文档的向量之后,下一个自然的步骤是使用聚类算法将它们分成簇。然而,根据所使用的嵌入模型,从第一步生成的向量可以具有多达 512 个分量。

因此,执行某种降维算法来减少数据中的维数是有意义的。Top2Vec 使用一种称为 UMAP(均匀流形逼近和投影)的算法来为每个文档生成低维嵌入向量。

聚集向量

Top2Vec 使用 HDBSCAN(一种基于密度的分层聚类算法)来查找文档的密集区域。HDBSCAN 基本上只是 DBSCAN 算法的扩展,它将 DBSCAN 算法转换为层次聚类算法。使用 HDBSCAN 进行主题建模是有意义的,因为较大的主题可以由几个子主题组成。

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

聚类文档和单词向量。图片由作者提供。

为每个集群分配主题

一旦我们有了每个文档的集群,我们就可以简单地将每个文档集群视为主题模型中的一个单独的主题。每个主题可以被表示为主题向量,该主题向量实质上就是属于该主题聚类的原始文档的质心(平均点)。为了使用一组关键词来标记主题,我们可以计算与主题质心向量最近的 n 个单词。

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

主题群和关键词。图片由作者提供。

一旦我们有了每个主题的关键词,算法的工作就完成了,由我们人类来解释这些主题的真正含义。虽然 Top2Vec 比主题建模的标准 LDA 方法复杂得多,但它可能会给我们带来更好的结果,因为单词和文档的嵌入向量可以有效地捕捉单词和短语的含义。

安装 Top2Vec

您可以使用 pip 和以下命令安装 Top2Vec:

pip install top2vec

您还可以安装带有附加选项的 Top2Vec,如 Top2Vec GitHub 库中的 README 文档所示。

为了让 Top2Vec 安装本教程所需的预训练通用语句编码器,您应该运行以下命令。

pip install top2vec[sentence_encoders]

Top2Vec 教程

在本教程中,我将演示如何使用 Top2Vec 在 20 个新闻组文本数据集中发现主题。这个数据集包含大约 18000 个新闻组帖子,涉及 20 个主题。你可以在 GitHub 上访问本教程的完整代码

导入库

import numpy as np
import pandas as pd
from top2vec import Top2Vec

读取数据

对于本教程,我将使用 20 个新闻组文本数据集。这个数据集包含大约 18000 个新闻组帖子,涉及 20 个主题。我们可以通过 Scikit-learn 下载数据集,如下所示。

from sklearn.datasets import fetch_20newsgroupsnewsgroups = fetch_20newsgroups(subset='all', remove=('headers', 'footers', 'quotes'))

训练 Top2Vec 模型

训练 Top2Vec 模型非常容易,只需要一行代码,如下所示。

from top2vec import Top2Vecmodel = Top2Vec(articles_df['content'].values, embedding_model='universal-sentence-encoder')

注意,我使用了上面的通用句子编码器嵌入模型。如果您安装了带有句子编码器选项的 Top2Vec,那么您可以使用这个模型。否则,只需删除该参数,默认情况下,模型将使用 Doc2Vec 嵌入进行训练。

查看主题的数量

一旦 Top2Vec 模型根据数据进行了训练,我们就可以使用 model 对象来获取关于所提取主题的信息。例如,我们可以查看使用 get_num_topics 函数发现的主题数量,如下所示。

model.get_num_topics()

运行上面的代码会产生以下输出。

100

获取每个主题的关键词

Top2Vec 模型有一个名为 topic_words 的属性,它基本上只是一个 Numpy 数组,包含每个主题的单词列表。

model.topic_words

在 Jupyter 笔记本单元格中运行上面的代码会产生以下输出。

array([['recchi', 'potvin', 'nyr', ..., 'pittsburgh', 'binghamton',
        'pitt'],
       ['diagnosed', 'symptoms', 'diagnosis', ..., 'mfm', 'affected',
        'admitted'],
       ['spacecraft', 'jpl', 'orbiter', ..., 'scientist', 'convention',
        'comet'],
       ...,
       ['liefeld', 'wolverine', 'comics', ..., 'requests', 'tickets',
        'lemieux'],
       ['vice', 'pacific', 'bay', ..., 'projects', 'chapter', 'caps'],
       ['armenians', 'ankara', 'armenian', ..., 'discussed',
        'azerbaijani', 'whom']], dtype='<U15')

如果我们想看到特定主题的单词,我们可以简单地索引这个数组,如下所示。

model.topic_words[0]

上面的代码给出了主题 0 的单词列表。

array(['recchi', 'potvin', 'nyr', 'nyi', 'lemieux', 'lindros', 'nhl',
       'phillies', 'defenseman', 'mets', 'ahl', 'jagr', 'bruins',
       'sabres', 'cubs', 'gretzky', 'alomar', 'pitchers', 'pitching',
       'clemens', 'canucks', 'inning', 'henrik', 'innings', 'yankees',
       'oilers', 'utica', 'islanders', 'boswell', 'braves', 'hockey',
       'rangers', 'leafs', 'flyers', 'sox', 'playoffs', 'wpg', 'baseball',
       'dodgers', 'espn', 'goalie', 'fuhr', 'playoff', 'ulf', 'hawks',
       'batting', 'tampa', 'pittsburgh', 'binghamton', 'pitt'],
      dtype='<U15')

正如我们所看到的,这个话题似乎主要是关于体育,尤其是棒球和曲棍球,因为我们看到了流行的棒球队的名字以及曲棍球运动员的姓氏。

创建主题词云

我们可以轻松地为主题生成词云,以便更好地了解主题中关键词的频率。

model.generate_topic_wordcloud(0)

运行上面的代码会产生下面的单词 cloud。

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

话题 0 的词云。图片由作者提供。

上面的单词云很有用,因为它让我们直观地了解不同单词与主题的相对频率。我们可以看到“费城人”和“雷米尔”这样的词比“季后赛”或“坦帕”这样的词出现的频率更高。

访问主题向量

topic_vectors 属性允许我们访问每个主题的主题向量,如下所示。

model.topic_vectors

正如我们在下面的输出中看到的,Top2Vec 模型的主题向量存储为一个二维 Numpy 数组,其中每一行对应一个特定的主题向量。

array([[-9.1372393e-03, -8.8540517e-02, -5.1944017e-02, ...,
         2.0455582e-02, -1.1964893e-01, -1.1116098e-04],
       [-4.0708046e-02, -2.6885601e-02,  2.2835255e-02, ...,
         7.2831921e-02, -6.1708521e-02, -5.2916467e-02],
       [-3.2222651e-02, -4.7691587e-02, -2.9298926e-02, ...,
         4.8001394e-02, -4.6445496e-02, -3.5007432e-02],
       ...,
       [-4.3788709e-02, -6.5007553e-02,  5.3533200e-02, ...,
         2.7984662e-02,  6.5978311e-02, -4.4375043e-02],
       [ 1.2126865e-02, -4.5126071e-03, -4.6988029e-02, ...,
         3.7431438e-02, -1.2432544e-02, -5.3018846e-02],
       [-5.2520853e-02,  4.9585234e-02,  5.9694829e-03, ...,
         4.1887209e-02, -2.1055080e-02, -5.4151181e-02]], dtype=float32)

例如,如果我们想要访问任何主题的向量,我们可以简单地基于我们正在寻找的主题编号来索引 Numpy 数组。

使用模型的嵌入函数

我们还可以使用 Top2Vec 模型使用的嵌入模型来为文本的任何部分生成文档嵌入,如下所示。请注意,如果在训练 Top2Vec 模型时没有指定嵌入模型,这是不可能的。

embedding_vector = model.embed(["This is a fake news article."])
embedding_vector.shape

运行上面的函数会产生以下输出。

TensorShape([1, 512])

根据上面的输出,我们可以看到嵌入模型将文本转换为 Python 张量对象形式的 512 维向量。

使用关键词搜索主题

我们可以使用关键字搜索主题,如下所示。请注意,该函数返回搜索中找到的每个主题的主题关键字、单词分数、主题分数和主题编号的列表。

topic_words, word_scores, topic_scores, topic_nums = model.search_topics(keywords=["politics"], num_topics=3)

我们可以看看主题单词和主题分数,看看搜索返回了什么主题。

topic_words, topic_scores

上面的代码在 Jupyter 中产生以下输出。

([array(['clinton', 'bush', 'president', 'reagan', 'democratic',
         'republicans', 'elected', 'congress', 'wiretap', 'administration',
         'election', 'johnson', 'politically', 'politicians', 'politics',
         'political', 'executive', 'senate', 'bill', 'constitutional',
         'democracy', 'lib', 'government', 'gov', 'iraq', 'corrupt',
         'convention', 'rockefeller', 'nist', 'ford', 'grant',
         'libertarian', 'nuy', 'govt', 'feds', 'libertarians', 'decades',
         'recall', 'ws', 'bureau', 'bullshit', 'nsa', 'stephanopoulos',
         'weren', 'liar', 'koresh', 'affairs', 'barry', 'conservative',
         'secretary'], dtype='<U15'),
  array(['um', 'ci', 'oo', 'll', 'ye', 'hmm', 'un', 'uh', 'y_', 'wt', 'on',
         'uu', 'actually', 'an', 'eh', 'way', 'des', 'er', 'se', 'not',
         'has', 'huh', 'of', 'ya', 'so', 'it', 'in', 'le', 'upon', 'hm',
         'one', 'is', 'es', 'ne', 'at', 'what', 'no', 'au', 'est', 'shut',
         'mm', 'got', 'dont', 'lo', 'tu', 'en', 'the', 'have', 'am',
         'there'], dtype='<U15'),
  array(['libertarian', 'libertarians', 'govt', 'liberties', 'democracy',
         'democratic', 'government', 'conservative', 'gov', 'republicans',
         'governments', 'liberty', 'constitutional', 'opposed', 'communist',
         'politically', 'advocate', 'citizens', 'premise', 'opposition',
         'patents', 'fascist', 'opposing', 'compromise', 'feds', 'liberal',
         'politicians', 'independent', 'reform', 'johnson', 'philosophy',
         'ron', 'citizen', 'aclu', 'politics', 'frankly', 'xt', 'defend',
         'political', 'regulated', 'militia', 'republic', 'radical',
         'against', 'amendment', 'unified', 'argument', 'revolution',
         'senate', 'obey'], dtype='<U15')],
 array([0.23019153, 0.21416718, 0.19618901]))

我们可以看到题目也是按照题目分值来排序的。相似性得分最高的主题首先显示在上面的第一个列表中。

按主题搜索文档

通过search _ documents _ by _ topic功能,我们可以很容易地找到属于特定主题的文档。这个函数需要一个主题号和我们想要检索的文档数。

model.search_documents_by_topic(0, num_docs=1)

运行上面的函数会产生以下输出。

(array(['\nI think this guy is going to be just a little bit disappointed.  Lemieux\ntwo, Tocchet, Mullen, Tippett, and Jagr.  I buzzed my friend because I forgot\nwho had scored Mullen\'s goal.  I said, "Who scored?  Lemieux two, Tocchet,\nTippett, Jagr."  The funny part was I said the "Jagr" part non-chalantly as\nhe was in the process of scoring while I was asking this question!!! :-)\n\nAll in all ABC\'s coverage wasn\'t bad.  On a scale of 1-10, I give it about\nan 8\.  How were the games in the Chi/St. Louis/LA area???\n\n\nThat\'s stupid!!!  I\'d complain to the television network!  If I were to even\nsee a Pirates game on instead of a Penguins game at this time of the year, I\nand many other Pittsburghers would surely raise hell!!!\n\n\nTexas is off to a good start, they may pull it out this year.  Whoops!  That\nbelongs in rec.sport.baseball!!!'],
       dtype=object),
 array([0.75086796], dtype=float32),
 array([12405]))

我们可以看到上面的文章肯定是关于棒球的,这与我们对第一个话题的解读相吻合。

减少话题的数量

有时 Top2Vec 模型会发现许多小主题,很难处理这么多不同的主题。幸运的是,Top2Vec 允许我们执行分层主题缩减,它迭代地合并相似的主题,直到我们达到期望的主题数量。我们可以将模型中的主题数量从 100 个减少到 20 个,如下面的代码所示。

topic_mapping = model.hierarchical_topic_reduction(num_topics=20)

该函数返回的主题映射是一个嵌套列表,它解释了哪些主题已经合并在一起形成了 20 个更大的主题。

如果我们想查看 topic 1 中的原始主题,我们可以在 Jupyter 中运行以下代码。

topic_mapping[1]

上面的代码产生了下面的合并主题编号列表。

[52, 61, 75, 13, 37, 72, 14, 21, 19, 74, 65, 15]

然而,使用这种映射可能有点乏味,所以 Top2Vec 允许我们访问具有新属性的新主题的信息。例如,我们可以使用 topic_words_reduced 属性来访问新的主题关键字。

model.topic_words_reduced[1]

运行上面的代码为我们提供了以下主题 1 的关键字更新列表:

array(['irq', 'mhz', 'processor', 'sgi', 'motherboard', 'risc',
       'processors', 'ati', 'dma', 'scsi', 'cmos', 'powerbook', 'vms',
       'vga', 'cpu', 'packard', 'bsd', 'baud', 'maxtor', 'ansi',
       'hardware', 'ieee', 'xt', 'ibm', 'computer', 'workstation', 'vesa',
       'printers', 'deskjet', 'msdos', 'modems', 'intel', 'printer',
       'linux', 'floppies', 'computing', 'implementations',
       'workstations', 'hp', 'macs', 'monitor', 'vram', 'unix', 'telnet',
       'bios', 'pcs', 'specs', 'oscillator', 'cdrom', 'pc'], dtype='<U15')

基于上面的关键词,我们可以看到这个话题似乎大多是关于电脑硬件的。

关于 Top2Vec 中可用功能的更多细节,请查看 Top2Vec GitHub 库。我希望这篇教程对你有用。

摘要

Top2Vec 是最近开发的主题建模算法,可能在不久的将来取代 LDA。与 LDA 不同,Top2Vec 生成联合嵌入的单词和文档向量,并对这些向量进行聚类,以便在文本数据中找到主题。开源的 Top2Vec 库也非常容易使用,并允许开发人员在一行代码中训练复杂的主题模型。

像往常一样,你可以在 GitHub 上找到这篇文章的完整代码。

加入我的邮件列表

你想在数据科学和机器学习方面变得更好吗?您想了解数据科学和机器学习社区的最新图书馆、开发和研究吗?

加入我的邮件列表,获取我的数据科学内容的更新。当你注册的时候,你还会得到我免费的解决机器学习问题的逐步指南!你也可以在 Twitter 上关注我的内容更新。

当你这么做的时候,考虑加入媒体社区,阅读成千上万其他作家的文章。

来源

  1. D.M. Blei,A. Y. Ng,M. I. Jordan,潜在狄利克雷分配,(2003),机器学习研究杂志 3。
  2. D.arXiv.org,安杰洛夫, Top2Vec:主题的分布式表示,(2020)。
  3. 长度 arXiv.org,麦金尼斯,j .希利和 j .梅尔维尔, UMAP:一致流形近似和降维投影,(2020)。
  4. C.Malzer 和 M. Baum,(2021),arXiv.org。

如何在数据世界中选择合适的职业

原文:https://towardsdatascience.com/how-to-pick-the-right-career-in-the-data-world-1cec8a084767?source=collection_archive---------10-----------------------

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

科里·伍德沃在 Unsplash 上拍摄的照片

办公时间

数据科学家,数据分析师,还是数据工程师?你怎么知道哪个适合你呢?

众所周知,数据工程师、数据科学家和数据分析师是当今许多人关注并希望进入的热门角色。普华永道将这三个职位描述为“T6”美国最受欢迎的职位,而数据科学家和数据工程师在 LinkedIn 的 2020 年新兴工作报告中分别排名第 3 和第 8。

这些角色彼此关系非常密切;事实上,许多公司甚至可以互换使用这两个术语。因此,如果你正在考虑进入数据世界,选择正确的角色可能看起来是一项艰巨的任务,伴随着许多问题:没有博士学位,我能成为一名数据科学家吗?想做数据分析师需要懂 Python 或者 R 吗?作为一名曾经从事数据科学家工作,目前从事数据分析师工作,并且在这两项工作中都与许多数据工程师密切合作的人,我将尝试为您打破差异,并为您指出每项工作的正确资源。

概述—高层次的差异和重叠

如果我们粗略地将公司分为两个方面——工程方面和业务方面——我们可以使用下面的文氏图来说明角色与公司任何一方之间的关系和重叠。请注意,这种区别适用于大多数中型和大型公司;然而,在小型创业公司中,这些角色之间的界限变得模糊;很多时候,这些角色可能是所有三种角色的混合。

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

作者图片

数据工程师是三者中最接近典型工程师角色的,离业务端最远的。数据工程师将大部分时间花在设计、构造、构建和维护数据库上。大多数公司的数据来自很多不同的来源,内部的和外部的;数据工程师的工作是构建和维护数据仓库,使公司的其他部门能够轻松访问和使用数据。不同的数据表如何相互连接?每个表的主键应该是什么?这些是数据工程师在工作中做出的一些决策示例。数据工程师偶尔会与公司的业务部门合作定义表的结构,因为业务团队通常是数据工程师构建的许多表的最终用户。

数据科学家可能是这三个职位中最知名、被提及最多的一个。对这个角色的一个误解是,你必须拥有机器学习或类似领域的博士学位。对于专注于建模和算法的数据科学家来说,这是事实。这些数据科学家(在一家公司的所有数据科学家中约占 30%)通常来自非常强大和高度量化的学术背景,并在高级 ML 主题中具有丰富的理论知识和实践经验。然而,**大部分(~70%)的数据科学家来自更加多样化的背景。**他们花大部分时间进行与不同业务指标相关的 AB 测试和分析;他们建立的模型可能用于需求预测或特别分析,而不是强化学习或深度神经网络。本文在提到数据科学家时会提到后一类人。

数据分析师在许多公司中与数据科学家互换使用,因为这两个团队都与指标和特别分析密切相关。如果一定要进行区分,那可能是数据分析师更多地致力于业务解释和指标的可视化,而数据科学家则花费大量时间进行统计分析。

重叠在三个角色中很常见。从事数据科学项目的每个人都知道,通常大约 80%的时间花在数据清理上,而回归或分类最终只需要大约 20%,如果不是更少的话。这就是数据科学家和数据分析师与数据工程师密切合作如此重要的原因;他们可以通过在数据进入表格之前预先构建和清理数据,将任何人从坏数据中解救出来。

我对每个项目的数据工程师(GIF by GIPHY )

为了更好地说明这三个角色是如何协同工作的,想象一家公司想要为他们的应用程序的新功能推出 AB 测试;数据科学家将领导确定实验的规模,并决定如何划分对照组和测试组;数据工程师将在后台建立数据库,以确保当 AB 测试启动时,用户活动和事件被记录,并且数据以正确的格式和结构流入数据库。实验结束后,数据科学家和数据分析师将对 AB 测试的结果执行统计分析,深入研究他们关心的一些指标,并为报告目的构建可视化。

技术要求

某种程度的编码技能对这三者来说都是必须的,但是到底什么样的编程语言和什么样的分析平台对每一个都是必须的呢?

GIF by GIPHY

数据工程师是不同数据仓库和云计算平台,以及如何构建提取/转换/加载(ETL)数据管道的专家。他们在日常工作中使用 AWS、谷歌云、雪花和许多其他工具。数据工程师熟悉 SQL 和 Python,有的擅长 C++和 Java。

数据科学家拥有深厚的统计知识,对 SQL、R 和 Python 并不陌生。一个好的数据科学家也知道一些基本的理论上的机器学习算法,以及如何应用它们。

数据分析师是 SQL 方面的专家,拥有实用的统计知识。他们知道如何快速将业务问题转化为分析问题,并利用 Tableau 和 Looker 等工具来构建良好的可视化效果。

其他重要技能

知道如何使用谷歌。说真的,知道谷歌什么,怎么谷歌。你将不可避免地陷入困境,当你陷入困境时,谷歌和 StackOverflow 是你的朋友。

边工作边学习。这与最后一点有些联系。很多人在工作中通过谷歌搜索或与公司的同事交谈来学习。每个公司都有不同的数据库和工具、不同的数据文化(不总是完美的)、工作流和最佳实践;因此,对于公司数据组织中的任何人来说,保持开放并能够在工作中不断学习是至关重要的。

**利益相关者管理。**所有分析工作最终都将用于推动业务决策。因此,向业务利益相关者解释分析结果和概念,并将它们与业务成果联系起来,是数据人才工作描述的重要部分。优秀的数据人才拥有足够的分析知识,同时拥有商业头脑。

那么,你怎么知道该追求什么样的角色呢?

要回答这个问题,有两个独立的因素在起作用:1 .你想干嘛?第二。根据你目前的技能和经验,你有资格担任什么角色?

你想干嘛?

本文中讨论的三个角色对业务方面有不同程度的暴露,这意味着它们需要不同级别的涉众管理。或者更抽象地说,更多的人际互动和更大规模的会议,这是我们许多内向的分析者所害怕的。但另一方面,更多的商业曝光也意味着对决策者更有形/可见的影响和曝光。

也许这个心理实验会有帮助:回想一下我们的 AB 测试例子;如果你进行彻底的统计分析来解释测试控制组中的偏差或建立模型来避免网络效应污染 AB 测试结果,你会最满意吗(数据科学家)?或者当你花数周时间编写数据管道和调试,但最终像魔术师(数据工程师)一样看到数据流入结构整齐的数据库时?或者,当你密切关注你帮助企业定义的指标时,当你听到你的朋友谈论他们非常喜欢的应用程序新功能时,你知道你的可视化有助于推动决策(数据分析师)。

你能胜任哪个角色?

或者,你有时间为哪个角色培养技能?不考虑你无法改变或弥补的因素,比如多年的经验(幸运的是,大多数与数据相关的角色对背景或学校专业没有严格的要求),职位描述和简历之间的大部分差异可以通过在线课程和面试准备来弥补(我将很快就如何为这些角色准备面试写一篇单独的帖子,敬请关注!).几周的 SQL 和基本 R/Python 在线课程以及麦肯锡式的案例研究实践将帮助你通过面试的技术筛选和商业敏锐度部分,从而为你进入数据分析师职位迈出一步。但是,如果您想为数据工程师角色配备足够的编程和 ETL 知识,或者如果您想成为更高级的数据科学家角色的统计和建模领域的专家,可能需要几个月或几年的时间。

但是好消息是,大多数公司使不同数据角色之间的转换变得非常容易;由于数据技能集的可转移性,你几乎永远也不会陷入错误的职业道路。所以…如果你真的不知道你想要什么样的角色,从任何与数据相关的角色开始,尝试一下,像一个早期的创业公司一样。

试图找出我在数据世界中的位置,就像…(GIF 来自 GIPHY )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值