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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

创建您的自定义私有 Python 包,您可以从您的 Git 存储库中 PIP 安装该包

原文:https://towardsdatascience.com/create-your-custom-python-package-that-you-can-pip-install-from-your-git-repository-f90465867893?source=collection_archive---------1-----------------------

实践教程

使用您的 git repo 共享您的自建 Python 包。

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

像蜜蜂传播花粉一样传播你的代码(图片由迪米特里·格里戈列夫Unsplash 上提供)

您已经创建了一些方便的脚本,希望您的同事或其他人使用。在许多公司,像这样的代码被复制并通过电子邮件互相发送。尽管电子邮件是一种非常容易使用的共享代码的工具,但是我们已经不是生活在 90 年代了,所以让我们以一种聪明的方式来分发你的代码。

本文分两步解决上述问题:打包和分发。首先,我们将着重于将您的代码转换成 python 包,以便人们可以轻松地安装它。然后我们将把这个包放到一个存储库中(比如在 Github 或 Bitbucket 上),这样人们就可以访问它了。在本文结束时,您将:

  • 了解 Python 包的要求
  • 能够构建 Python 包或将现有项目转换成包
  • 能够从存储库中 pip 安装自建包
  • 能够更新您的软件包

我们来编码吧!

目标和准备工作

我们在一家为餐馆进行分析的公司工作。餐馆的老板收集关于客人、饭菜和价格的数据。他们给我们发送了一个数据文件,里面有一个具体的问题,比如“什么样的客人会吃鸭肉橙子?”,“我们的南瓜汤是不是定价过高?”,以及“自从我们降低了甜点的价格后,我们看到顾客增加了吗?”

在我多年的工作中,我注意到我使用了很多相同的代码,只是从以前的任务中复制过来。我们的目标是创建一个“工具箱”包,其中包含一些非常通用的代码,我和我的同事可以很容易地用 pip 安装这些代码。然后,每当我们中的一个人想到另一个方便的功能时,我们可以添加它并更新我们的包。

为了实现这一点,我们将首先打包我们现有的代码到一个 Python 包中。然后我们将关注分发这个包,这样我的同事就可以得到它。

包装我们的代码

首先,我们将使用我们的函数并创建一个 Python 包。如果您想使用 pip 进行安装,这是必要的。您可以在 这个资源库 中查看我的所有文件夹和文件。

我们将在下面的步骤中创建一个。查看上面关于如何创建公共 Python 包的文章

1。创建一个 venv

创建一个虚拟环境并添加一个 gitignore,否则,我们将创建一个不必要的大包。

2。创建包文件夹

用您的包的名称创建一个文件夹。对我来说,这就是“工具箱”。这将是我们正在安装的软件包。我们将在包文件夹中创建一些文件:

  • toolbox/functions.py
    这个文件将保存一些我们想要共享的函数。我已经包含了三个函数:listChunkerweirdCasereport
  • 工具箱/init。py
    这将告诉 python 工具箱文件夹是一个 Python 包。这个文件也可以用来导入函数,这样我们除了from toolbox.functions import listChunker还可以import listChunker from toolbox。创建该文件是必需的,但内容是可选的

3。创建 setup.py

这个文件是告诉 pip 你的软件包需要什么来安装它所必需的。让我们来看看我用过的 setup.py。

下面我们将浏览需要更多解释的安装文件行。

  • 第 3 行:在一个名为 long_description 的变量中加载 README.md。这是可选的。
  • 第 7 行:给我们的包命名。必须与您的包文件夹名称匹配
  • 第八行。这是我们软件包的版本。Pip 使用这个版本来查看软件包是否需要更新,因此如果您希望用户能够更新,请确保增加这个版本
  • 第 12 行和第 13 行:从第 3 行加载 README.md 第 13 行指出了自述文件的格式。
  • 第 14 行:您的回购协议的 URL
  • 第 15 行:可选地列出一些方便的 URL
  • 第 18 行:用户如何使用你的套餐?检查choosealicense.com
  • 第 19 行:需要构建的所有包的列表:确保这与您的包文件夹名匹配
  • 第 20 行:您的包所依赖的包的列表。尽管我的函数都不使用请求,但出于演示的目的,我还是决定包含它。在这里包含一个包可以确保当 pip 安装工具箱包时,首先安装 requests,以便工具箱可以使用它。

4。其他可选文件

我决定包含一个 README.md 和一个许可文件。这些是简单的文本文件,并不是真正需要的,但却是一个很好的补充。

我们的仓库是完整的!大家来了解一下怎么分配吧!

通过 GitHub 发布我们的代码

现在我们的包已经创建好了,我们可以使用一个存储库来进行分发。首先,我们将创建存储库并使用它来 pip 安装我们的包。最后,我们将在修改源代码后更新我们的包。

首先,创建一个存储库。你可以在任何使用 Git (GitHub、BitBucket 等)的平台上做到这一点。然后添加你所有的文件,确保忽略不必要的文件,并推送至 repo。

Pip 安装

复制您的存储库的 URL。您可以使用以下 URL pip 安装您的软件包:

pip install git+[https://github.com/mike-huls/toolbox.git](https://github.com/Muls/toolbox.git)

就是这样!很容易不是吗?另请注意,您可以从公共(如工具箱)和私有存储库安装!

更新您的包

假设我的同事提出了一个新功能,并决定将其提交给存储库。我可以使用 pip 来更新我的软件包。每次我调用pip install git+[https://github.com/mike-huls/toolbox.git](https://github.com/Muls/toolbox.git) pip 都会检查 setup.py 文件中的版本号。如果我的同事记得增加版本,那么我的包就会更新。轻松点。

将我们的包裹放入码头集装箱

在 Docker 中使用你的包有一个非常简单的技巧:

其他优势

GitHub 提供了一个记录问题的地方,在“首页”有一个很好的自述文件,甚至在你的包需要更多解释时提供一个 wiki。

结论

正如我们在本文中看到的,结合 Python 打包和 Git 的能力提供了很多优势:

  1. 从一个中心来源(一个真实的来源)轻松分发、安装和更新
  2. 我们包的版本控制和协作能力
  3. 能够在修改后更新软件包
  4. 能够从私有存储库 pip 安装和更新软件包

我希望我已经阐明了很多创建和分发 Python 包的过程。如果你有建议/澄清,请评论,以便我可以改进这篇文章。与此同时,请查看我的其他文章关于各种与编程相关的主题,例如:

编码快乐!

—迈克

页(page 的缩写)学生:比如我正在做的事情?跟着我!

https://mikehuls.medium.com/membership

与 Jenkins 和 GitHub 一起创建您的第一个 CI/CD 渠道

原文:https://towardsdatascience.com/create-your-first-ci-cd-pipeline-with-jenkins-and-github-6aefe21c9240?source=collection_archive---------2-----------------------

创建和部署自由式 Jenkins 项目的指南

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

Unsplash 上由 Samuel Sianipar 拍照

因此,快速想象一下,您的团队每天都非常努力地工作,试图尽快推出新功能,但要将更新代码的项目带入测试和生产阶段,我们必须更新服务器,并确保在此过程中不出错。这里显而易见但费力的解决方案是手动将代码从版本控制中拉入服务器,运行测试并给它一个绿色标志,一切都好吗?可悲的是,没有!随着提交频率的增加,开发人员不得不一次又一次地进行整个服务器更新过程。

以下是手动更新服务器的方法:

  1. SSH 进入服务器。
  2. 从 VCS 拉过来。
  3. 启动应用程序之前,请检查配置。
  4. 在容器中启动应用程序。
  5. 检查日志并确保应用程序正在运行。
  6. 结束 SSH 会话。

那么,如何自动化这个过程呢?进入开发运营模式,开发运营侧重于使开发和运营周期相互兼容,它试图将两者结合在一起。 Jenkins 是一个用 Java 构建的 CI/CD 开发运营工具。

正如标题中所提到的,我们将看到 Jenkins 如何帮助我们消除这一手动流程并实现整个流程的自动化。

先决条件

在开始我们的食谱之前,让我们先弄清楚我们的配料。

本教程将使用安装在本地机器上的 Jenkins,以防您在远程计算机上使用它,用您的计算机 IP 替换 localhost

首先,需要将 Jenkins 安装在您尝试部署的计算机上,安装说明如下:https://www.jenkins.io/doc/book/installing/。其次,这个演示将使用 docker,所以如果你想在你的系统上安装 docker,请参考:https://docs.docker.com/engine/install/

如果你想学习 docker,我创建了一个 GitHub 库来解释 docker 的基础和中间概念。解释用简单的英语组织在降价文件中,每节课后都会提到一些资源。

https://github.com/pratik-choudhari/docker-guide

最后,我们需要在 GitHub 这样的 VCS 上建立一个项目存储库。

安装后步骤

一旦 Jenkins 安装完成,进入 http://localhost:8080 ,会出现一个屏幕要求你解锁 Jenkins。要设置您的用户,这是一个强制性的过程,请遵循以下指南:https://www . Jenkins . io/doc/book/installing/Linux/# setup-wizard

创建詹金斯项目

詹金斯有两种类型的项目,自由式和管道。两者的主要区别在于,管道项目遵循特定的流程,可以有多个代理和阶段来构建、测试和部署项目。自由式项目很容易设置和开始。现在让我们从项目配置开始。

登录后,您会看到这样的屏幕。这是 Jenkins 主页或仪表板,用户可以在这里看到所有创建的管道和管道摘要。

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

詹金斯仪表板

在这里,我们必须点击左上方的新项目,然后输入项目名称,点击自由式项目,点击确定

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

下一步是用 VCS 信息配置我们的项目,我将使用 GitHub 作为 VCS。勾选 GitHub 项目并输入资源库 URL。

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

向下滚动一点,我们可以看到一个源代码管理表单,要求提供登录 VCS 和要使用的分支的凭证。在全新安装的情况下,需要向 Jenkins 添加凭证,为此,请单击添加按钮,输入您的用户名和密码,然后单击添加

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

现在我们进入**构建触发器部分,**在这里我们设置触发器,它将告诉 Jenkins 何时构建一个项目。最常见和最有效的方法是使用网络挂钩。

Web 挂钩允许通过使用自定义回调在基于 web 的应用程序之间进行交互。web 挂钩的使用允许 web 应用程序自动与其他 web 应用程序通信。web-hook 被设置为在某个事件发生时触发。

来源:GeeksForGeeks

在我们的例子中,触发 webhook 的事件将是对远程存储库的推送操作。在本教程中,我们不打算使用 webhooks,而是使用 Poll SCM 选项,该选项的作用是根据预定义的时间表不断查询 VCS,以发现新的变化。如果遇到新的变化,Jenkins 将开始项目构建步骤。

这里使用的预定义时间表是**** * * * * ****,这是每分钟的时间表,Jenkins 使用类似 Crontab 的语法,在 crontab.guru 上探索格式。

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

剩下的唯一一步是编写构建命令,直接进入构建部分,在分离模式下编写 docker 构建和运行命令。

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

我们已经完成了项目设置,最后一步是点击屏幕底部的保存,并通过点击立即构建按钮开始第一次构建。

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

如果构建成功,构建号将显示一个绿色勾号图标,您的应用程序将在定义的网络的指定端口上发布,在我们的示例中,应用程序将在 localhost:3000 上运行。您可以通过单击内部版本号旁边的下拉菜单来检查构建过程的控制台输出。

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

在这个控制台输出的帮助下,用户可以调试构建过程。

结论

希望您能够跟随并成功完成您的第一个构建。我很乐意在评论中回答你的疑问。感谢阅读!保持联系,获取更多关于自动化和 python 项目的教程。

在 FastAPI 中创建您的第一个 REST API

原文:https://towardsdatascience.com/create-your-first-rest-api-in-fastapi-e728ae649a60?source=collection_archive---------7-----------------------

用 Python 创建高性能 API 的分步指南

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

尼古拉斯·霍伊泽在 Unsplash 上拍摄的照片

在这篇文章中,我将介绍 FastAPI :一个基于 Python 的框架来创建 Rest APIs。我将向您简要介绍这个框架的一些基本特性,然后我们将为联系人管理系统创建一组简单的 API。使用这个框架,Python 知识是非常必要的。

在我们讨论 FastAPI 框架之前,让我们先谈谈 REST 本身。

来自维基百科:

表述性状态转移(REST) 是一种软件架构风格,它定义了一组用于创建 Web 服务的约束。符合 REST 架构风格的 Web 服务,称为 RESTful Web 服务,提供互联网上计算机系统之间的互操作性。RESTful Web 服务允许请求系统通过使用一组统一的、预定义的无状态操作来访问和操作 Web 资源的文本表示。其他种类的 Web 服务,如 SOAP Web 服务,公开了它们自己的任意操作集。[1]

什么是 FastAPI 框架?

来自官方网站:

FastAPI 是一个现代、快速(高性能)的 web 框架,用于基于标准 Python 类型提示用 Python 3.6+构建 API。

是的,它是非常快,这是由于对 Python 3.6+异步特性的开箱即用支持,这就是为什么建议使用最新版本的 Python。

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

FastAPI 是由塞巴斯蒂安·拉米雷斯创建的,他对现有的框架如 Flask 和 DRF 并不满意。你可以在这里了解更多。他们网站上提到的一些主要功能有:

  • :非常高的性能,与 NodeJSGo 不相上下(感谢 Starlette 和 Pydantic)。目前最快的 Python 框架之一
  • 快速编码:将开发特性的速度提高 200%到 300%左右。*
  • 更少的 bug:减少约 40%的人为(开发人员)导致的错误。*
  • 直观:大编辑支持。无处不在的完成。调试时间更少。
  • 简单:设计为易于使用和学习。减少阅读文件的时间。
  • 简短:尽量减少代码重复。每个参数声明中的多个特性。更少的错误。
  • 健壮:获得生产就绪代码。自动交互式文档。
  • 基于标准:基于(并完全兼容)API 开放标准(Open API)

FastAPI 的创造者相信站在巨人的肩膀上,并使用现有的工具和框架,如 StarlettePydantic

安装和设置

我将使用 Pipenv 为我们的 API 设置开发环境。Pipenv 使隔离您的开发环境变得更加容易,不管您的机器上安装了什么。它还允许您选择不同于您机器上安装的 Python 版本。它使用Pipfile来管理所有与项目相关的依赖项。我不打算在这里详细介绍 Pipenv,所以将只使用项目所必需的命令。

运行pip install pipenv可以通过 PyPy 安装 Pipenv

pipenv install --python 3.9

安装后,您可以通过运行命令pipenv shell来激活虚拟环境

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

你也可以运行pipenv install --three,其中三表示 Python 3.x

安装后,您可以通过运行命令pipenv shell激活虚拟环境

首先,我们将通过运行以下命令安装FastAPI:pipenv install fastapi

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

注意是 pipenv ,不是 pip。当您进入 shell 时,您将使用pipenv。底层使用 pip,但所有条目都存储在Pipfile中。下面的Pipfile会是什么样子:

好了,我们已经建立了我们的开发环境。是时候开始编写我们的第一个 API 端点了。我将创建一个名为main.py的文件。这将是我们 app 的切入点。

from fastapi import FastAPIapp = FastAPI()[@app](http://twitter.com/app).get("/")
def home():
    return {"Hello": "FastAPI"}

如果你在 Flask 上工作过,你会发现它非常相似。导入所需的库后,您创建了一个app实例,并用装饰器创建了您的第一条路线。

现在你想知道如何运行它。FastAPI 附带了一个 ASGI 服务器。您只需运行命令uvicorn main:app --reload

您提供的文件名( )。py)和类对象( app 在这种情况下),它将启动服务器。我使用了--reload标志,这样每次修改后它都会自动重新加载。

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

访问http://localhost:8000/,您将看到 JSON 格式的消息{"Hello":"FastAPI"}

很酷,不是吗?

FastAPI 也提供了一个 API 文档引擎。如果你访问的是使用 Swagger UI 界面的http://localhost:8000/docs

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

或者,如果你需要一些奇特的东西,请访问[http://localhost:8080/redoc](http://localhost:8080/redoc)

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

FastAPI 还提供了 API 端点的 OpenAPI 版本,比如这个[http://127.0.0.1:8000/openapi.json](http://127.0.0.1:8000/openapi.json)

路径和参数

让我们继续前进。我们添加了另一个 API 端点。比方说,它是关于通过 id 获取联系信息的。

[@app](http://twitter.com/app).get("/contact/{contact_id}")
def contact_details(contact_id: int):
    return {'contact_id': contact_id}

这里有一个方法,contact_details,它只接受一个int参数,并以dict格式返回它。现在,当我通过 cURL 访问它时,它看起来如下:

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

现在,如果我传递一个字符串而不是一个整数呢?你会看到下面的

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

你看到了吗?它返回一条错误消息,指出您发送了错误的数据类型。您不需要为这些琐碎的事情编写验证器。这就是在法斯塔皮工作的美妙之处。

查询字符串

如果以查询字符串的形式传递额外的数据会怎样?例如,您的 API 端点返回大量记录,因此您需要分页。嗯,没问题,你也可以获取这些信息。

首先,我们将导入Optional类型:

from typing import Optional

[@app](http://twitter.com/app).get("/contact/{contact_id}")
def contact_details(contact_id: int, page: Optional[int] = 1):
    if page:
        return {'contact_id': contact_id, 'page': page}
    return {'contact_id': contact_id}

在这里,我传递了另一个参数page,并在这里设置了它的类型Optional[int]。可选的,顾名思义它是一个可选的参数。设置类型int是为了确保它只接受整数值,否则就会像上面那样抛出一个错误。

访问网址http://127.0.0.1:8000/contact/1?page=5,你会看到如下内容:

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

很酷,不是吗?

到目前为止,我们只是手动返回了dict。一点也不酷。输入一个值并返回一个 YUUGE JSON 结构是很常见的。FastAPI 提供了一种优雅的方式来处理它,使用 Pydantic 模型

Pydantic 模型实际上有助于数据验证,这意味着什么?这意味着它确保被传递的数据是有效的,否则它返回一个错误。我们已经在使用 Python 的类型提示,这些数据模型使得净化的数据被传递。让我们写一点代码。为此,我将再次扩展 contact API。

from typing import Optionalfrom fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()class Contact(BaseModel):
    contact_id:int
    first_name:str
    last_name:str
    user_name:str
    password:str[@app](http://twitter.com/app).post('/contact')
async def create_contact(contact: Contact):
    return contact

我从 pydantic 导入了BaseModel类。之后,我创建了一个扩展了BaseModel类的模型类,并在其中设置了 3 个字段。请注意,我还设置了它的类型。完成后,我创建了一个POST API 端点,并向其传递了一个Contact参数。我在这里也使用了async,它将简单的 python 函数转换成一个协程。FastAPI 支持开箱即用。

转到http://localhost:8080/docs,您将看到如下内容:

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

当您运行 CURL 命令时,您会看到如下所示的内容:

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

正如所料,它只是以 JSON 格式返回了Contact对象。

正如您注意到的,它只是以 JSON 格式转储整个模型,包括密码。即使您的密码不是纯文本格式,它也没有意义。那怎么办呢?响应模型就是答案。

什么是响应模型

顾名思义,响应模型是针对请求发送响应时使用的模型。基本上,当你使用一个模型时,它会返回所有的字段。通过使用响应模型,您可以控制应该向用户返回哪种数据。让我们稍微改变一下代码。

class Contact(BaseModel):
    contact_id:int
    first_name:str
    last_name:str
    user_name:str
    password:strclass ContactOut(BaseModel):
    contact_id:int
    first_name:str
    last_name:str
    user_name:str[@app](http://twitter.com/app).get("/")
def home():
    return {"Hello": "FastAPI"}[@app](http://twitter.com/app).post('/contact', response_model=ContactOut)
async def create_contact(contact: Contact):
    return contact

我添加了另一个类,ContactOut,它几乎是Contact类的副本。这里唯一不同的是没有了password字段。为了使用它,我们将在 post 装饰器的response_model参数中分配它。就是这样。现在,当我运行点击相同的网址,它不会返回密码字段。

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

如您所见,这里没有可见的密码字段。如果你注意到了/docs的网址,你也会在那里看到它。

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

如果您愿意在多个方法中使用不同的响应模型,那么使用不同的响应模型是可行的,但是如果您只想从一个方法中省略机密信息,那么您也可以在装饰器中使用response_model_exclude参数。

[@app](http://twitter.com/app).post('/contact', response_model=Contact, response_model_exclude={"password"})
async def create_contact(contact: Contact):
    return contact

输出将是相似的。您在这里设置response_modelresponse_model_exclude。结果是一样的。您还可以将元数据附加到 API 端点。

[@app](http://twitter.com/app).post('/contact', response_model=Contact, response_model_exclude={"password"},description="Create a single contact")
async def create_contact(contact: Contact):
    return contact

我们添加了此端点的描述,您可以在文档中看到。

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

FastAPI 文档的精彩并没有到此结束,它还让您设置模型的示例 JSON 结构。

class Contact(BaseModel):
    contact_id:int
    first_name:str
    last_name:str
    user_name:str
    password:strclass Config:
        schema_extra = {
            "example": {
                "contact_id": 1,
                "first_name": "Jhon",
                "last_name": "Doe",
                "user_name": "jhon_123",
            }
        }

当你这样做的时候,它会呈现为:

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

FastAPI 中的错误处理

你总是有可能得不到所需的信息。FastAPI 提供了HTTPException类来处理这样的情况。

[@app](http://twitter.com/app).get("/contact/{id}", response_model=Contact, response_model_exclude={"password"},description="Fetch a single contact")
async def contact_details(id: int):
    if id < 1:
        raise HTTPException(status_code=404, detail="The required contact details not found")
    contact = Contact(contact_id=id, first_name='Adnan', last_name='Siddiqi', user_name='adnan1', password='adn34')
    return contact

简单的端点。它根据 id 返回联系信息。如果id小于 1,则返回一条 404 错误消息,并提供详细信息。

在我离开之前,让我告诉你如何发送自定义标题。

from fastapi import FastAPI, HTTPException, Response[@app](http://twitter.com/app).get("/contact/{id}", response_model=Contact, response_model_exclude={"password"},
         description="Fetch a single contact")
async def contact_details(id: int, response: Response):
    response.headers["X-LOL"] = "1"
    if id < 1:
        raise HTTPException(status_code=404, detail="The required contact details not found")
    contact = Contact(contact_id=id, first_name='Adnan', last_name='Siddiqi', user_name='adnan1', password='adn34')
    return contact

在导入了Response类之后,我传递了Request类型的request参数,并设置了头文件X-LOL

运行 curl 命令后,您会看到类似下面的内容:

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

你可以在标题中找到x-lol。LOL!

结论

因此,在这篇文章中,您了解了如何开始使用 FastAPI 构建高性能 API。我们已经有了一个名为 Flask 的最小框架,但 FastAPI 的异步支持使它对现代生产系统非常有吸引力,尤其是通过 REST APIs 访问的机器学习模型。我只是触及了它的表面。可以在官方 FastAPI 网站进一步了解。

希望在下一篇文章中,我会讨论一些高级的话题,比如与数据库集成、认证和其他事情。

原载于 2021 年 1 月 23 日http://blog . adnansiddiqi . me

立即创建您的第一个 Tableau 仪表板

原文:https://towardsdatascience.com/create-your-first-tableau-dashboard-in-no-time-203700cc7e0c?source=collection_archive---------35-----------------------

Tableau 的实用介绍

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

(图片由作者提供)

数据可视化是数据科学不可或缺的一部分。设计良好的可视化是数据探索的一个好方法。与简单的数字相比,通过数据可视化来传递你的发现也更加直观和高效。

Tableau 是创建数据可视化的强大而高效的工具。它允许创建高度信息化的情节,而无需编写任何代码。此外,多个可视化可以很容易地结合到一个仪表板。

Tableau 还提供 Tableau Public,这是一个免费的平台,可以公开分享你的仪表盘。这是展示你的技能和创造力的好方法。

下载 Tableau 桌面的公版即可免费使用 Tableau,该公版适用于 Windows 和 Mac。在本文中,我们将使用 public edition 创建一个简单的仪表板。我们将使用来自 Kaggle 的包含医疗保险数据的数据集

第一步是添加到数据源的连接。这里强调“连接”这个词很重要,因为 Tableau 连接到数据文件并使用它来创建可视化。它不编辑原始文件。

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

(图片由作者提供)

我们选择适当的格式,然后导航到保存数据集的文件。

Tableau 连接到文件后,它会提供数据源的概述,并自动创建一个工作表。

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

数据源(图片由作者提供)

工作表用于在 Tableau 中创建可视化效果,因此我们从左下角选择工作表。默认情况下,它被称为“工作表 1”,但我们可以将其重命名。

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

(图片由作者提供)

列名显示在左窗格中。我们可以将列拖放到工作表中。我们将创建一个具有三种数据可视化的仪表板。

第一个是包含保险成本的 charges 列的直方图。我们将 charges 列拖到 rows 部分,并选择右侧窗格中的直方图符号。让我们也根据吸烟者列来区分行,以便我们可以看到吸烟对费用的影响。这是通过在 rows 部分添加 smoker 列来实现的。

下面的屏幕记录显示了我们刚刚提到的步骤。

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

直方图(作者提供的 gif)

就是这样!在 Tableau 中创建直方图就是这么简单。您可能已经注意到了列名旁边的缩写,如 bin 和 CNT。它们表示应用于数据的聚合。我们可以从列名的下拉菜单中更改或自定义聚合。

我们清楚地看到,总体而言,吸烟者的医疗保险费用更高。

最好给工作表一个描述性的名称,这可以通过右键单击工作表的名称来完成。在我们的例子中,我将其重命名为“电荷分布”。

第二个可视化是散点图。我们通过单击左下方工作表名称旁边的图标来创建一个新工作表。

下面是我们如何在 Tableau 中创建散点图:

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

散点图(作者 gif)

我们将“费用”列拖到“行”部分。在这种情况下,我们不需要任何聚合,所以我们选择它作为一个维度。我们对 bmi 列进行了同样的操作,但是是在列部分。然后 Tableau 自动生成散点图。

我们可以通过在标记窗格下的颜色部分添加吸烟者列,使用不同的颜色来区分吸烟者和非吸烟者。代表数据点的圆圈的大小也可以在这里调整。

第二次可视化完成。我会将其重命名为“Bmi 与费用”,然后为下一个图创建一个新的工作表。

第三个可视化图形是一个显示不同地区 bmi 柱分布的箱线图。

我们将 bmi 列放在 rows 部分,将 region 列放在 columns 部分。然后我们将 bmi 列更改为一个维度。

正如我们可以在屏幕记录中看到的,当列被放入部分中时,绘图选项会在右窗格中突出显示。

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

方框图(作者 gif)

我将把方框图重新命名为“Bmi 与区域”。它概述了不同地区之间 bmi 值分布的差异。东南部地区的 bmi 值普遍较高。

我们已经使用医疗保险费用数据集创建了三个可视化。下一步是将它们合并到一个仪表板中。我们通过单击工作表旁边左下方的新仪表板图标来创建一个空仪表板。

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

仪表板(作者图片)

包含可视化效果的工作表显示在左侧。我们现在可以使用工作表自定义控制面板。

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

填充仪表板(gif by author)

我们可以进行许多定制,以使仪表板更具信息性、功能性和吸引力。例如,我们可以添加一个标题,并将一个特定的可视化设置为过滤器。我们也可以调整大小。

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

自定义仪表板(gif by author)

我们的仪表板现在已经完成。我们可以将其保存到我们的 Tableau 公共个人资料中,并与其他人分享。这是我的 Tableau 公共配置文件中仪表板的最终版本。

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

(图片由作者提供)

结论

我们创建了一个简单的仪表板。Tableau 是一个高度通用和实用的工具,因此它可以用来创建更高级的仪表板。然而,最好先理解基础知识。

成为高级 Tableau 用户需要大量的练习。如果您正在或计划在数据科学领域工作,这是一个非常重要的工具。

感谢您的阅读。如果您有任何反馈,请告诉我。

用自然语言处理在 10 分钟内创造你自己的人造莎士比亚

原文:https://towardsdatascience.com/create-your-own-artificial-shakespeare-in-10-minutes-with-natural-language-processing-1fde5edc8f28?source=collection_archive---------7-----------------------

第一部分 | 第二部分 | 第三部分 |自然语言处理

使用递归神经网络和莎士比亚语料库生成莎士比亚风格的文学作品

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

图一。由杰西卡·潘普Unsplash 上拍摄的照片

I

研究表明,用于自然语言处理任务的最有效的人工神经网络类型之一是递归神经网络(RNNs)。rnn 广泛应用于自然语言处理任务,如机器翻译、文本生成、图像字幕等。在 NLP 任务中,我们通常使用 NLP 工具和方法将文本数据处理成向量,然后将它们馈送到选定的人工神经网络,如 RNN、CNN,甚至前馈神经网络,以完成任务。在本帖中,我们将遵循这两个标准化的步骤:(1)将文本处理成向量,(2)用这些向量训练神经网络。

递归神经网络和序列文本数据

在深入我们的教程之前,我们需要讨论一下递归神经网络和顺序数据,因为文本数据具有顺序性。

递归神经网络(RNN)是一类人工神经网络,其中神经元之间的连接形成时间序列。

能够捕获动态时间信息(时间记忆)的 rnn。递归神经网络源自前馈神经网络,但是它们提供了更多。

为什么不是前馈神经网络?

普通前馈神经网络有三个主要限制,使它们不适合序列数据:

  • 前馈神经网络不能考虑阶数;
  • 前馈神经网络需要固定的输入大小;
  • 前馈神经网络不能输出不同长度的预测。

文本数据的基本特征之一是其顺序的重要性。就像重新排列月销售额的顺序可以将我们从上升趋势引向下降趋势一样,重新排列句子中单词的顺序可以完全改变或扭曲它的意思。这就是前馈神经网络的局限性所在。在前馈神经网络中,由于这种限制,不能考虑数据的顺序。重新安排月销售额的顺序会得到同样的结果,这证明他们不能利用投入的顺序。

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

图二。深度学习中的潜在序列数据任务(图由作者提供)

递归神经网络拯救世界

RNN 通过将以前的信息保存在内存中来使用它们,这些信息以“状态”的形式保存在 RNN 神经元中。有几种类型的 RNN,如香草 RNN,GRU 和 LSTM。

下面用一个基本的天气预报例子来说一下记忆结构。我们想通过使用序列中提供的信息来猜测是否会下雨。该数据序列可以从文本、语音或视频中获得。每有新的信息,我们就慢慢更新降雨的概率,最后得出结论。图 3 显示了这项任务:

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

图 3。一个简单的天气预报任务:会下雨吗?(图由作者提供)

在图 3 中,我们首先记录了多云天气。这一单一信息可能指示降雨,这计算成 50%(或 0.5)的降雨概率。然后,我们收到以下输入:一条拥挤的街道。拥挤的街道意味着人们在外面,这意味着降雨的可能性更小,因此,我们的估计下降到 30%(或 0.3)。然后,我们被提供了更多的信息:膝盖疼痛。人们认为风湿病患者在下雨前会感到膝盖疼痛。因此,我的估计上升到 70%(或 0.7)。最后,当我们的模型将闪电作为最新信息时,集体估计增加到 90%(或 0.9)。在每个时间间隔,我们的神经元使用它的记忆——包含以前的信息,并在这个记忆的基础上添加新的信息,来计算降雨的可能性。可以在层级别以及单元级别设置存储器结构。图 4 示出了细胞水平的 RNN 机制,(I)左边是折叠版本,右边是展开版本。

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

图 4。一种基于细胞的递归神经网络活动(图片由作者提供)

RNN 类型

如前所述,RNNs 有许多不同的变体。在本节中,我们将介绍我们经常遇到的三种 RNN:

  • 简单的 RNN
  • 长短期记忆(LSTM)网络
  • 门控循环单元(GRU)网络

您可以在图 5 中找到这些备选 RNN 单元的可视化效果:

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

图 5。递归神经网络的 3 种流行变体:香草 RNN、GRU、LSTM

**门控循环单元(gru)——**门控循环单元由 Kyunghyun Cho 于 2014 年推出。正如 LSTMs 一样,gru 也是 RNNs 中处理序列数据的门控机制。然而,为了简化计算过程,GRUs 使用两个门:(I)复位门和(ii)更新门。gru 也为隐藏状态和单元状态使用相同的值。图 5 显示了门控循环单元的内部结构:

基于莎士比亚语料库的神经文本生成

在这个案例研究中,我们的目标是训练一个能够从字符中生成有意义文本的 RNN。RNN 可以从单词和字符中生成文本,我们选择使用字符来生成这个案例研究的文本。

当我们建立一个没有经过训练的新 RNN 时,它组合了一堆毫无意义的字符,这没有任何意义。然而,如果我们给我们的 RNN 输入大量文本数据,它就会开始模仿这些文本的风格,并使用字符生成有意义的文本。

所以,如果我们给模型输入大量说教性的文本,我们的模型就会生成教育材料。如果我们给我们的模型输入大量的诗歌,我们的模型将生成诗歌,所以我们将有一个人工诗人。这些都是可行的选择,但是我们将为我们的模型提供一些其他的东西:一个包含莎士比亚作品的长文本数据集。因此,我们将创建一个莎士比亚机器人。

莎士比亚文集

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

图 6。维基媒体上的一本莎士比亚的书

莎士比亚语料库(Shakespeare Corpus)是一个包含 40000 行莎士比亚作品的文本文件,由 Karpathy 清理和准备,由 TensorFlow 团队托管。我强烈建议您看一下.txt文件,以理解我们正在处理的文本。该文件包含对话内容,其中每个角色的名字放在相应部分的前面,如图 7 所示。

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

图 7。莎士比亚语料库中的随机样本文本(图由作者提供)

初始进口

在本案例研究中,所需的库是 TensorFlow、NumPy 和 os,我们可以使用以下代码导入它们:

要从在线目录加载数据集,我们可以使用 TensorFlow 中 Keras API 的 util 模块。对于这个任务,我们将使用get_file()函数,如果文件不在缓存中,它将从 URL 下载文件,代码如下:

下载完我们的文件后,我们可以用下面的 Python 代码从缓存中读取文件。现在,我们成功地将整个语料库作为变量保存在了 Colab 笔记本的内存中。让我们看看语料库中有多少个字符,前 100 个字符是什么,代码如下:

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

图 8。语料库的前 100 个字符(由作者提供)

我们的整个语料库可以通过一个名为*text*的 Python 变量来访问,现在我们可以开始对它进行矢量化了。

向量化文本

文本矢量化是一种基本的 NLP 方法,用于将文本数据转换为机器可以理解的有意义的数字向量。文本矢量化有多种方法。在本案例研究中,我们是这样一步步进行的:

  • 给每个独特的字符一个索引号;
  • 在语料库中运行一个 for 循环,并索引整篇文本中的每个字符。

为了给每个独特的字符一个索引号,我们首先要找到文本文件中所有独特的字符。使用内置的set()函数很容易做到这一点,该函数将 list 对象转换为 set 对象。

T *he difference between set and list data structures is that lists are ordered and allow duplicates while sets are unordered and don’t allow duplicate elements. So, when we run the set() function -as shown in the below code-, it returns a set of unique characters in the text file.*

输出:

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

图 9。唯一字符列表的一部分(图由作者提供)

我们还需要给每个字符一个索引号。下面的代码为每个集合项分配一个数字,然后用给定的数字创建一个集合项字典。我们还制作了 NumPy 数组格式的唯一集合元素的副本,供以后解码预测时使用。然后,我们可以使用一个简单的 for 循环对文本进行矢量化,遍历文本中的每个字符,分配它们对应的索引值,并将所有索引值保存为一个新列表,代码如下:

创建数据集

此时,我们用char2idx字典对文本进行矢量化,用idx2char对矢量化后的文本进行去矢量化(即解码)。最后,我们将text_as_int作为矢量化的 NumPy 数组。我们现在可以创建数据集了。

首先,我们将使用 Dataset 模块中的from_tensor_slices方法从我们的text_as_int对象中创建一个 TensorFlow Dataset 对象,我们将把它们分成几批。数据集的每个输入的长度限制为 100 个字符。我们可以用下面的代码实现所有这些:

我们的序列对象包含字符序列,但是我们必须创建一个这些序列的元组,以馈入 RNN 模型。我们可以通过下面的自定义映射函数来实现这一点:

我们生成这些元组的原因是为了让 RNN 工作,我们需要创建一个管道,如图 10 所示:

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

图 10。一个具有 4 维输入和输出层的 RNN 的例子。注意输入和输出字符之间的延迟。

最后,我们将数据集打乱,分成 64 个句子批次,每行如下:

构建模型

我们的数据已经准备好输入模型管道。让我们创建我们的模型。我们希望训练我们的模型,然后做出新的预测。首先,让我们用下面的代码设置一些参数:

现在,重要的是,我们的训练管道将在每一批输入 64 个句子。因此,我们需要构建我们的模型来一次接受 64 个输入句子。然而,在我们训练了我们的模型之后,我们想要输入单句来生成新的任务。所以,我们需要不同的训练前和训练后模型的批量大小。为了实现这一点,我们需要创建一个函数,它允许我们为不同的批量大小重现模型。下面的代码可以做到这一点:

我们的模型有三层:

  • **一个嵌入层:这一层作为输入层,接受输入值(数字格式中的)并转换成矢量。
  • **GRU 层:**填充了 1024 个梯度下降单元的 RNN 层
  • **密集层:**输出结果,用vocab_size输出。

现在,我们可以使用以下代码创建我们的培训模型:

图 11 总结了我们的模型:

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

图 11。培训模型的概要视图(由作者提供的图)。请注意输出形状中的 64,对于训练后的单个预测,它必须为 1

编译和培训

为了编译我们的模型,我们需要配置我们的优化器和损失函数。对于这个任务,我们选择Adam作为我们的优化器,稀疏分类交叉熵函数作为我们的损失函数。

由于我们的输出总是 65 个字符中的一个,这是一个多类分类问题。因此,我们必须选择一个分类交叉熵函数。然而,在这个例子中,我们选择了分类交叉熵的一个变体:稀疏分类交叉熵。我们使用稀疏分类交叉熵,因为即使它们使用相同的损失函数,它们的输出格式也是不同的。请记住,我们将文本矢量化为整数(,【2】,【1】,),而不是一键编码格式(,例如【0,0,0】,【0,1】,【1,0,0】,)。为了能够输出整数,我们必须使用稀疏分类交叉熵函数。

为了能够设置自定义损失函数,我们创建了一个包含稀疏分类交叉熵损失的基本函数:

现在,我们可以使用以下代码设置损失函数和优化器:

为了能够加载我们的重量并保存我们的训练成绩,我们需要使用以下代码设置和配置一个检查点目录:

我们的模型和检查点目录已经配置好了。我们将为我们的模型训练 30 个时期,并将训练历史保存到名为 history 的变量中,代码如下:

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

图 12。模特训练的最后八个时期(图由作者提供)

由于模型的简单性以及我们对模型的编码方式,我们的培训并不需要太长时间(大约 3-4 分钟)。现在,我们可以使用保存的权重,构建一个接受单个输入来生成文本的定制模型。

生成新文本

为了能够查看我们最新检查点的位置,我们需要运行以下代码:

现在,我们可以使用我们之前创建的自定义函数,使用保存在 latest_checkpoint 中的权重,用batch_size=1load_weights构建一个新模型,使用 build 函数基于接收到的输入形状构建模型(即【1,无】)。我们可以用下面的代码实现所有这些和summarize()的新模型:

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

图 13。新创建的模型的概要视图(图由作者提供)。现在它接受单一输入。

我们的模型已经准备好进行预测,我们所需要的只是一个定制函数来为模型准备输入。我们必须设置以下内容:

  • 要生成的字符数,
  • 向量化输入(从字符串到数字),
  • 存储结果的空变量,
  • 手动调整预测可变性的温度值,
  • 对输出进行去因子化,并且还将输出再次馈送到模型用于下一次预测,
  • 将所有生成的字符连接成一个最终字符串。

下面的自定义函数执行所有这些操作:

它返回我们的最终预测值,我们可以很容易地生成一个文本,我们可以使用下面的代码用内置的打印函数打印出来:

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

图 14。由我们的模型生成的 500 个字符长的文本(图由作者提供)

最后的话

使用门控循环单元和莎士比亚语料库,您为自己构建了一个能够生成任意长度文本的莎士比亚机器人。

*Note that our model uses characters, so the miracle of the model is that it learned to create meaningful words from characters. So, do not think that it adds a bunch of unrelated words together. It goes over thousands of words and learns the relationship between different characters and how they are used to create meaningful words. Then it replicates this and returns us sentences with meaningful words.*

您可以随意使用 temperature,看看如何将输出从更合适的单词变成更失真的单词。较高的温度值会增加我们的功能选择不太可能的字符的机会。当我们把它们都加起来时,我们得到的结果就没那么有意义了。另一方面,低温会导致函数生成更简单的文本,更像是原始语料库的副本。

让我们保持联系

除了我的最新内容,我还与我的订户分享我的 Google Colab 笔记本 ,其中包含我发表的每篇文章的完整代码。如果你喜欢这篇文章,考虑订阅时事通讯: 订阅时事通讯!✉️

既然您正在阅读这篇文章,我相信我们有着相似的兴趣,并且现在/将来会从事相似的行业。那么我们就通过Linkedin来连线吧!请不要犹豫发送联系请求!Orhan g . yaln—Linkedin

创建自己的 Python 包,并将其发布到 PyPI 中

原文:https://towardsdatascience.com/create-your-own-python-package-and-publish-it-into-pypi-9306a29bc116?source=collection_archive---------3-----------------------

在本文中,您将找到将代码转换成 Python 包并将其上传到 Python 包索引站点的简单步骤

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

Pixabay 授权

您愿意与全球 Python 开发者社区分享您的代码吗?

开始吧!

我假设正在阅读本文的大多数人已经运行了下面的命令。但是,幕后发生了什么?

pip install pandas

在你运行命令 pip install 的时候,你正在访问 PyPI 站点来下载一个包。网站https://pypi.org/是 Python 编程语言的软件仓库。

步骤 0:准备要共享的代码

作为一个例子,我将使用几个程序转换成一个 Python 包。这个代码是一个简单的游戏,能够“猜测”玩家心中的数字。你可以在我的 GitHub 库中看到代码。

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

文件夹内容。作者图片

步骤 1:创建 init。py 文件

创建一个名为 init 的文件。py 并将其保存到您的代码所在的文件夹中。这个文件告诉 Python 这个文件夹包含一个 Python 包。 init 里面的代码。每当您在 Python 程序中导入一个包时,就会运行 py 文件。在这种情况下,我的 init。py 文件正在从 numberGuesserGame 模块导入 GuessMyNumber 类。

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

init。py 文件内容。作者图片

现在,我的文件夹里有三个文件:

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

文件夹内容。作者图片

步骤 2:创建 setup.py 文件

在目录中向上一级,创建 setup.py 文件。

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

文件夹内容。作者图片

这个重要的文件包含关于包的信息。每次运行命令 pip ,它都会自动寻找 setup.py 文件。

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

setup.py 文件内容。作者图片

它主要包括对 setup 函数的调用,该函数接收参数以指定项目如何定义的细节,例如,名称、作者、版本、描述等。

步骤 3:在本地安装您的软件包

完成步骤 1 和 2 后,就可以在本地安装 Python 包了。首先,打开一个终端,转到包含您的软件包的文件夹,键入下面的命令。圆点表示在当前文件夹中查找 setup.py 文件,并在其中安装软件包。

pip install .

现在,您可以留在该文件夹中或移动到另一个文件夹来运行 Python 并使用您的包。让我们看看这个例子:

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

运行我的包。作者图片

步骤 4:创建许可证和自述文件

回到包含您的包的目录,再创建两个文件:

  • License.txt 将告诉用户使用你的软件包的条款和条件。我将麻省理工学院的许可证复制并粘贴到我的文件中
  • README.md 会简单的告诉用户你的包是关于什么的

你的文件夹应该看起来像下面的图片,你的包,和 4 个附加文件:

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

文件夹内容。作者图片

第五步。生成您的源代码发行版

一旦你有了所有需要的文件,使用下面的命令安装最新版本的 setuptools 包(我们在 setup.py 文件中使用)。

python -m pip install --user --upgrade setuptools

确保您位于 setup.py 所在的目录中,并运行以下命令:

python setup.py sdist

你会看到有一个新的文件夹 dist 包含了 tar.gz 文件,它提供了元数据和 pip 安装所需的基本源文件。

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

文件夹内容。作者图片

您还会看到一个 ProjectName.egg-info 文件夹,它包含需要移动到目标系统上特定位置的文件和元数据。别担心,你可以忽略它,删除它或在这里了解更多信息。

第六步。为测试 PyPI 和 PyPI 存储库创建帐户。

PyPI 测试PyPI 网站创建你的账户,记住你的密码很重要,这些密码很快会被重新输入命令行。

第七步。将您的包上传到测试 PyPI 存储库

下一步是安装 twine ,这个实用程序将帮助你把你的包上传到 PyPI 仓库或者其他仓库。一旦安装好绳线,就不需要重复这个步骤。

pip install twine

打开一个终端,在你的命令行中输入下面的命令,它会要求你提供你之前在步骤 6 中创建的用户名和密码。

twine upload --repository-url https://test.pypi.org/legacy/ dist/*

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

上传包裹。作者图片

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

文件夹内容。作者图片

登录到 Test PyPI 存储库并验证您的包在那里。如果是这样,复制软件包名称下的命令,在命令行中运行它,并在屏幕上阅读说明软件包已成功安装的消息。

pip install -i https://test.pypi.org/simple/ guesser-game

第八步。将您的包上传到 PyPI 存储库

最后,这是您必须运行的最后一个命令,以便与全球 Python 开发人员社区共享您的包。确保你在 setup.py 文件所在的同一个目录下。

twine upload dist/*

现在,这个包在 PyPI 仓库中!

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

文件夹内容。作者图片

结论:

知道如何上传你的 Python 包很重要,但在我看来,愿意分享你的知识、与社区合作、创造学习文化和寻找不同的做事方法同样重要,甚至更重要。

更多参考资料,可以回顾一下packaging.python.org

用 R 中的 Pagedown 包创建你的简历

原文:https://towardsdatascience.com/create-your-resume-with-pagedown-package-in-r-123ca6310d52?source=collection_archive---------10-----------------------

使用 pagedown 包在 1 小时内制作令人印象深刻的简历

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

马库斯·温克勒在 Unsplash 上拍摄的照片

过去,我一直梦想用 LaTeX 制作我的简历,但要达到这种完美的学习曲线似乎从未实现。因此,我总是以使用 word 文档制作简历告终,并默默忍受随之而来的对齐问题。

最近,我正在经历更新简历的相同周期,并在对齐上花了很多时间。然后我想,让我们看看是否有一个永久的解决方案,偶然间,我想到了 Nick Strayer 的这个可爱的博客,它提供了一个非常简单的解决方案,通过将简历分成不同的 CSV 文件来自动构建简历。并进一步添加了一个选项来选择要在简历上显示的子部分。这种风格可以灵活地为不同的工作类型创建有针对性的简历。来自pagedown包的内置简历模板负责简历的格式。所以,在某种程度上,这是一个我一直在寻找的无忧无虑的解决方案。

受博客的启发,我创建了这个详细的教程来制作简历,添加我觉得博客中没有充分涵盖的细节(像我这样没有或很少了解 CSS 的人)。

使用 R pagedown包简历模板增强您的数据组合。

我们将把简历构建分为以下 4 个部分:

  1. 简历要点
  2. 模板定制
  3. 打印到 Pdf
  4. 数据自动化

最终目标是让定制的模板启动并运行,如图所示。

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

简历模板(图片由作者提供)

如果你还没有安装pagedown包,首先你要在 RStudio 中制作你的简历。该软件包带有一个内置的简历模板。在安装完pagedown包之后,首先创建一个新的R Markdown文档。

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

创建一个新的 R Markdown 文档(图片由作者提供)

弹出一个新窗口,选择【模板中的选项,然后pagedown打包 HTML 恢复模板,点击确定*。*

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

按 pagedown 选择 HTML 简历模板(按作者选择图片)

这将在 RStudio 上打开简历的默认版本。编织文档,它可能会要求你先保存文档,之后,它会编译简历,一个新的窗口会弹出简历。默认的简历会是这样的。

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

默认简历(图片由作者提供)

简历要点

简历分为两个面板:主面板和侧面板。在上面的图片中总共标出了 8 个区域,这些区域将在下面解释,这将有助于你建立你的简历。

所以我们暂时先不讨论 YAML 的头球部分,稍后再来讨论。在 YAML 标题块的后面是上图中被标记为侧栏的标题和被标记为主面板的 标题。第 1-5 点来自简历主面板,第 6-8 点来自侧边栏。让我们逐点而行(参考上图):

点 1 :你的名字或主标题的占位符。

第二点 :这是你简历的副标题(突出你希望招聘人员或招聘经理注意到的重要细节)。

第三点 :总结部分。你们很清楚该填什么。

第 1 点至第 3 点将在下面重点介绍。

*Main
================================================================================Lijia Yu {#title}                        ***[POINT 1: heading]***
--------------------------------------------------------------------------------### Currently searching for a PhD student position             ***[POINT 2: sub-heading]***TEXT SUMMARY                              ***[POINT 3: summary]****

如果您不太熟悉章节标题的标记语法,标题下的一系列=相当于标题前的#,一系列—相当于##。(文本来自 Pagedown 手册)

这一部分可以重复写:工作经历,研究经历,证书,教育等。,模式也是一样的。所以这一段文字可以重复复制。

简历模板中使用的图标均来自 字体牛逼网站。

第 5 点 :一旦你定义了一个部分,它可以进一步分解成许多子部分。该子部分有 5 个要填写的字段,其中前 4 个是必填字段。第一个是小节的标题,第二个是小节的副标题,第三个是位置,第四个是时间段。时间段可以是一年,如 2021 年,也可以是一个范围,如 2020 年 2 月至 2021 年 3 月或 2020 年至 2021 年。第五个字段不是强制性的,用于支持文本,可以留空。第 4 点和第 5 点解释如下:

****Education {data-icon=graduation-cap}   ***[POINT 4: section heading]***
--------------------------------------------------------------------------------### Beijing University of Chemical Technology  ***[POINT 5: subsection                    heading]***B.S. in Information and Computing Sciences    ***[POINT 5: subtitle]*** Beijing, China                                ***[POINT 5: location]***2010                                          ***[POINT 5: time period]*** Thesis: Dyadic wavelet and its application in edge detection
                                          ***[POINT 5: supporting text]*******

在 4 个必填字段中,只有副标题、位置和时间段字段可以通过填写 N/A 来跳过。

第五个字段是向您的子部分添加细节。默认情况下,文本将作为单列发布,但可以使用如下所示的:::concise块将显示更改为 2 列。

****:::concise
- sentence 1
- sentence 2
- sentence 3
- sentence 4
:::****

现在让我们继续讨论第 6-8 点。

第 6 点 :默认情况下,模板中会插入一个 logo,只要在文本中添加正确的路径,任何图片都可以更改这个 logo。

****Aside
================================================================================![Lijia Yu]([https://avatars1.githubusercontent.com/u/895125?s=400&v=4){width=80%](https://avatars1.githubusercontent.com/u/895125?s=400&v=4){width=80%)}****

第 7 点 :联系信息部分是您可以突出显示您的社交媒体页面或博客以及个人联系信息的地方。再次图标来自字体真棒网页。联系人信息中的信息可以通过以下方式添加:

****- <i class="fa fa-github"></i> [github.com/yulijia]([https://github.com/yulijia](https://github.com/yulijia))****

第 8 点 :技能部分是你可以记下所有技能的地方。如果您想列出技能,可以通过以下方式完成:

****Skills {#skills}
--------------------------------------------------------------------------------
- skill 1
- skill 2
- skill 3****

到目前为止,我们已经介绍了制作简历的基本要素。编辑好的简历会让你知道它会是什么样子。如果你对当前版本满意,那么你可以跳到最后。如果你不确定它的外观,那么让我们来看看它的定制部分。

模板定制

乍一看,如果你认为沿着边框有大量的空白,或者侧边栏太厚,甚至你认为字体样式与你的风格不符,那么你需要定制它。你甚至可以使用左侧时间轴的颜色和侧边栏的背景颜色。

要解决所有这些问题,你需要了解 CSS。如果你和我一样没有 CSS 背景,那么继续读下去。

页边距:要覆盖预定义的函数,需要在函数前添加一个星号(*),如下文所示。这样就可以为页面定义新的边距值。

******* {
  /* Override default margins*/
  --pagedjs-margin-right: 0.2in;
  --pagedjs-margin-left: 0.2in;
  --pagedjs-margin-top: 0.2in;
  --pagedjs-margin-bottom: 0.2in;
}******

侧边栏宽度:在根函数中,侧边栏宽度的默认值为 15 rem。这个值可以被改变以获得想要的侧边栏宽度。对于目前的情况,它已被分配到 12 雷姆。

 ******--sidebar-width: 12rem;******

侧边栏颜色:在 root 功能中,侧边栏背景颜色也可以改变。出于演示目的,颜色从#f2f2f2切换到#a2e2e2

******--sidebar-background-color: #a2e2e2;******

时间线颜色:简历左侧的时间线是由同一板块下的点连接起来的竖线组成。垂直线的粗细和颜色都可以更改,如下所示。

******--decorator-border: 2px solid #a2e2e2;** /* change color and thickness of timeline */****

此外,点的背景颜色可以如下所示进行更改。

 ******background-color: #a2e2e2; /* change color timeline dots */******

字体类型:通过定义字体族,可以在 body 函数中改变字体类型。在这个例子中,我将字体从 Open Sans 改为 Roboto ,两者都是无衬线字体。

******/* Define the font family here */
body{
  font-family: "Roboto", sans-serif;
}******

为定制所做的所有更改都在override.css文件中定义。完整的代码在这里:

为了在 CSS 文件中包含所有的更改,我们可以完全覆盖现有的 CSS 文件,或者在 YAML 文件头中使用新的规则来覆盖某些规则。这是通过添加带有 CSS 扩展名的新文件名来完成的。新创建的 CSS 文件应该保存在 markdown 文件所在的文件夹中。原始 CSS 文件的位置将是…Resume_demo_files\paged-0.13\css\resume.css。该文件夹将在减价文件以默认状态编织时创建。

****output:
  pagedown::html_resume:
    css: 
      - override.css         # OVERIDE CERTAIN FUNCTIONS OF CSS
      - resume               # DEFAULT FILE****

打印到 pdf

您会注意到,当您编制降价文件时,会弹出一个窗口,在左上角显示带有 在浏览器中打开 选项的简历。点击这个选项,它会在你的浏览器上打开一个空白标签。要使简历显示在浏览器选项卡上,必须将 YAML 设置从默认值“假”更改为“真”。这可以通过将self_contained: false设置为self_contained: true来实现。然后,可以通过在浏览器选项卡上打印显示的简历来生成 pdf。

创建 pdf 文件的另一个选项是将knit: pagedown::chrome_print添加到 YAML 文件头。

数据自动化

现在到了简历制作的最佳部分,你可以自动填写数据。感谢 Nick Strayer 让我的简历从仅仅定制变成了完全数据自动化。和往常一样,你需要为简历的所有部分创建主数据 CSV 文件。主数据可以通过两种方式完成:

  1. CSV 文件:创建 CSV 文件,并根据您的需要不断更新。CSV 文件可以在您的个人设备或 google sheets 上制作。可以为工作、技能和联系方式建立单独的文件。
  2. 混合方法:如果您很着急,那么您可以直接填写简历模板的降价文件中的字段,并会给出默认简历模板中显示的所需输出,或者包含定制内容。在某些情况下,可能会使用 CSV 文件来添加数据。因为我倾向于使用技能栏来突出我的编程技能的熟练程度,而不是仅仅将它们作为文本添加。所以我选择混合方法。

因此,让我向您演示一下,通过使用默认简历模板中的文本来自动构建简历意味着什么。第一步是创建 CSV 文件。以下是工作和教育历史的 CSV 文件详细信息的示例。

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

作者图片

一旦你创建了文件,你就可以使用简历模板,链接在末尾。有两个 R 文件与模板相关联。如果需要从 google sheets 或 CSV 文件中读取数据,那么gather_data.R会寻找数据源。降价文件中指出了对此的偏好。当功能涉及教育、工作历史、联系信息、技能等时,parsing_functions.R将相关信息粘贴到降价文件中。被召唤。

如果技能栏的颜色需要改变,那么参考parsing_functions.R文件并寻找build_skill_bars()功能。

结论

在本文中,我一步一步地展示了如何从pagedown包中定制默认的简历模板。这是通过中断模板的工作流实现的。在第一部分中,解释了模板的基本构造块和需要注意的区域。第二部分集中在模板定制上,寻找可能的陷阱并根据我的需要定制它们。第三部分是生成一份 pdf 版本的简历。

第四部分,也就是最后一部分,是基于 Nick Strayer 的工作,关于简历中数据填充的自动化。在这一部分,我试着解释了需要关注的一些基本特征,以使简历能够立即运行起来。

通过这种方式,您可以展示您的数据技能和由 R pagedown软件包支持的数据组合。

简历模板的链接:

定制简历:链接

自动化定制简历:链接

参考资料:

  1. https://livefreeordichotomize . com/2019/09/04/building _ a _ data _ driven _ cv _ with _ r/
  2. https://pagedown.rbind.io/
  3. https://fontawesome.com/

您可以在 LinkedInTwitter 上与我联系,跟随我的数据科学和数据可视化之旅。

使用 Python、Dash 和 Plotly 创建更好的仪表板

原文:https://towardsdatascience.com/creating-a-better-dashboard-with-python-dash-and-plotly-80dfb4269882?source=collection_archive---------0-----------------------

让您开始使用 python 轻松创建仪表板的演练。

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

仪表板——来自 Pexels迈克拍摄

介绍

我的爱好是研究商品和期货的深度。正如人们可能想象的那样,其中包含大量数据和分析。表格、报告、图表、图形——应有尽有。

在努力前进并弄清楚这一切的过程中,我发现自己需要想象那些并不总是存在的东西。我需要以我想要的方式查看数据。

如果你从事任何形式或行业的数据分析,你可能已经知道我在说什么了。然而,有很多刚接触数据分析的人只是在尝试。也有一些比较有经验的人只是没用过这些工具。

这篇文章是写给那些想做更多事情或者想尝试新工具的人的。也许你已经完成了 Dash 和 Plotly 的基础部分,想看看不同的东西。

希望这能回答一些问题或激发一些新的创意。

期待什么

我将用一种全新的方法来研究这篇文章。我将解释这个项目是如何产生的,它的结构和功能,以及我认为它未来的发展方向。

由于大小的原因,我无法对所有内容进行完整的逐行解剖。然而,我已经煞费苦心地编写了包含大量内联文档的冗长而简单的代码。作为补充,存储库文件将是非常宝贵的。

我的目的是提供一个运行这样一个项目的模板概述,并展示一些可能的东西。你不需要真正理解底层数据,甚至不需要对它感兴趣就能获得洞察力。如果你对商品和期货感兴趣,那么这将会有一个全新的价值维度。

开始的时候…

正如我在介绍中所说,我的爱好是收集和分析商品数据。这些数据的一个重要来源是商品期货交易委员会(CFTC)提供的每周报告。

我在整个项目中使用的数据保存在这里:https://www . CFTC . gov/market reports/CommitmentsofTraders/index . htm

对我来说,整个项目始于对一些报告的剖析。当我第一次开始时,我编写了一个快速脚本,它将获取报告,对文件进行一些处理,添加一些值,并输出一些图表。然后举报数量开始增长。

随着我的继续,我开始观察多种商品。我运行我的脚本,让几十个标签用各种各样的图表填满浏览器窗口。这是不可持续的。

我需要组织这一切。因此,仪表板被概念化了。

像所有懒惰的程序员一样,我从一个模板开始。该模板碰巧是我过去使用的标准模板,并针对更大的数据库驱动的分析系统进行了改进。我开始撕掉我不需要的东西,开始建造。

我提出这个并不是为了用不必要的描述和故事来浪费时间,而是为了给出一些架构决策背后的一些逻辑。乍一看似乎很奇怪的事情。然而,当把简单的系统扩展成更健壮和更复杂的系统时,这一切都是有意义的。

好的解决方案解决今天的问题。更好的解决方案着眼于未来。伟大的系统融合了这两者。

代码

当我们深入研究时,你需要访问代码。这是我的这个项目资源库的链接。所有代码示例和参考均来自此处:

https://github.com/brad-darksbian/commodities-dashboard 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

商品仪表板——我们在构建什么

高层设计

该仪表板包含多个元素,这些元素被划分为不同的组织文件。

  1. main.py —此文件包含仪表板代码,用作前端组织文件。
  2. support_functions.py —这个文件是系统的核心。从报告检索到实际图表创建的一切都存在于此。
  3. business_logic.py —该文件充当收集数据和设置必要数据框架的桥梁。
  4. layout_configs.py —该文件包含帮助器元素,用于按照我希望的方式设计图表,以及定义我希望使用的工具。

如果我要进一步重构,我可以通过重新组织来删除其中的一些文件。然而,随着系统的增长,它为适当地合并其他功能提供了一个很好的平衡。例如,在我的较大的应用程序中,我的 business_logic 文件处理数据库调用和更多的数据争论,然后才进行传递。

支持功能

让我们从讨论一些获取数据所需的后台函数开始。没有一些数据,我们真的做不了什么。

deacot_file = "/tmp/deacot2021.txt"
da_file = "/tmp/deacot_DA_2021.txt"# Data Retreival and Handling
# Function to retrieve reports
def get_COT(url, file_name):
  with urllib.request.urlopen(url) as response, open(file_name, "wb") as out_file:
    shutil.copyfileobj(response, out_file)
  with zipfile.ZipFile(file_name) as zf:
    zf.extractall()# Function to make sure things are fresh for data
def get_reports():
  freshness_date = datetime.now() - timedelta(days=7)
  if os.path.exists(deacot_file):
    filetime = datetime.fromtimestamp(os.path.getctime(deacot_file))
    if (filetime - timedelta(days=7)) <= freshness_date:
      print("Deacot file exists and is current - using cached data")
    else:
      get_COT(
        "https://www.cftc.gov/files/dea/history/deacot2021.zip",
        "deacot2021.zip",)
      os.rename(r"annual.txt", deacot_file)
      print("Deacot file is stale - getting fresh copy")
  else:
    print("Deacot file does not exist - getting fresh copy")
    get_COT(
      "https://www.cftc.gov/files/dea/history/deacot2021.zip",
      "deacot2021.zip")
    os.rename(r"annual.txt", deacot_file) if os.path.exists(da_file):
    filetime = datetime.fromtimestamp(os.path.getctime(da_file))
    if (filetime - timedelta(days=7)) <= freshness_date:
      print("Disaggregation report file exists and is current - using cached data")
    else:
      get_COT( "https://www.cftc.gov/files/dea/history/fut_disagg_txt_2021.zip",
        "fut_disagg_txt_2021.zip",)
      os.rename(r"f_year.txt", da_file)
      print(
        "Disaggregation report file is stale - getting fresh copy")
  else:
    print(
      "Disaggregation report file does not exist - getting fresh copy")
    get_COT(
   "https://www.cftc.gov/files/dea/history/fut_disagg_txt_2021.zip",
      "fut_disagg_txt_2021.zip",)
    os.rename(r"f_year.txt", da_file)

上面的两个函数(在 Medium 的代码框中被可怕地格式化了)做了几件事。首先,函数 get_reports()评估文本报告文件是否存在。如果是,则检查它们是否是“新鲜的”,因为它们少于或等于七天。如果它们是好的,则使用现有的文件。如果没有,则检索新的。同样,如果文件不存在,则从 CFTC 网站检索。

文件检索使用第一个函数 get_COT,并将 url 和文件名作为参数。这些函数使用 python 模块 zip 文件、url lib、shutil、os 和 datetime。设置两个变量来定义路径。

如果使用此代码,请记住根据您的情况适当地设置这些变量。

一旦我们有了文件,我们就有了要处理的数据。但是,它还是生的。文件“deacot_process”和“DA_process”中的下两个函数会对数据帧进行一些修改。

一般来说,这些函数首先重命名一些列,使事情更容易处理。接下来,他们按照日期对数据帧进行排序,以确保事情按照预期的方式有序进行。之后,会创建一些新的计算列,以便以后参考。最后,拆分“exchange”列,为商品和市场创建两个新列。最后一步是必要的,以便以后在图表和其他位置提供一些标签。

就我个人而言,我总是觉得很难决定是应该将计算列添加到主数据框架中,还是等到以后再添加。我个人的原则是,如果我认为有可能不止一个地方需要它,我会全力以赴。

这个文件的其余部分由生成特定图表的函数组成,这些图表将在仪表板上使用。我不会详细讨论它们,但是如果有不清楚的地方,我鼓励任何人提问。

因为这是一个图表优先的过程,所以图表是在合并到仪表板框架之前定义的。简单地将它们创建为可调用的函数比采用其他方法更有意义。但是,和任何事情一样,应对这一挑战的方法不止一种。

要记住的关键是图表是由函数作为一个现成的对象返回的。这意味着您可以将其作为函数的输出、图形变量或作为布局对象的一部分内联调用。你的选择实际上取决于组织和使用。

业务逻辑

在这个应用程序中,business_logic.py 文件非常简单。总共 41 行,包括许多注释,它实际上只是提供了一个在应用程序启动或重新加载时运行某些功能的入口。

"""    
This files does a lot of the dataframe work and larger data functions. Mostly this is data retrieval, organization, and making sure everything is ready to be called by the main app via call backs.    
This is called by main.py and in turn calls support functions when needed
"""
import pandas as pd
import numpy as np
import plotly.io as pio
import support_functions as sf pd.options.plotting.backend = "plotly"
pio.templates.default = "plotly_dark" # Make sure we have data
# This will check to see if a file exists and if not gets one
#  This also checks the data freshness
sf.get_reports() # Get the data frames to work with
# DEACOT report
df_deacot = pd.read_csv("/tmp/deacot2021.txt", na_values="x")
df_deacot = sf.deacot_process(df_deacot) # Disambiguation report
df_da = pd.read_csv("/tmp/deacot_DA_2021.txt", na_values="x", low_memory=False)
df_da = sf.DA_process(df_da) ####################################################
# Generate the commodities list - use the DA listing
####################################################
da_list = df_da["Exchange"].unique()
da_list = np.sort(da_list) if __name__ == "__main__":    
  print("business logic should not be run like this")

总体布局如下:

  1. 将数据帧后端设置为 plotly。
  2. 将默认模板配置为深色主题。
  3. 使用函数获取报告
  4. 将 CSV 读入数据帧并适当处理
  5. 创建一个只包含交换列中唯一值的新数组

第 5 项用于创建商品的主列表,我们将使用它来驱动仪表板视图并相应地更新图表。

布局配置

layout_config.py 文件包含一些可以跨图表重用的样式数据。它的存在主要是为了简化布局和图表构建过程。

例如:

layout = go.Layout(    
  template="plotly_dark",    
  # plot_bgcolor="#FFFFFF",    
  hovermode="x",    
  hoverdistance=100,  # Distance to show hover label of data point    
  spikedistance=1000,  # Distance to show spike    
  xaxis=dict(        
    title="time",        
    linecolor="#BCCCDC",        
    showspikes=True,        
    spikesnap="cursor",        
    spikethickness=1,        
    spikedash="dot",        
    spikecolor="#999999",        
    spikemode="across",    
  ),    
  yaxis=dict(        
    title="price",        
    linecolor="#BCCCDC",        
    tickformat=".2%",        
    showspikes=True,        
    spikesnap="cursor",        
    spikethickness=1,        
    spikedash="dot",        
    spikecolor="#999999",        
    spikemode="across",    
  ),
)tool_config = {    
  "modeBarButtonsToAdd": [        
    "drawline",        
    "drawopenpath",        
    "drawclosedpath",        
    "drawcircle",        
    "drawrect",        
    "eraseshape",        
    "hoverclosest",        
    "hovercompare",    
  ],    
  "modeBarButtonsToRemove": [        
    "zoom2d",        
    "pan2d",        
    "select2d",        
    "lasso2d",        
    "zoomIn2d",        
    "zoomOut2d",        
    "autoScale2d",    
  ],    
  "showTips": False,    
  "displaylogo": False,
}

在这两种情况下,放置这些类型的配置允许对图表呈现和工具配置进行集中管理。

主仪表板

这是你们期待已久的时刻,构建真正的仪表板代码。

我知道当我第一次开始使用 Dash 时,主文件似乎令人生畏。发生了很多事。我也没有明确的组织流程。但是,我让它以一种对我有意义的方式工作。这就是我将带领你经历的。

我倾向于按以下方式整理我的主要文件:

  1. 样式修饰符。
  2. 内容结构。通常,这些是保存行数据的容器。我发现以反映实际布局的方式构造我的文件是最容易的。我从顶部开始向下移动。
  3. 页面布局聚合。内容结构被放入页面布局中,并被组织到一个引用中。
  4. 应用参数。这是实际应用程序行为以及应用程序标题、样式表和主题等全局项目所在的地方。
  5. 复试。这些是允许窗口小部件运行的动态代码,并真正使仪表板起作用。
  6. 服务器运行。这是实际启动服务器和运行仪表板的最后一行代码。

让我们浏览其中的一些,让您感受一下所有部分是如何组合在一起的。我要把这些有点乱,但没什么大不了的。

首先,让我们看看应用程序参数和服务器一起运行。这些构成了仪表板的骨架,并告知了布局的其他一些方面。

#####################################################
# Application parameters
#####################################################
app = dash.Dash(    
  __name__,    
  suppress_callback_exceptions=True,    
  external_stylesheets=[dbc.themes.CYBORG],
)
app.title = "CFTC Data Analysis"
app.layout = html.Div(    
  [
    dcc.Location(
      id="url", 
      refresh=False), 
    html.Div(id="page-content")
  ]) # Multi-page selector callback - left in for future use
@app.callback(
  Output("page-content", "children"), 
  Input("url", "pathname")
)
def display_page(pathname):        
  # if pathname == "/market-sentiment":    
  #     return volumes    
  # else:    
  return main_page###################################################
# Server Run
###################################################
if __name__ == "__main__":    
  app.run_server(
    debug=True, 
    host="0.0.0.0", 
    port=8050, 
    dev_tools_hot_reload=True
  )

在大多数情况下,应用程序参数应该是不言自明的。需要注意的关键项目是“外部样式表”。这正是我们所说的——外部样式表。在这个例子中,我使用了一个名为 CYBORG 的引导主题,这是一个黑暗主题。

这里,我们还有 app.title 参数,用于应用程序设置标题。app.layout 参数设置了一个过程,通过该过程,名为“page-content”的 id 通过回调函数“display_page”的输出进行传递。这不是绝对必要的,但它允许读取 URL 路径并基于该路径提供不同的内容。它用于多页应用程序。我把它留在里面作为参考。

最后,我们有服务器运行部分。我们可以在这里设置监听 ip 地址和端口。因为我在本地服务器上运行我的仪表板,以便在我所有的计算机上使用,所以我被配置为在端口 8050 上公开侦听。我还将 debug 设置为 True。这减少了我的日志文件中的喋喋不休。如果 debug 设置为 true,应用程序还会在检测到任何文件中的更改时进行热重新加载,这对于开发来说非常有用。

复试

许多文章、视频和其他材料都是围绕着回调而产生的。这是一个复杂的问题,我只谈一点皮毛。然而,这个主题至少可以让你了解它们是如何排列的。

在这个仪表板中,有一个主下拉选择器,用于更新页面上的所有图表。稍后我将介绍这个下拉菜单,但是现在,重要的是要理解这个下拉菜单提供了一个 id 为“future”的输入

记住这一点,让我们分解 main.py 文件中的第一个回调。

# Sentiment charts
@app.callback(    
  dash.dependencies.Output("deacot_sent", "figure"),    
  [dash.dependencies.Input("future", "value")],
)
def deacot_sentiment(future1):    
  df1 = bl.df_deacot[bl.df_deacot["Exchange"] == future1]    
  df1.set_index("Date", inplace=True)       arr = df1["commodity"].unique()    
  asset = arr[0]     

  fig = sf.make_sentiment_chart(df1, asset)    
  return fig

在不多的代码中,发生了很多事情。这主要是因为我们前面提到的组织。

回调从 decorator app.callback 开始,这里我们有一行用于输出,一行用于输入。两者都接受它们引用的元素的 id 和被传递的数据类型的参数。

在这种情况下,输入从“future”id 中收集一个值,我在本节开始时提到过。输出将图形数据发送到“deacot _ sent”。(是的,我知道我应该用连字符来标识……)

有了发送的输入和输出路由,我们必须做些什么来将该值转换成一个数字。这就是函数“deacot _ 情操”的用武之地。它接受输入参数,并简单地将其命名为 future1。

该函数首先过滤在 business_logic 中定义的名为 df _ deacot 的数据帧,并匹配从 future1 传入的值。我们只剩下一个整合的数据框架(df1 ),其中包含交换列与下拉列表中的选择相匹配的数据。

下一行将日期列设置为索引。接下来,我们获取商品列中的唯一值,并将它们放入一个数组中。由于报告的过滤方式,我们应该只有一个值。但是,因为有时事情不会按计划进行,所以我们将第一个数组元素放入名为“asset”的变量中。

然后,我们的 dataframe (df1)和变量“asset”被输入到位于 support_functions 文件中的图表函数 SF . make _ invision _ chart 中。函数的输出被设置为变量“fig”,它是图表的代码。

最后,fig 通过回调的输出以图形的形式返回。它正前往 id“deacot _ sent”。

需要注意的是回调可以有多个输入和输出。输出可以链接到其他回调。

然而,让我们跟随这个数字的路径…

内容

我们刚刚看到了输入如何触发回调并将数字返回到 id。如果我们跳回内容,我们可以在构建用于显示的元素时看到这一点。

正如我前面提到的,我喜欢按照行设置的自上而下的布局来排列我的主文件。这有助于我想象网格,并在构建时将它保存在我的脑海中。在这种情况下,我们为两个情绪图表定义了一行:

# Container for sentiment charts
sentiment_direction = dbc.Row(    
  [        
    dbc.Col(            
      dcc.Graph(                
        id="deacot_sent",                
        style={"height": "70vh"},                
        config=lc.tool_config,            
      ),            
      md=6,        
    ),        
    dbc.Col(            
      dcc.Graph(                
        id="da_sent",                
        style={"height": "70vh"},                
        config=lc.tool_config,            
      ),            
      md=6,        
    ),    
  ]
)

上面的代码设置了一个包含两列的行,每列包含一个不同的图表。第一列的 id 为“deacot _ sent”,这是回调输出的目标 id。

因为我们持有一个图表,所以我们使用 dash 核心组件(dcc)库提供的图形容器。在这里,我们设置 id 和许多其他参数。我特意将高度设置为样式覆盖。我还添加了一个“config”元素,它被设置为上面突出显示的 layout_config.py 文件中的 tool_config 值。

因为元素是从回调的输出填充的,所以不需要显式数据源。如果我们以不同的方式生成图表,我们可能会使用“figure”参数来保存数据。

最后,在 dbc 中。Col 函数,我们看到了“md=6”。这是一个使用引导框架的格式值。其中,每行被分成 12 个单元。设置“md=6”告诉框架,我希望我的列填充总数的 6 或一半。

除了不同的 id 值之外,第二列是相同的。该列将是同一行上另一个图表的输出,占据了另一半空间。

布局

我们从输入到输出之旅的最后一步是将行实际链接到将通过应用程序显示的页面布局。这很简单:

####################################################
# Layout Creation Section
####################################################
main_page = html.Div(    
  [        
    html.Hr(),        
    html.H5(
      "Futures Market Comparison and Analysis", 
      style=TEXT_STYLE
    ),        
    html.Hr(),        
    future_select,        
    html.Hr(),        
    info_bar,        
    html.Hr(),        
    sentiment_direction,        
    html.Hr(),        
    da_postiions,        
    html.Hr(),        
    da_pos_snap,        
    html.Hr(),        
    da_diffs,        
    html.Hr(),        
    references,    
  ],    
  style=CONTENT_STYLE,
)

如果您还记得关于应用程序参数的部分,您会注意到应用程序的页面内容 id。没关系——再读一遍那个句子,有很多是连在一起的。

main_page 变量只是 html.div 的另一个容器。div 由对以前构造的其他元素的引用组成。本质上,我们只是一点一点地构建,以达到最终的结果。

这里是页面集合的地方。在上面的代码中,我从空格、要显示的标题、更多空格、包含选择下拉列表的行、空格、信息栏、更多空格开始,然后是我们的第一行图表。这就是我上面展示的那一行。

这是我们构建仪表板所需的一切。实际上,这比我们需要的要多得多,因为这个设计有点大,而且分散在几个文件中。然而,你现在也许能明白为什么为组织分解各种元素对保持你的理智是有效的。有很多块和元素。将它们组织成逻辑单元对于创建有用且可维护的应用程序大有帮助。

最后一件事

在我结束之前,我真的想为你整理一下。

下拉菜单驱动仪表板。它提供了原始数据点,并允许基于特定商品评估整套报告。它是页面标题下的第一行,非常重要。

# Create drop-down selector
future_select = dbc.Row(    
  [        
    dbc.Col(            
      [                
        html.Div(                    
          [                        
            dcc.Dropdown(                            
              id="future",                            
              options=[
                {"label": i, "value": i} for i in bl.da_list],                            
              value="SILVER - COMMODITY EXCHANGE INC.",                        
            ),                    
          ],                    
          className="dash-bootstrap",                
        ),            
      ],            
      md=6,        
    )    
  ]
)

和以前一样,这是一个非常普通的结构。我们从行开始,然后添加一列。列中有一个 Div,包含 id 为“future”的下拉列表。记住“未来”是回调的输入。

在下拉列表中,我们设置选项,这只是一个基于我们在 business_logic 文件中定义的 bl.da_list 数组的标签和值的扩展列表。这是从 DA 报告数据框架中提取的所有商品的唯一列表。实际上,DA 报告数据框架比 DEACOT 报告包含的内容少,因此使用 DA 作为主列表只是最小的公分母。

我们最后设置了一个默认值,就是在启动时加载一些东西。在这种情况下,我使用银,因为这是我经常看的商品。

同样重要的是,尤其是在使用深色主题时,设置 classname 值。这允许应用适当的样式,以便下拉菜单在深色背景上看起来很合适。这会省去你很多审美上的头疼。

沿着样式线,虽然我们只有一列,但它被设置为只延伸到整个行的一半。这是一个设计上的选择。你可能不同意。

包扎

这要涵盖的内容太多了。Dash 不是一个简单的平台,因为你可以用它完成很多事情。它的能力令人难以置信,一旦你习惯了它的细微差别,事情就会变得更有意义,你可以很快地构建。

正如我在开始时提到的,从我的存储库中抓取代码并浏览它。虽然这只是一个大概的介绍,但是实际的代码是通过文档逐步实现的。更重要的是,这是一个你可以自己运行和探索的功能系统。

如果您确实提取了代码,请随意使用它。做一些很酷的东西,或者只是解剖它,尽你所能去学习。如果你真的想用我写的东西,就告诉我一声。否则,这就是我给这个世界的礼物。

如果有关于清晰性的问题或与代码相关的问题,请随时直接联系我或留下您的评论。我鼓励提供反馈和建议,让事情变得更好。

为 Web3 平台 Mirror.xyz 的用户创建特定于社区的信誉分数

原文:https://towardsdatascience.com/creating-a-community-specific-reputation-score-for-users-of-web3-platform-mirror-xyz-14d494a25ea8?source=collection_archive---------28-----------------------

思想和理论

使用图形数据科学计算 Twitter、治理和以太坊交易中镜像用户交互的信誉分数(中间中心性)

本帖首次发表于ath . mirror . XYZ,请务必订阅并关注我的Twitter以获取我的最新加密和数据科学内容。后来,这种方法被用于第一个$WRITE 令牌空投,你可以 在这里 阅读。

在我之前关于数字身份的文章中,我提到过“这些图碎片的标记化可以有多种形式,并且很可能被证明标记所覆盖。”我认为,分片图身份方法需要提出一个特定于社区的声誉得分,以衡量某个人在扩展特定网络方面的影响力。虽然一些信誉分数可能更多地是根据必须完成 X 或 Y 动作来设置的,但是该分数以更灵活的方式捕获其他用户上下文中的用户信誉— 表现得像一个信号而不是徽章

通常在 Web2 中,用户会得到一种算法的“奖励”,这种算法会根据他们给平台带来的参与度和关注度来突出显示他们。因此,他们的声誉得分仅仅是他们拥有的喜欢或追随者的数量——不管这些虚荣指标来自谁。在 Web3 中,我们通常会奖励代表协议或产品价值的代币。这些代币还以投票和其他特权的形式承载着很大的权力。因此,随着时间的推移,不仅表明影响力,还表明用户与社区其他成员的支持度或联盟度的分数将变得越来越重要。

在这篇文章中,我们将重点关注为镜像用户(投票者、作者、贡献者)创建一个信誉分数,这个分数是基于每个用户在以太坊、Twitter 和镜像数据的基于交互的社交图上的位置。我选择镜子有三个原因:

  1. 我已经非常熟悉他们的社区和产品
  2. 他们在他们的平台(以太坊<> Twitter)上有可验证的身份整合,允许我将社交图分层在一起。
  3. 他们的产品和治理非常注重用户对用户的交互,这是以太坊上的大多数产品目前不具备的(我们主要与池或市场协议进行交互)。

社交图本身并不新鲜,但是有选择地将它们分层将会打开相当多的可用性和意义的新大门。这有两个主要原因:

  1. **启用新应用:**我们可以使用该图表数据来创建依赖于上下文的特定于社区的信誉评分,该评分可应用于许多情况。
  2. **数据代表什么:**建立在稀缺性基础上的代表性网络的创建创建了一个社交图,它代表了用户如何相互支持。

**支持新应用:**我们理解分层的方式会影响我们对数据的处理。在我看来,以太坊是一个基础层社交图,其他一切都建立在它的基础上。像 Mirror 和 Twitter 这样的平台是上下文,位于这个基础层之上,改变了我们如何看待用户在空间中的联系。

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

作者图片

我没有设计能力,但想象一下在 3D 中,每个盒子都是从不同角度穿过球体的一部分。

因为我只想分析 Mirror 的用户,所以我只取了可用以太坊和 Twitter 数据的一个子集。那些具有高的特定于社区的信誉分数的人可以获得更大的令牌空投,被委派财政管理中的角色(或更多选票),或者获得对新协议特征的优先访问。还有更多的类似 Mirror 的环境建立在 Web2 + Web3 平台之上,比如 NFT 社区(Cryptopunks,BAYC,Blitmaps)和游戏社区(Axie Infinity,Darkforest)。

随着 Dao 开始更多地合作,元宇宙变得更加互联,我们将看到更多的社区(和环境)重叠。我想,研究人们和社区如何在社交图的不同背景下互动可以产生混合社区声誉得分,这可以应用于相当多的不同情况。例如,这个分数可以用于多令牌或协作 NFT 空投,以及选择合作伙伴和项目的领导者,如 rabbithole 的探路者计划

**数据代表什么:**收集和使用的数据种类也会影响社交图谱。使用来自$WRITE 投票、资金贡献(跨版本、拆分、众筹和拍卖)和 Twitter 提及的数据,我想代表三种稀缺(分别):信仰、资本和关注。

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

作者图片

是的,从技术上来说,这应该被视为一个自引用循环,但这可能会让人感到困惑

我相信,分析互动如何将不同的人联系到这三个方面会给我们一个代理,显示他们相互支持的程度。我也相信的支持网络给了我们一个在社交图中更准确的社区表现。这两个假设让我有信心使用一个叫做“中间性中心性”的概念作为声誉得分的原始值。

数据表示和上下文的选择是社交图最终形式的关键。如果我只是想代理贡献的意愿,那么我可能会创建一个完全基于不同种类的产品/类别的创建者的创建节点模式,而不是一个纯用户到用户的图。这可能会彻底改变社交图谱的形状。

使用图数据科学创建社区声誉得分:中间中心性

让我们尝试定位并量化种族参与者、作家和贡献者的社交图的强连接点。我选择使用一个叫做“中间中心性”的概念来表示每个节点的得分。使用为所有节点计算所有节点之间的最短路径的算法来计算中间中心性

对于 Mirror 来说,谁投票给谁的基本社交图是这样的:

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

作者图片

金点是赢家,紫点仍在比赛中竞争。上面有 2130 个节点,其中 2041 个节点至少投了一票。

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

作者图片

这是细胞核的放大图,使用莱顿社区检测方法对每个社区进行了颜色编码。从这个和上面的图,我们可以看到有相当多的社区,但几乎所有的赢家都坐在中间。

然而,这还没有一个种族外的社会背景。让我们将以太坊交易级数据分层——这仅限于参与者之间的镜像相关交易,如发送分割、众筹融资以及购买版本或保留拍卖。

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

作者图片

粉红色表示以太坊 tx,请注意,有一些节点只是以太坊地址,没有相关的 Twitter 数据,因为它们没有在比赛中注册。

现在,我们还将添加 Twitter 数据,这将基于在最近 2000 条推文中提到另一个参与者的来链接节点。

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

作者图片

蓝色现在代表节点间的 Twitter 提及

以更清晰的方式显示交互(边缘),社交图中的交互组合如下所示:

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

作者图片

计算在每个方面已经相互交互的用户的数量。

现在回到最初的观点,预期是大型集群之间的一些节点将获得比其他节点更高的权重,因为它们已经连接了跨越大多数其他节点的路径。

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

作者图片

前 300 名中间用户以红色突出显示,我们可以看到他们开始从图表的中心向外扩散。

这被称为“中间性”,我认为这是一个非常重要的因素,当试图积极发展一个社区。这里的基本思想是,一个人的“中间性”因素越高,他们就越有可能建立联系和分支,从而建立一个更加多样化的社区。已经有一些研究论文强调了具有高介数的节点对社区的扩散以及建立网络弹性的有益影响。

你们中的一些人可能会奇怪,为什么我选择了中间中心性,而不是亲密度或程度中心性。后两个指标强调的是纯粹的影响力,我认为一个社区中的声誉不应该仅仅基于那些已经拥有这种影响力的人。Neo4j 的图算法教科书很好地解释了中间性背后的概念:

有时系统中最重要的齿轮并不是权力最大或地位最高的。有时是中间人连接着各个团体,或者是对资源或信息流动拥有最大控制权的经纪人。中间中心性是一种检测图中节点对信息流或资源的影响程度的方法。它通常用于查找作为从图的一部分到另一部分的桥梁的节点。

很多 Web2 都是关于集中影响力和回音室的,我认为 Web3 应该尽可能地支持和激励创造桥梁。

任何想看分数的人都可以在这里查看表格。请注意,这些值没有基于数据/边缘类型进行加权,因此一些用户可能由于 Twitter 交互而不是镜像/以太坊交互而具有更高的介数。

为什么这种方法对分数很重要?

我们已经讨论了这个分数的一些应用,但我使用的解决方案可能仍然显得不必要的复杂或过度工程化。我认为需要这种方法来提供可组合性,同时也以一种更难游戏的方式来衡量声誉。

**可组合性:**如前所述,这个图是逐层构建的。数据元素都可以公开收集,模型遵循一种搜索算法,对选择的任何节点或边(用户或交互)都是灵活的,一旦构建了管道,就可以重复使用或分支进行任何调整。希望在未来,所有可用的数据组件都在一个用户界面中,这种模式变成了拖放。从那里我想象你可以输出分数或者直接连接到类似 disperse.app 或者银河落点的东西。

**持久性:**很多分数和度量的问题在于,一旦它们被公开使用过一次,那么人们就可以开始琢磨如何博弈系统了。对于任何仅仅基于user <> protocol互动的事情来说,这一点尤其正确。创建一个依赖于user <> user <> user的模型更难,因为当前社区中的用户不一定会与坏人互动。行动也是复合的,所以只有一种互动(或一种类型的互动)不足以获得更高的分数。即使他们找到了一些游戏的方法,那么恭喜你现在有了另一个对社区有贡献的积极参与者。

这两个要素允许一个整体上更强大的信誉评分机制,我相信这证明了我们为实现这一目标所付出的努力是值得的。

总之:

我想继续重复这项研究,并可能对协议和社区的具体用例使用这种评分(如果感兴趣,请联系)。如果你已经做到了这一步,并希望以想法或技术专长为这一分析做出贡献,我邀请你加入 ImagDAO 进一步研究社交图数据和分散身份。

接下来的步骤包括更多的数据收集,建立一个 Neo4j 仪表板供其他人使用,当然还包括应用更多的数据科学算法。随着我们试图预测社交图将如何增长或试图瞄准特定的子社区,机器学习和社区检测可能会在未来发挥更大的作用。

我之前提到过,这种分析之所以可能,是因为 Mirror 的平台(以太坊<> Twitter)对身份的可验证巩固。这项工作的继续也很大程度上依赖于身份巩固 API,所以任何在这方面工作的人也请与我联系(看看你的陶瓷和 Gitcoin👀).

一旦我重构并找出如何保护这个社交图中用户的隐私,这些数据和脚本可能会在以后公开共享。

特别感谢本·谢克特在评论这篇文章时给予的所有帮助和想法

创建自定义的 R 包

原文:https://towardsdatascience.com/creating-a-custom-r-package-9a2e303d3332?source=collection_archive---------12-----------------------

为所有用户定义的函数创建一个中心位置。

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

作者图片

我不知道你怎么想,但是我发现 R 用来排序数据帧的方法非常不直观。每当我想对一个数据帧进行排序时,我都不得不绞尽脑汁,通常是通过在网上查找别人是如何做到的,然后复制并修改他们的代码。最后,我决定创建一个易于使用的函数,它可以为我排序数据帧。这是我想到的函数的最新版本:

sortby <- function(df, col, desc = FALSE) { #### df is the dataframe to be sorted
    #### col is the variable by which it should be sorted
    #### desc indicates whether the sort order should be descending
    #### str2expression() allows us to dynamically create a df$col
    ####     variable which gets evaluated by eval()
    df[order(
            eval(
                str2expression(paste0("df$", col))
             ), 
            decreasing = desc
        ),]
}

我当时的问题是,当我想使用这个功能时,如何找到它。答案是创建我自己的包。现在,有很多关于如何创建 R 包的教程,但是它们都缺少一些东西。有些是不完整的或分成多页。有些令人困惑。有些已经过时了。本文的目的是从头到尾详细介绍我结合许多教程得出的过程。

首先,我应该提到我在所有的 R 编程中都使用 RStudio。我的一个要求是,它必须在那个环境中是可行的。虽然没有任何教程实际上排除了 RStudio 的使用,但许多教程完全忽略了它。

在 R 中创建可用包的过程有几个部分:

  • 编写要包含在包中的函数。
  • 为包中的功能创建文档。
  • 构建包。
  • (可选,不在此讨论)发布包。

我的 sortby()函数已经涵盖了第一步。我将这个函数存储在一个名为 sortby.R 的脚本中。

在我们继续之前,我们需要做一些设置。要在 Windows 中创建 R 包,需要安装 RTools 4.0。这是作为一个普通的 Windows 程序安装的,而不是作为 r 中的一个包。你可以在https://cran.r-project.org/bin/windows/Rtools/找到安装程序。我应该说,我在尝试让 RTools 工作时遇到了问题。安装进行得很顺利,但是安装出错了。当我创建。Renviron 文件编辑路径,我无法再安装软件包。我尝试了一些事情,包括重置窗口。经过大量的研究,我发现有人提到在试图安装包之前以管理员身份运行 R。这似乎解决了所有问题,我不再需要以管理员身份运行了。

一旦 RTools 设置好了,您就可以着手创建这个包了。在 RStudio 中,选择文件>新建项目>新建目录> R 包。在弹出的对话框中,给包起一个名字,并输入你希望包驻留的目录。如果您已经像我一样创建了 R 脚本,那么您可以将它添加到“基于源文件创建包:”下的框中。

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

作者截图

然后点击。

此时,您应该在某处看到一个“Build”选项卡。我把它放在左下方我的“历史”标签旁边。(我相信默认是在右上角窗口。)选择“Build”选项卡,然后单击“Install and Restart”来安装您的软件包。一旦你这样做了,这个包应该出现在你的“包”标签中,如下所示。

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

作者截图

注意,包的描述仍然写着“包做什么(标题格)”。我们稍后会解决这个问题。接下来,查看“文件”选项卡。您将看到 RStudio 为您的项目创建的一系列文件和目录。脚本文件将位于“R”目录中,而帮助文件将位于“man”目录中。

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

作者截图

要解决上述描述问题,请打开描述文件。这个必需的文件存储关于包的元数据。

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

作者截图,显示默认描述文件

现在,让我们只改变显而易见的东西。如果你的包有任何依赖项(比如 dplyr 等等。),它应该包含在这个文件中,但不是默认设置的一部分。

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

作者截图

我已经编辑了标题、作者和描述行,并删除了维护行。请注意,标题行变成了右下方窗口中软件包列表中的描述。

帮助文件

创建帮助文件最简单的方法是使用 roxygen2 包。

install.packages("roxygen2")
library(roxygen2)

现在,我们转到 R 脚本,在开头添加一些 roxygen 注释。每个 oxygen 注释行都以# '开头。您应该添加几个项目:

#' @title 
#' @description
#' @param
#' @return
#' @example
#' @examples
  • 标题—用于向帮助页面添加标题(使用标题大小写)
  • 描述—用于添加简短描述
  • Param 为函数中的每个参数添加其中一行
  • return——函数会给你什么
  • 示例-添加一行或多行示例。如果你要添加一行以上的例子,用复数。在完成之前仔细检查这些例子,确保在你没注意的时候没有错误。

添加完 roxygen 注释后,运行以下命令:

roxygenize()

(和往常一样,R 允许命令的美式英语或英式英语版本,所以 roxygenise()也能很好地工作。)

此命令创建。man 文件夹中的 Rd 文件。的。RD 文件是用来创建实际的帮助文件的。我最终的 R 脚本和生成的帮助文件如下所示。

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

作者截图

结论

这就是创建 R 包的基础。您可以做更多的微调,尤其是如果您想要发布您的包。想了解更多关于软件包创建的信息,请在 https://r-pkgs.org/查看哈德利·威克姆的书 R 软件包

创建数据驱动的零售扩张框架

原文:https://towardsdatascience.com/creating-a-data-driven-retail-expansion-framework-2229fef33a17?source=collection_archive---------53-----------------------

现实世界中的 DS

所以你想开一家冰淇淋店…

你开了一家公司,它已经成长起来了。你在你认为合适的地方又开了一两个分店;也许你是星巴克,已经开了上千家。零售企业家或企业面临的最重要的问题之一是在哪里开设下一个位置。一些较大的企业有位置侦察兵,他们的唯一职责是发展业务;许多人不知道。

我之前写的一篇关于预测星巴克未来地点的文章促使一位正在经历这一挑战的企业家伸出援手——他们应该在大匹兹堡地区的哪里开设他们优质冰淇淋产品的下一个地点?他们如何利用数据来提高成功选址的几率?

点击此处 查看将在本文其余部分呈现的仪表盘。

想象一下,你是一个企业家,已经为你的优质冰淇淋品牌开了几家成功的分店。在选项的世界里,哪些变量对你来说是重要的?在与他们谈论这个问题后,我想到了几件事:

  • 人口:当地居民和游客的步行交通至关重要。在该地区服务的人越多,你的潜在客户就越多。此外,一个有价值的区别是由家庭组成的人口,因为他们的购买集体比个人更有价值。
  • 餐厅密度:引发去冰淇淋店的一个重要时间是晚饭后。人们已经承诺外出,他们已经付了饭钱,冰淇淋是结束一夜外出的一种令人欣慰的方式。
  • 位置,位置,位置:如果你离主街区只有一个街区,人流量就会减少。商店需要能见度高,方便,并且在一个步行区域。
  • 竞争对手:这个区域已经挤满竞争对手了吗?如果有人抢在你前面,而且它无法支持多项(或更多)业务,那么其他基本面看起来有多强也没用。

我们如何利用这些变量和更多数据来帮助解决这个问题?

这个项目有三个关键步骤:收集、分析、交流:

  • 收集:收集关于人口、收入、餐馆密度、竞争对手和位置的相关数据。处理数据以匹配所需的格式。
  • 分析:使用汇总的数据对地点进行客观评分和优先排序。平衡数据与人工筛选,以减少对评分算法的过度依赖。
  • 沟通:建立一个自助式 Tableau 仪表盘和一个有效沟通结果的演示。

聚集

我们不会花太多时间来讨论实际的数据收集过程——如果您想了解更多信息,请随时联系我们——但它的要点是在邮政编码级别获取和汇总美国政府、地方政府和商业数据,以生成一个包含每个地方邮政编码及其相关指标的主文件。

分析

我们首先看一些数据是如何按邮政编码在整个地区分布的。人口集中在哪里?哪些邮政编码的餐厅密度最高?哪个邮政编码倾向于在冰淇淋上花费更多?

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

人口,餐馆密度和平均。按邮政编码分列的冰淇淋支出。深绿色表示较高的值。

上面的地图开始让我们了解我们可能面临的权衡。总人口(最左边的地图)主要集中在市中心以外的 5-6 个邮政编码区。然而,市中心有最大的餐馆集群和餐馆密度(中间的地图),而在市中心外,平均冰淇淋消费趋于相当一致,但更高。我们优先考虑哪个?我们应该如何衡量每个变量的重要性?

这就是企业主的经验发挥作用的地方。能够认识到自己的局限性是很重要的。我擅长的一件事是收集、分析和展示数据。我做得不好的一件事是对每一个主题都有专业知识。

为了弥补这一点,我用自助输入构建了一个评分算法。你认为餐厅密度和总人口最重要吗?通过在框中输入较高的分数,为他们分配最大的权重。你想要更高的行走分数还是家庭的存在(K-12 注册)?增加这些分数,减少其他分数。可切换的变量有:

  • 步行评分:小区步行可达吗?这是一个可能会导致高客流量的地区吗?
  • 餐厅密度:附近有多少家餐厅?它是吸引潜在顾客的活动中心吗?
  • 竞争存在:是否有人已经“垄断”了这个位置?还有空间开更多商店吗?
  • 总人口:有足够多的人给一个大的潜在客户群吗?
  • K-12 入学:家庭与个人的代表——家庭人口多吗?

在左侧输入您的分数后,地图和表格会更新。每个邮政编码都有 0-1 分(0 分最差;1 最好)。

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

假设 100 分分配给我们最重要的变量。深绿色表示邮政编码得分较高。

我们现在已经定义了我们的重要变量,并有一种方法来优先考虑哪些邮政编码具有最有吸引力的人口统计信息。尽管该企业目前的大部分位置都在市中心核心区,但我们可以看到,有几个排名较高的邮政编码延伸到了郊区,我们可以根据这一初始优先级进一步考虑。

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

位置映射是从较大区域缩小到特定建议的连续过程

现在,假设您已经决定采用得分最高的邮政编码—高于 15212。你如何处理这些信息?邮政编码可以很大和/或多种多样,因此需要有一种方法比邮政编码更具体。

对我来说,我有兴趣知道的是大多数餐馆在邮政编码的什么地方。我们最有可能成功地将自己定位在客流量最大的区域或其附近。

在仪表板中,当您点击一个邮政编码时,它下面的地图会自动更新该邮政编码下的所有餐馆位置。对于邮政编码 15212,结果如下所示。第一个图像表示被单击的邮政编码中的所有餐馆,第二个图像在表中有更多的细节。该表标识了该邮政编码中餐馆位置最多的街道,当鼠标悬停在该街道上时,餐馆位置会在地图上高亮显示。

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

邮政编码为 15212 的所有餐厅位置

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

该邮政编码中位置最多的街道;悬停时,该位置会在地图上高亮显示。

综上所述,该控制面板允许我们:

  1. 确定我们的重要变量在数据中的分布位置
  2. 使用我们的主题专业知识对邮政编码进行排名和优先排序,同时保持更改可变重要性权重的灵活性
  3. 选择我们想要查看的邮政编码,并查看该邮政编码中的“活动”在哪里
  4. 找到值得实地调查的具体街道

我们的建议可以足够精细和具体,以便采取行动,同时也有足够的灵活性来适应不断变化的时间或用户偏好。

推荐

最终,我选择为扩展选项创建一个三管齐下的框架:

  • 现状:找一个与当前位置有相似特征的位置,并且靠近市中心
  • **地理扩张:**寻找一个与当前人口统计数据相似但不在市中心核心区域的位置
  • **投机取巧:**用直觉平衡数据,找到一个可能排名不是最高,但代表一个有希望考虑的机会的位置

每种方法的优点和注意事项如下所示。

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

对于这些扩展选项中的每一个,Tableau 工具——与谷歌地图中的“实地”研究相结合——导致了以下三个推荐的位置。

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

我的建议是,短期的方法应该是保持现状,而中长期的地理扩张选项应该进一步探索。

我觉得现状选项几乎没有自相残杀的风险(目前所有的商店都在河的南面),具有最高的自然客流量潜力(靠近足球场和棒球场外加一个儿童博物馆),并且在当前的零售状况下具有最小的不确定性。

从中长期来看,我觉得地域扩张是最好的选择,因为它覆盖了高收入地区的全新人群。我还认为,谨慎的做法是等待地理扩张,看看“城市人口外流”是永久的还是暂时的人口流动。

替代考虑因素:竞争分析和 COVID 影响

我将简要介绍的另一种方法是,我们可以使用该工具进行竞争分析。如果我们对市区感兴趣,我们可以突出显示这些邮政编码,并过滤底部的地图,只显示竞争对手。我们可以看到在河的北面很少有冰淇淋店。从这里,我们可以决定这是否代表机会(有吸引力的选择,还没有竞争对手继续前进),或者是否有合理的理由(分区、商业房地产的定价,或其他可用数据之外的原因使其成为无吸引力的选择)。

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

使用仪表板进行竞争分析的示例

从 COVID 的角度来看,很明显,任何新的位置都代表着不确定性,可能在短期内不可行。资本支出较低的替代方案可以是通过零售合作伙伴进行分销,例如便利店和杂货店。

该公司目前有零售合作伙伴关系,其逻辑延伸是尝试与他们目前的合作伙伴一起成长,因为这比寻找和建立新的合作伙伴更容易。从他们的网站上,我们可以汇总当前合作伙伴的所有潜在位置,并将其绘制在地图上。

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

黄点代表所有潜在的合作伙伴。星星是当前位置。家庭数量越多(人口越多),地图阴影越暗,家庭数量越少,地图阴影越暗。

同样有意义的是,任何分销渠道的扩张都应该发生在远离当前零售点的地方(在那里有人已经可以很容易地获得产品),以最大限度地扩大客户范围。左边的地图突出显示了他们当前合作伙伴的所有位置(不管产品当前是否在那里;该信息当前不可访问)以及他们当前的店面位置。红框代表最适合分销扩张的商店“集群”。

这种方法的另一个好处是它是郊区扩张的试验场。市中心位置以南的方框代表当前店面和之前确定的地理扩张选项之间的便利中点。如果产品在这些商店销售良好,我们可以更有信心,该位置可能会取得长期成功。如果销售不理想,这是一个低成本的测试,我们可以重新考虑市场是否可以维持我们的产品零售足迹。

同样值得注意的是,上述分析是在没有访问内部数据的情况下完成的;所有信息都是从公开的第三方来源收集的。

不幸的是,这一过程和合作关系在 COVID 之前就已经开始了,因此,随着保持业务的需要突然成为一个更为紧迫的问题,这一过程和合作关系就变得不那么重要了。然而,总有一天,企业会找到自己的立足点,到那时,随着一波租赁承诺到期,将会有一个数据驱动的框架向前发展,企业可能会看到机会。

有兴趣谈论位置策略和分析吗?请随时在 LinkedIn 上与我联系,或者在 jordan@jordanbean.com 与我联系。

使用概念创建数据科学和机器学习组合

原文:https://towardsdatascience.com/creating-a-data-science-and-machine-learning-portfolio-with-notion-25888cf19356?source=collection_archive---------30-----------------------

传统简历的现代化

我一直将理念视为一种生产力和组织工具。有了观念,我计划我的媒体发布时间表,在研究论文上做笔记,设置任务提醒,安排我的日常事务。

但是,我从未想过将“概念”作为一个在线投资组合,直到我看到 YouTube 上展示用“概念”制作的投资组合的视频和文章。

大多数用概念制作的作品集的例子来自设计师和艺术家。我决定创建一个专注于机器学习学科的概念组合。

这篇文章详细介绍了我使用概念创建机器学习/数据科学投资组合的步骤和推理。它将为您提供一些内容和布局创意,您可以采用这些创意来设计您的投资组合,如果您目前正在寻找一个新的角色,这可能会很有帮助。

在本文的结尾,我包含了本文中展示的投资组合的概念模板的链接,以及创建一些图像资产的 Canva 链接。

标题+简介

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

Richmond Alake 投资组合标题部分的版本 1

这个作品集的介绍部分向访问者提供了我的专业背景、动机和特长。我已经写了两段文字,简要介绍了我在机器学习方面的专业知识,包括我所从事的具体技术。

在为你的作品集准备介绍性的文字时,你要给访问者提供有趣的信息,鼓励他们探索你作品集的其他方面。这有助于将此部分视为“关于我”的页面。

第一段概括了我 5 年多的职业生涯,而第二段重点介绍了我希望访问者关注的主要学科和专业知识。我还考虑用第一段来展示我职业生涯的技术方面,第二段着重于软技能,如沟通、互动和协作。请随意尝试最适合您的内容结构。

标题部分的左边包含了一张你的非常漂亮的照片。但严肃地说,这张照片为整个作品增添了人性化的元素。突然间,我不再是网上随便找的人了。现在我是一个有脸的普通人。

我还包含了外部资源的链接,这些资源提供了对我实现的代码、在线内容和社交媒体资料的访问。添加这些链接为访问者提供了展示我职业自我的其他途径。

为了结束这一部分,我提供了导航到产品组合中其他区域的链接。一些访问者可能对我做过的项目感兴趣,而其他人可能想查看我的工作经历。此外,通过提供一个导航菜单,我向访问者突出这个投资组合包含什么。

下面是写介绍性段落时可以考虑的一些有用的提示

  • 试着用吸引人的语气写作,并确保展示你最好的技能和品质。
  • 使用关键词,并且要具体。你的陈述不要模棱两可。尽可能包含数字,例如,你在一个领域工作的年数。
  • 请不要做得太长。两段话绰绰有余。

对一些人来说,标题部分的空间太大了,我不是设计专家,但是丰富多彩的导航链接让这个文件夹更有活力。但是对于那些喜欢简单视觉布局的人来说,下面的标题和介绍部分的结构可能更合适。

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

Richmond Alake 投资组合标题部分的版本 2

职业

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

Richmond Alake 的投资组合职业部分

你可能会认出这个投资组合中职业部分的布局。我特意采用了类似 LinkedIn 的工作经历部分的内容布局。对职业部分的熟悉将使访问者更容易浏览和理解所展示的内容。

职业部分包括我前几年承担的与机器学习相关的角色。值得注意的是,我没有包括任何我的网络开发工作经验和项目。这个投资组合集中在我职业生涯的机器学习部分。给求职者的一般建议是,尽可能多地放入工作经验,所以在你的文件夹中随意添加尽可能多的相关工作经验。

每个角色都遵循相同的布局:一个图像或标志;职位名称;公司名称;持续时间;位置、角色和职责。职责和技能是职业部分的关键信息。

技能部分强调了我在特定角色中使用的编程语言、工具、库和技术。为了美观,也为了吸引访问者的注意,我给每个技能交替使用背景色。

我提供的关于每个角色职责的信息很简短,但非常具体。我已经包括了技术信息,但是我在一些角色中添加了传达软技能的职责(沟通、互动、协作)。我甚至包括了 GitHub repos、工具和书籍的链接,为好奇的访问者提供更多的背景信息。

如果你想引起招聘人员和招聘经理的注意,就要特别注意职业部分的细节。一定要突出具体的技能,使用传递专业知识的关键词。

企业和项目

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

版本 1: Richmond Alake 的投资组合风险和项目部分

这部分是我可以灵活运用的地方💪。

我已经包括了我从事的业余爱好项目,我参与的风险投资等等。本节旨在介绍我目前持有的心态,即通过探索技术解决问题的方式来培养技能和专业知识。

本节传达的个人属性如下:

  • **创造力。**虽然软件工程和机器学习是技术领域,但也有表达创造力的有趣方法。我见过的网站和手机应用程序都是艺术品。完美的设计表明,网页开发人员和设计师可以成为数字艺术家。
  • **企业家精神。**在我的圈子里,私下交易几乎是一种常态;也许你也一样。2020 年至 2021 年间,我参与了几个项目,推出了几个应用,并与投资者进行了交谈。这是一个过山车般的旅程,但如果你还年轻,没有比现在更好的冒险时机了。
  • **好奇心。**如何用技术解决这个问题?每当我在生活中遇到一个耗费太多时间或精力的过程时,我都会不断地问自己这个问题。我的大部分业余爱好项目试图简化和自动化我的生活。
  • 成长。机器学习的领域很广,我不断探索新的技术、库和技巧。拥有一个成长的心态将我从令人兴奋的 web 开发世界推向了人工智能世界。

每个包含的风险或项目都有一个外部链接,描述和我参与的细节。对于那些喜欢本节更直观的外观的人来说,下图描绘了一个更美观的结构。

当创建你的作品集时,不要不情愿包括你曾经做过的小项目。如果你写了一个删除文本中空格的脚本,在你的文件夹中展示它。招聘人员更感兴趣的是你拥有什么样的技能,而不是你的项目有多成功。

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

Richmond Alake 的投资组合风险和项目部分的第 2 版

媒体和内容

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

Richmond Alake 的媒体和内容组合

如果我想让你从这篇文章中学到什么,那就是:如果你想超越一般的职业轨迹,知名度和个人品牌是至关重要的。

去年,个人品牌在我的职业生涯和外部工作中变得更加普遍。我更加努力地将我的独特性融入到我的作品和我放在网上的内容中。

媒体和内容部分是向访问者展示我的在线身份的一个机会。我写的中型文章展示了我对机器学习概念的了解,我已经能够通过中型文章记录我在机器学习领域的学术和专业旅程。因此,访问者了解学习机器学习硕士是什么样的,以及我在职业生涯中从事哪些活动。

这一部分的内容是我采访著名数据科学 YouTuber 网站 Ken Jee 的视频。我还收录了一些我广受好评的媒体文章。如果你想创建一个作品集,那么花些时间在 LinkedIn、YouTube、Medium 等平台上创建内容。

学术界

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

里士满·阿拉克投资组合学术部

我的投资组合中的学术部分并不重要,但它确实是一个很好的补充。拥有学术资格在某种程度上证明了你的专业知识。至少,这表明你是一个聪明的人,可以长期致力于一项特定的事业。

随意收录在线机构和 MOOCs(海量在线公开课)颁发的证书。

使用概念的优势

为了使 idea 的优势更加具体,下面是作为投资组合制作者利用 idea 的一些好处。

  • 免费。我使用免费版的概念计划,用来创建我的时髦投资组合的功能也是免费的。
  • 省时省力。如果你使用像 SquareSpace 和 Wix 这样的网站建设工具,创建一个投资组合会花费大量的时间,至少需要几天。如果你是从零开始构建,甚至需要更长的时间。有了 concept,你不必担心网络语言或托管网站。
  • 易用性。观念使得向访问者展示你的作品集变得非常容易。只需点击一个按钮— 见下图

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

公开概念页面的步骤

  • 多种内容布局格式。概念提供了各种结构和格式来表示内容。表格、列表、切换、降价文本、代码等等都是概念上可用格式的例子。
  • PDF 和 HTML 是导出页面的几种格式。

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

导出概念页面的选项

结论

使用概念有更多的好处。您可以通过探索该工具和构建您的投资组合来发现这些优势。这里有一个 链接到我的作品集 。请随意使用我的模板并添加新的部分。

你必须欣赏这种观念提供的灵活性。与传统的简历相比,有更多的自由来展示你的项目和经历,既有创造性又令人兴奋。

在竞争激烈的就业市场中,独特性确实有助于脱颖而出。这就是为什么我恳求你创建一个作品集,公之于众,并在你的简历中添加一个作品集的链接。

感谢阅读。

概念组合

Canva 上的导航链接

要联系我或找到更多类似本文的内容,请执行以下操作:

  1. 订阅我的 邮箱列表 了解更多内容
  2. 跟着我上
  3. LinkedIn Twitter 上连接并联系我

创建数据科学产品组合

原文:https://towardsdatascience.com/creating-a-data-science-portfolio-bd485382f49?source=collection_archive---------3-----------------------

办公时间

建立投资组合的技巧和例子

找一份数据科学家的工作越来越难了。在数据科学被称为*“21 世纪最性感的工作”*之后,许多人都加入了这股潮流,开始在这个领域找工作。

现在,数据科学就业市场对刚从大学毕业的大三学生来说已经相当饱和了。空缺职位吸引了数百名初级数据科学家,有时甚至是高级数据科学家。

数据科学职位招聘中相互矛盾的要求让初级求职者日子不好过

问题是,你怎么做才能把自己从数百名申请者中脱颖而出?

虽然有很多方法可以做到这一点,比如额外的实习、课程、MOOCs 等。对我帮助很大的一件事就是创建一个投资组合。

构建数据科学组合有两个目标。首先,它可以让你向招聘经理展示你的技术专长。如果你是这个领域的新手,这尤其有用。第二,积极建立投资组合是一个很好的学习机会。你需要花时间构建算法,部署解决方案,并以有意义的方式交流结果。

这篇文章将告诉你我对这个问题的看法:

“创建可靠的数据科学产品组合需要什么?”

数据科学项目组合可以包含许多内容,但通常围绕您(数据科学专业人员)已经创建的内容。例如从头开始构建算法、研究新方法、进行有意义的分析等。

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

我的项目的几个例子。完整的概述可以在这里或者这里找到。背景由卢卡斯布拉塞克

它还可以让你展示你在过去的工作经历中没有发展出来,但在个人项目中集中了的专业技能。

这也意味着作品集不是主要用来弥补工作经验差距的工具。它还能帮助你在这个领域更受欢迎的职位中获得优势。

在建立你的投资组合时,我相信一个人从专注于发展一个 T 形轮廓中获益匪浅:

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

t 型轮廓。图片由作者提供。

T 形轮廓代表了两件事。首先,单杠代表通才。数据科学家应该具备统计学、编程、部署、业务等方面的基础知识。第二,竖条代表一种专门的技能。这可以是对 NLP、计算机视觉、时间序列等的关注。

换句话说,尽管数据科学家可以专注于某个特定领域,但不应该忽略基础知识。在这两者之间找到平衡应该对你的职业生涯和个人发展都有帮助。

1。创建您的项目

投资组合的基础由许多项目组成。这些项目可以成就你的投资组合,也可以毁掉你的投资组合,因为它们是你工作的门面。

因此,这些项目应该被仔细选择,并且需要传达许多东西:分析的质量、沟通技巧、代码质量、业务相关性等等。

再进行一次泰坦尼克号分析不会让你与众不同。

在这里,我将详细介绍这些方面,并展示如果我要创建一个新的方面,我将如何在我的投资组合中处理它们。

这个想法

当创建一个项目时,我建议不要从一个数据集开始,而是从一个想法开始。没有目的的分析通常是没有意义的,应该尽可能避免。

尝试回答以下问题:

  • 我想解决什么问题?
  • 谁将从我的分析和/或产品中受益?
  • 有没有我可以改进的技术?

即使你自己想不出什么,也有很多资源可以帮助你开始:

但最重要的是:

选择你感兴趣的项目,否则它们会变得太繁琐

有时,我们不需要数据来创建与数据相关的项目。你可以开始构建算法,复制论文,或者创建一个包来填补特定的空白。

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

Autoscraper 是优雅而简单的包装的一个很好的例子,巧妙地填补了一个空白。由像素完美平面图标制作的图标。

举个例子,在过去的几年里,我一直专注于开发像伯托皮基伯特c-TF-IDFVLAC 这样的算法。这些帮助我证明了我可以把分析带到下一个层次。

数据来源

尽管你可以在 Kaggle 上找到很多有趣的数据集,我还是建议你在数据集的选择上更有创意一点。例如,您可以分析来自当地政府的数据(荷兰美国法国等)。)、世卫组织数据,或者在大型孟德尔数据库中搜索数据。

换句话说,试着自己收集数据。在许多组织中,在获得一种清晰的格式之前,通常有相当多的困难需要克服。展示你可以自己找到并处理数据,这展示了你非凡的技能。

使用 BeautifulSoupScrapyAutoScraper 或任何其他方法来抓取你的数据,肯定会给创意加分。它还表明您可以处理真实世界的数据,因为生成的数据通常是杂乱的。

储存库

在 Github 这样的公共场所分享你的作品。这是展示诸如版本控制、OOP、模型评估、文档等技能的好方法。

这些存储库应该有足够的文档,让不熟悉您的项目的人了解如何使用或解释它。试着清晰有效地交流项目是关于什么的,结果是什么,尤其是你的分析的含义。

尽管招聘经理不太可能会运行你的代码,但它很好地概述了你通常交付的工作质量。

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

提供清晰直观的自述文件大有帮助!伯托博的自述。图片由作者提供。

以下是一些好的自述文件页面示例:

  • 丛生,在 calmcode.io 上的视频系列的一部分。
  • 高质量自述文件页面的精彩概述

注意:如果你对质量文档的例子感兴趣,我强烈建议你浏览一下https://github.com/koaning的项目。正确记录的技能被严重低估了。

部署

展示您的技能能够产生影响的最佳方式之一是部署您的代码。对拥有软件工程技能的数据科学家的需求似乎正在迅速增加。

有几种方法可以解决这个问题:

首先,您可以从已经创建的分析中创建一个应用程序。例如,如果您要创建一个关键词提取工具,那么您可以创建一个 Streamlit 应用程序来展示您的应用程序的可用性。

第二,通过 PypiAnaconda 提供你的 python 包。如果为了使用你的 python 包,你必须做的唯一一件事就是pip install my_package,那该有多好?这表明你了解生产前和生产过程。

展示软件工程技能是让你脱颖而出的关键

认识到数据科学不仅仅是创建模型,这一点很重要。用户打算怎么用?需要如何部署?应该是什么样子?等等。

2。教程&博客

除了项目,你可以开始在你的文件夹中添加教程和博客文章。这些对于证明你能够以不熟悉内容的人可以理解的方式解释技术问题是至关重要的。

每当您创建一个分析、模型、包或任何感兴趣的东西时,您都可以将其打包在一篇博客文章中,使您的工作更加公开。

如果你能把某样东西教给别人,你就真正理解了它

类似地,写教程是帮助你理解材料的一个神奇的方法。每当我学习一个新的话题时,我会确保我能向别人解释它。

举个例子,我在下面写的这篇文章展示了用简单的方式呈现复杂的材料是多么重要:

</9-distance-measures-in-data-science-918109d069fa>

磨练你的写作技巧会帮助你成为一个更好的沟通者。你将慢慢开始对你的利益相关者的需求和愿望有一种直觉,这是一种令人惊奇的技能。

因为你很可能是在媒体上阅读这篇文章,所以我建议从这里开始也就不足为奇了。Medium,具体来说是 TowardsDataScience 出版物,是一个张贴你的技术教程和人工智能领域想法的好地方。

我在 TowardsDataScience 的工作并没有被忽视,而且在过去几年我参加的几乎所有面试中都有很大帮助。

https://medium.com/@maartengrootendorst

似乎不仅仅是我从写作中受益。梅根·迪布尔解释了在媒体上写作是如何让她的在数据分析部门找到工作的。同样,Dario rade ci写了作为数据科学家拥有博客的好处。作为最后一个例子,大卫·罗宾逊解释了开博客的好处。

还有几个地方可以让你开始写作:

3.社交媒体存在

你可能已经猜到了,如今你的社交媒体越来越重要。

公开你的工作有助于社区了解你的技能。对于招聘经理来说,除非他们能亲眼看到,否则很难真正知道你的能力。

虽然有很多方法可以达到这个目的,但是我相信选择你喜欢的事情是最有效的。话虽如此,下面是一些有趣的社区添加到您的投资组合。

卡格尔

竞争让 Kaggle 变得伟大。它们是练习你的建模技巧的极好方法。赢得比赛并展示你能深入预测建模是对你简历的一个很好的加分。

个人认为,用户提供的内核和笔记本才是让 Kaggle 保持伟大的原因。通过提供无价的 EDA 来帮助他人的机会是一项被严重低估的任务。

B 成为 Kaggle 的讨论专家被严重低估了

编写和发布内核有很大的价值。回答问题,开始讨论,开发内核,对训练你的沟通能力至关重要。

一个很好的例子是安德鲁·卢克扬科,他是笔记本和讨论大师,这是你在那个平台上能得到的最高级别。在一次采访中,他谈到了从事内核和讨论的挑战和好处。

Stackoverflow

在 Stackoverflow 上回答问题是一次很棒的经历。当涉及到交流复杂的主题时,你不仅会学到很多东西,而且它还为你提供了一个进一步发展技能的机会。

Jon Skeet 是 Stackoverflow 上最知名的用户之一,他解释了他如何在平台和上成名,以及为什么在编码时沟通是如此重要。这再次证明了沟通技巧不应该被忽视。

对这个 StackOverflow 问题的回答表明,良好的声誉有助于你在面试中“脱颖而出”。招聘经理不太可能询问你的简历,但拥有一份简历可能会给你带来竞争优势。

任何有助于证明你专业知识的东西都是有用的。

这表明你很好地理解了材料,尤其是如果你在平台上获得了声誉。假设您经常在 StackOverflow 上回答特定的基于 NLP 的问题。如果我是招聘委员会的一员,我肯定会认为这是一个优势。

Twitter 和 LinkedIn

每当你创建一个开源包或完成一项分析,通过 Twitter 或 LinkedIn 分享它。通过在这些平台上推广你的内容,你创造了一个有趣的机会与你所在领域的人合作和互动。

在这里,它主要是关于网络和建立你的个人“品牌”。为了给你一些提示,阿德蒙德·李讲述了为什么建立你的个人品牌很重要,以及它将如何影响你的职业生涯。

数据科学不仅仅是机器学习…统计、评估、理论、实验、模型服务、部署等等。

Philip Vollet 是一个很好的例子,他基于这些平台建立了一个庞大的追随者。他在 LinkedIn 上有 80,000 多名粉丝,作为开源倡导者,他为自己赢得了名声。我强烈建议跟随他学习更多有趣的开源项目。

因此,使用这些平台主要是为了让你的工作公开,并与他人联系。分享你的 Twitter 和 LinkedIn 账户不太可能给你带来梦想中的工作。

开源代码库

Github 是一个展示你的技能、与同行交流以及向导师学习的绝佳场所。和大多数事情一样,如果你有时间,我强烈建议要么创建一些你自己的库,要么贡献给开源。

当你创建自己的知识库时,它会迫使你考虑受众和用户。他们能理解我想要达到的目标吗?他们能轻松地使用代码库吗?这意味着在创建存储库时,您的自述文件应该是一个很大的焦点。

有许多文章介绍了如何建立你的 Github 组合(这里是,这里是,这里是),应该有足够的资源可以开始。

花大量时间在你的自述上,第一印象会持续很久!

积极参与开源社区不仅是一种很好的学习方式,而且真正表明你可以深入这项工作的某些技术方面。它展示了良好的编码实践、深厚的算法知识和协同工作的能力。

首先,搜索您经常使用的包,如 scikit-learn ,并搜索 CONTRIBUTING.md 文件。在这里,您通常会找到关于如何为软件包做贡献的详细说明。Scikit-learn 有一个优秀的教程,教你如何为这个包做出贡献。确保专注于一个简单的问题,并以此为基础。

这次对 Sebastian Raschka 的采访,他是 mlxtend 包和流行的“ Python 机器学习”书的作者,很好地概述了从事开源项目对你职业生涯的好处。

和大多数事情一样,雇主是否会看你的 Github 简介取决于你如何在简历中定位它。如果你把它放在简历上,很有可能有人会浏览你的 Github 简介。

4.投资组合是什么样的?

在创建了一组项目、包、博客文章和/或教程之后,是时候把它们放在一起了。完整的投资组合是什么样的?

幸运的是,这个问题没有单一的答案!这让你在开发的时候更有创造力。无论是通过个人网站还是 Github,都由你决定。

开源代码库

Github 是一个创建和分享你的作品集的优秀平台。有几种方法可以解决这个问题:

首先,花些时间优化你的个人资料的自述页。当有人打开你的 Github 档案时,他们首先看到的是 README 页面。这是一个讲述你自己、你做过的项目和你的经历的好方法。

我强烈建议从这篇优秀的投资组合阅读概述中寻找灵感。

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

我的 Github 作品集页面预览。图片由作者提供。

其次,您可以为您的投资组合创建一个链接到您的存储库的特定页面。这允许你创建一个你已经完成的所有项目的概览,而不需要在你的个人资料中浏览所有不相关的分支。

一个例子是 Andrey Lukynenko,他的 Github 投资组合通常被视为项目的清晰概述。

商务化人际关系网

不要忘记把你的项目和经验放到 LinkedIn 上。如今,它是你职业关系网的核心。试着建立你的关系网,这样每次你分享一个完成的项目时,它都会出现在正确的地方。

有很多方法可以提高你在 LinkedIn 上的个人资料,但它们都归结为一件事,沟通。用这样一种方式来交流你的技能,让读者明白,而不需要仔细阅读经验。

言简意赅,切中要害,注重结果。

你也可以把你的项目放在你的 LinkedIn 个人资料上。确保您关注技能、指标,但最重要的是关注影响。

你在数据科学上所做的一切都意味着会产生一些影响。确保阅读您正在处理的所有内容。

个人网站

创建个人网站对发展你的个人品牌大有帮助。您可以轻松管理想要发布的内容,并专注于对您来说重要的事情。

个人网站的伟大之处在于,你可以更容易地控制自己生活故事的叙述。关注你认为有趣的内容,比如项目、帖子,甚至是公开演讲。

一个著名的例子是大卫·罗宾逊的个人网站方差解释。他的开源网站建立在使用最小错误的基础上,这是一个 Jekyll 主题,用于轻松部署个人网站。

如果你不熟悉 Jekyll,我建议你从一个简单的 Github 页面站点开始。您只需要一个带有自述文件的存储库就可以开始了!

简历

在所有的项目陈述中,最受关注的是你的简历。这是一个所有事情都汇集在一起的地方,通常也是面试中判断的主要来源。

因此,在你的简历中充分展示你的项目并得到应有的关注是至关重要的。

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

简洁的简历格式示例。从背面的中检索。

我强烈推荐以下关于撰写简历的指南:

通过关注技术、结果和影响,你可以传达你工作的重要性。

关注你工作的影响

背面是简历模板的一个很好的来源。不仅简历质量很好,而且这也是一个学习学术界常用的 LaTeX 的好机会。

没有一种格式是最有效的,因为招聘人员可能对应该在哪里提到什么有不同的看法。不过,似乎有一个共同点,那就是你会想把重点放在工具、技术和结果上

感谢您的阅读!

希望上面的提示能帮助你创建一个展示你专业知识的坚实的投资组合。你可能已经听我说过太多次了:

沟通是关键

如果你和我一样,对人工智能、数据科学或心理学充满热情,请随时在LinkedIn上添加我,或者在 Twitter 上关注我。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值