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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

用例:水果分类

原文:https://towardsdatascience.com/use-case-classifying-fruit-1a0ae4da3c5e?source=collection_archive---------28-----------------------

图像识别模型能理解新鲜农产品的奇特之处吗?

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

图片来源

供应链中水果和蔬菜等易腐食品的处理可能涉及许多过程,如分拣、称重和识别过期产品。传统上,这些过程是手工完成的,但随着技术的进步,自动化程度越来越高。现在,工业物联网(IIoT)和 ML 等领域在供应链中发挥着越来越重要的作用,行业参与者可以利用图像识别等技术来帮助对产品进行分类,在边缘做出决策,并优化他们的运营。

像这样的垂直市场对 ML 来说是一个很好的测试。举个例子,像水果和蔬菜这样的食物。每个标本的大小、形状和特征都各不相同,而照明等环境因素都增加了图像处理训练数据的复杂性。

谢天谢地,在感知力实验室,我们从不在挑战面前退缩。因此,我们在感知实验室中建立了一个图像识别模型,看看它能否通过分析图像来识别不同类型的水果。

有了足够高的准确性,像这样的模型可能会帮助农民、批发商和超市自动化供应链中负责管理和处理这些产品的不同流程。让我们看看进展如何。

数据集

为了训练我们的模型,我们使用了来自 Kaggle 上的 Fruits 360 数据集的图像,这些图像最初是使用视频捕获获得的,如这里的所示

数据集包含超过 90,000 种颜色。jpg 图像分为 131 类,代表不同类型的水果。使用 6500 多张图像的子集,我们使用 PerceptiLabs 的数据向导中的预处理选项将每张图像的大小调整为 224x224 像素。图 1 显示了该数据集中的一些苹果图片示例:

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

图 1:来自数据集的图像示例—图像 来源

为了将分类映射到图像,我们创建了一个. csv 文件,将每个图像文件与适当的水果分类标签相关联,以便通过 PerceptiLabs 的数据向导加载数据。下面是一个部分的例子。csv 文件看起来:

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

的例子。csv 文件,用于将数据加载到将图像文件映射到其关联标签的 PerceptiLabs 中。

我们已经将图像数据和这个 CSV 文件在 GitHub 上进行实验。

型号汇总

我们的模型只使用了一个组件:

组件 1: VGG16

我们采用的 VGG16 模型是具有 16 层的神经网络架构,其中 13 层是卷积层,其余三层是密集层。图 2 显示了感知实验室中模型的拓扑结构:

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

图 2:感知实验室中模型的拓扑结构—图片 来源

训练和结果

我们用 32 个批量 5 个历元训练模型,使用 ADAM 优化器,学习率 0.001,交叉熵损失函数。使用大约 74 分 44 秒的训练时间,我们能够实现 99.82%的训练准确率、99.54%的验证准确率和 99.6%的测试准确率。全球培训损失为 0.19%,全球验证损失为 0.14%。

图 3 显示了训练期间 PerceptiLabs 的统计视图:

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

图 3:训练时 PerceptiLabs 的统计视图。训练损失和精度分别显示在左上角和右上角,右下角可以看到渐变—图片 来源

在这里,我们可以看到验证和训练损失随着时间的推移逐渐下降,两者的曲线非常相似。验证和训练准确性的曲线也反映了彼此的形状,并在稳定在略低于 1.0 之前的前三个时期上升。

图 4 显示了模型的分类标签度量表测试结果和混淆矩阵:

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

图 4:模型的分类标签度量和混淆矩阵—图像 来源

混淆矩阵表明,模型正确地测试了几乎所有的样本(即,只有少数假阳性或假阴性)。Labels Metrics 表通过显示以下各项的高(标准化)值来证实这一点:分类准确度(每个类别的准确度对所有类别进行平均)前 K 个分类准确度(前 K 个预测类别中正确类别的频率)精确度(正面预测的准确度),以及召回(找到的正面的百分比(即,没有被错误分类为负面而不是正面)。

垂直应用

像这样的模型可以用于水果的收集、分类和分配。例如,该模型可用于分析通过相机获取的照片或视频帧,以分析传送带上不同种类的苹果,从而帮助对它们进行分类。该模型本身也可以用作迁移学习的基础,以创建用于对其他类型的食品、材料或产品进行分类的模型。

总结

此使用案例展示了如何构建图像识别模型来支持整合了 IIoT 和/或 ML 的供应链流程。如果你想建立一个类似这样的深度学习模型,运行 PerceptiLabs 并从 GitHub 中抓取一份我们预处理过的数据集。

Mihai Oltean,水果 360 数据集:包含水果和蔬菜的图像数据集,2020,Kaggle.com,2020.05.18.0,https://www.kaggle.com/moltean/fruits,麻省理工学院许可证

用例:将木材单板分为干和湿

原文:https://towardsdatascience.com/use-case-classifying-wood-veneers-into-dry-and-wet-19e10c387973?source=collection_archive---------27-----------------------

我们如何构建一个图像识别模型来自动化密钥验证过程

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

图片来源

工业物联网在工业 4.0 中发挥着重要作用,尤其是在自动化制造流程方面。随着传感器、摄像头和人工智能在边缘的集成,组织现在可以自动化许多流程,如视觉质量控制检查。

以制造木皮为例。制造过程的一个重要部分包括在高达 320°F 的温度下干燥木材片,以获得大约 8%至 12%的含水量。在此干燥过程之后,必须对板材进行多次验证,以确保它们已正确干燥并符合质量控制标准。

为了帮助自动化这一验证过程,我们开始在 PerceptiLabs 中构建一个图像识别模型,该模型可以识别单板是还是湿。像这样的模型可能有助于制造商自动识别水分含量过高的单板。

数据集

为了训练我们的模型,我们使用了来自单板 21 数据集的图像。原始数据集包括高分辨率。png 图像(通常超过 4000x4000 像素)分为两类,分别代表湿木皮。使用 PerceptiLabs 的数据向导,我们将图像预处理为 224x224 像素。图 1 显示了来自该数据集的单板的一些示例图像:

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

图 1:显示干燥单板的数据集的图像示例— 图像来源

为了将分类映射到图像,我们创建了一个. csv 文件,将每个图像文件与适当的分类号(0 =干,1 =湿)相关联,以便使用 PerceptiLabs 的数据向导加载数据。下面是一个部分的例子。csv 文件看起来:

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

的例子。csv 文件,用于将数据加载到将图像文件映射到其分类号的 PerceptiLabs 中。

车型总结

我们的模型只用了三个组件:

组件 1:卷积神经网络(CNN),Activation= ReLU ,特征映射=16,Patch_size=3,Stride=2

组件 2:密集,激活= ReLU ,神经元=256

组件 3:密集,激活= Softmax ,神经元=2

图 2 显示了感知实验室中模型的拓扑结构:

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

图 2:感知实验室中模型的拓扑结构— 图片来源

训练和结果

我们用 32 个批量 5 个历元训练模型,使用 ADAM 优化器,学习率 0.001,交叉熵损失函数。在大约 22 分 10 秒的训练时间内,我们实现了 100%的训练准确率和 99.7%的验证准确率。图 3 显示了训练期间 PerceptiLabs 的统计视图。

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

图 3: PerceptiLabs 在训练时的统计视图— 图片来源

下面的图 4 和图 5 显示了训练期间五个时期的准确度和损失:

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

图 4:训练时的准确度— 图片来源

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

图 5:训练中的损耗— 图片来源

这里我们可以看到,在训练和验证的第一个时期,精确度增加最多,损失减少最多。在第一个时期之后,精确度和损失在其余时期保持稳定。

垂直应用

像这样的模型可以用来检测生产线上的制造缺陷。例如,该模型可用于分析照片或视频帧,这些照片或视频帧是通过工厂地板上的摄像机采集的,这些摄像机在制造过程中捕捉通过装配线的单板。任何含有 T2 湿木材的板材都会被标记出来,供工厂工人进一步检查。该模型本身也可以用作迁移学习的基础,以创建用于检测其他类型的材料或产品中的缺陷的附加模型。

总结

这个使用案例是一个例子,说明图像识别如何用于帮助制造业。如果你想建立一个类似这样的深度学习模型,运行 PerceptiLabs 并在 GitHub 上查看我们为这个用例创建的 repo。

https://ghar pedia . com/blog/manufacturing-process-of-wood-单板/

T.Jalonen,F. Laakom,M. Gabbouj 和 T. Puoskari,“使用暹罗神经网络的视觉产品跟踪系统”,IEEE Access,第 9 卷,第 76796–76805 页,2021 年,doi:10.1109/Access . 2021 . 3082934(cc 4.0)。

使用云托管实现 AWS 安全性自动化

原文:https://towardsdatascience.com/use-cloud-custodian-to-automate-security-in-amazon-web-services-3ea7b800a209?source=collection_archive---------16-----------------------

了解如何使用云托管自动保护您的 AWS 帐户使用易于使用的免费政策。

任何使用过亚马逊网络服务( AWS )的人都知道有一些很棒的自动化安全功能,比如 AWS Config 。不利的一面是,根据你的账户有多忙,费用会很快增加。AWS 自己的客户之一, Capital One 创建了一个名为云托管的社区项目。

该项目在执行时即时创建临时的 Lambdas ,以对照策略进行检查,并在发现配置不合适时采取纠正措施。要了解更多关于云托管如何工作的信息,你可以查看 AWS Re:Invent 视频这里。让我们开始实现免费的自动化安全!

先决条件:确保 Python3 已安装并可在您的终端中访问。您还需要确保设置了 AWS CLI 和您的 IAM 密钥或您的 [SSO](https://aws.amazon.com/blogs/security/how-to-create-and-manage-users-within-aws-sso/#:~:text=AWS%20Single%20Sign%2DOn%20(AWS,set%20permissions%20across%20those%20groups.) 凭证。然后根据您的操作系统使用以下语法安装云保管人:

#For Linux and Mac Terminals
python3 -m venv cloud-custodian-lab
source cloud-custodian-lab/bin/activate
pip install c7n

#For Windows using Powershell:
Python -m venv cloud-custodian-lab
. .\custodian\Scripts\Activate.ps1
pip install c7n

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

创建虚拟环境并安装云托管

现在让我们创建一些资源,然后编写一个策略来检查它。创建 VPC 和开放安全组。使用 VPC 向导创建一个带有一个公共子网的 VPC。然后创建一个安全组,允许从 0.0.0.0/0 到 tcp 端口 22 和 3389 的整个入站。

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

VPC 中不安全安全组的创建示例

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

向您的安全组添加开放的 RDP 和 SSH 规则入口列表

现在,让我们在 YAML 创建一个样本样板策略来展示云托管的健壮性。检查提供的样板样本策略。该示例策略将检查允许 RDP 和 SSH 从互联网进入的 VPC 安全组。删除规则,然后标记资源:

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

YAML 的云托管政策示例

如果你想跟进,请随意从我的文本中复制粘贴到这里:

### EC2 Related ###
policies:
  - name: open-world-admin-port-securitygroups
    resource: aws.security-group
    description: Removes 0.0.0.0/0 and ::/0 as sources ingress for security groups
    filters:
    - or:
      - type: ingress
        Ports: [22, 3389]
        Cidr:
          value: "0.0.0.0/0"
      - type: ingress
        Ports: [22, 3389]
        CidrV6:
          value: "::/0"
    actions:
      - type: remove-permissions
        ingress: matched
      - type: tag
        tag: NonCompliantResource
        value: remediated

您将对我们的不良实践安全组使用样本策略,并确保规则已随云保管人标记的安全组一起删除。利用以下命令:

custodian validate <your policy name.ext
custodian run --dryrun -s result <your policy name.ext>
custodian run -s result <your policy name.ext>

如果您一直这样做,您的输出将类似于下面这样:

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

Powershell 验证和运行云托管策略

运行示例策略后,检查您创建的 AWS 帐户 VPC 安全组,您会看到对它的更改。观察以下结果,包括被删除的违规规则和对象上的新标签:

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

云托管人删除了不合规的规则

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

云保管人向资源对象添加了自定义标记

您还可以在 CloudTrail 中检查对 AWS 帐户的 API 调用和结果。打开 CloudTrail,注意正在使用的 IAM 用户编程键或 SSO 凭据,深入研究标记事件和规则删除,并查看 Cloudtrail 提供的详细信息:

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

AWS Cloudtrail 显示成功添加的自定义标记

恭喜您,您现在已经成功利用云托管来自动化您的 AWS 帐户安全的一个方面。在我让您自己进行试验之前,这里有另一个非常受欢迎的示例策略,您可以从它开始。以下是如何始终确保 S3 存储桶被加密的方法:

policies:
 - name: s3-bucket-encryption-policy-absent
    resource: s3
    description: s3 buckets without encryption required and re-enable encryption 
    filters:
      - type: no-encryption-statement
    actions:
      - type: set-bucket-encryption
        crypto: AES256
        enabled: True
      - type: tag
        tag: NonCompliantResource
        value: remediated

那么下一步是什么?您可以在您的 CI/CD pipeline 中添加云托管作为您的部署后操作的一部分。或者你甚至可以将云托管策略和引擎封装在另一个 lambda 中,并在 CloudWatch Events 中的预定 cron 任务上运行。

一如既往,如果你觉得这些信息有用,并希望更深入的咨询;请随时在 www.scissecurity.com联系我

快乐安全发展!

通过这些技巧更有效地使用 Colab

原文:https://towardsdatascience.com/use-colab-more-efficiently-with-these-hacks-fc89ef1162d8?source=collection_archive---------8-----------------------

招数

充分利用 Google Colab 笔记本电脑

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

来源:https://pixabay.com/images/id-4905013/

合作实验室,简称“Colab”,是由谷歌托管的 Jupyter 笔记本,它们允许你通过浏览器编写和执行 Python 代码。旋转 Colab 很容易,因为它直接与您的谷歌帐户集成在一起。Colab 提供对 GPU 和 TPU 的免费访问,要求零配置,实现代码无缝共享。

Colab 有一段有趣的历史。它最初是作为谷歌内部的数据分析工具出现的。然而,后来它被公开推出,从那以后,许多人一直在使用这个工具来完成他们的机器学习任务。许多学生和没有 GPU 的人依靠 colab 的免费资源来运行他们的机器学习实验。

本文汇编了一些有用的技巧和窍门,我用它们来完成我在 Colab 中的工作。我已经试着列出我第一次阅读的大部分资料来源。希望这些技巧能帮助你充分利用你的 Colab 笔记本。

1.使用🖥本地运行时

通常情况下,Colab 会为您提供免费的 GPU 资源。但是,如果您有自己的 GPU,并且仍然希望利用 Colab UI,有一种方法。您可以在本地运行时使用 Colab UI,如下所示:

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

在 Colab |作者图片中使用本地运行时

这样,您可以在本地硬件上执行代码并访问本地文件系统,而无需离开 Colab 笔记本。下面的文档更深入地介绍了它的工作方式。

https://research.google.com/colaboratory/local-runtimes.html

2.便条簿📃

你是否最终创建了多个名为“untitled 1.ipynb”和“untitled 2.ipynb”等的 Colab 笔记本??在这方面,我想我们大多数人都在同一条船上。如果是这样,那么 Cloud scratchpad 笔记本可能适合你。云端暂存是一种特殊的笔记本,可在网址[https://colab.research.google.com/notebooks/empty.ipynb](https://colab.research.google.com/notebooks/empty.ipynb)找到,不会自动保存到您的硬盘帐户。它非常适合实验或非平凡的工作,并且不占用 Google drive 的空间。

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

Colab 中的便签本|作者图片

3.直接在 Colab 中打开 GitHub Jupyter 笔记本📖

Colab 笔记本的设计方式可以轻松地与 GitHub 集成。这意味着你可以直接将 Colab 笔记本加载和保存到 GitHub。多亏了成宰·瑞恩·李,有一种简便的方法可以做到这一点。

当你在 GitHub 上的一个笔记本上想要在 Colab 中打开时,在 URL 中将github替换为githubtocolab,其他的保持不变。这会在 Colab 中打开同一个笔记本。

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

在 Colab 中打开 GitHub Jupyter 笔记本|作者图片

4.获得已完成单元执行的通知🔔

即使您切换到另一个选项卡、窗口或应用程序,Colab 也可以通知您已完成的执行。你可以通过Tools → Settings → Site → Show desktop notifications来启用它(并在提示时允许浏览器通知)来查看它。

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

在 Colab|按作者排列的图像中启用单元格通知

这是一个演示,演示了即使导航到另一个选项卡,通知也是如何显示的。

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

获得已完成单元格执行的通知|作者图片

附加提示

你希望你的 Jupyter 笔记本也有同样的功能吗?我会掩护你的。您还可以在 Jupyter 笔记本中启用单元格完成通知。详情请阅读👇

5.搜索驱动器中的所有笔记本🔍

您要在驱动器中搜索特定的 Colab 笔记本吗?导航到驱动器搜索框并添加:

application/vnd.google.colaboratory

这将列出您的 Google Drive 中的所有 Colab 笔记本。此外,您还可以指定特定笔记本的标题和所有权。例如,如果我想搜索一个由我创建的标题为“Transfer”的笔记本,我会提到以下内容:

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

按作者搜索驱动器|图片中的所有笔记本

6.Kaggle 数据集到 Google Colab🏅

如果你的预算有限,并且已经用完了 Kaggle 上的 GPU 资源配额,这个黑客可能会给你一个喘息的机会。可以将任何数据集从 Kaggle 无缝下载到您的 Colab 基础架构中。你需要做的是:

  1. 下载您的 Kaggle API 令牌:

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

按作者访问您的 Kaggle API 令牌|图像

点击。Create New API Token选项卡,将会生成一个包含您的 API 令牌的kaggle.json文件。在 Google Drive 中创建一个名为 Kaggle 的文件夹,并将kaggle.json文件存储在其中。

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

包含 kaggle.json 文件的 Kaggle 文件夹|作者图片

2。在 Colab 笔记本中安装驱动器

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

在 Colab 笔记本中安装驱动器|图片由作者提供

3。提供“kaggle.json”的配置路径,更改当前工作目录

import os
os.environ['KAGGLE_CONFIG_DIR'] = "/content/drive/My Drive/Kaggle"%cd /content/drive/MyDrive/Kaggle

4。复制要下载的数据集的 API。

对于标准数据集,可以如下访问 API:

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

【2021 年福布斯亿万富翁数据集在 Kaggle 上公开发布 |图片由作者提供

对于与竞赛相关联的数据集,API 位于“数据”选项卡下:

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

[IEEE-CIS 欺诈检测竞赛](http://IEEE-CIS Fraud Detection) [公开](http://Forbes Billionaires 2021 3.0)在 Kaggle 上[可用|图片由作者提供](http://IEEE-CIS Fraud Detection)

5.最后,运行以下命令下载数据集:

!kaggle datasets download -d alexanderbader/forbes-billionaires-2021-30or!kaggle competitions download -c ieee-fraud-detection

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

Kaggle 数据集到 Google Colab |作者图片

7 .通过终端访问 Colab

好吧,如果你不是笔记本的忠实粉丝,但想使用 colab 提供的 GPU 和 TPU,有一个办法。感谢 Mark Saroufim 在社区中公开分享这个黑客。

为此,您需要安装 tmate 。让我们看看这是如何工作的:

!apt-get install tmate
!ssh-keygen 
!tmatessh into the generated url

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

8.在 Colab 上访问 Visual Studio 代码(VS 代码)💻

不使用笔记本要不要使用 Colab 的基础设施?那么这个提示可能是给你的。由于社区的努力,创建了一个名为Colab code**的包。**现在可以在 Colab 中运行 VSCode 了。从技术上讲,这是通过代码服务器完成的——一个运行在远程服务器上的 Visual Studio 代码实例,可以通过任何网络浏览器访问。安装软件包的详细说明可以在下面找到。

https://github.com/abhi1thakur/colabcode

这是这个过程的一个快速演示。

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

通过作者访问 Colab | Image 上的 Visual Studio 代码(VS 代码)

9.数据表扩展🗄

Colab 包括一个扩展,它将熊猫的数据帧渲染成可以动态过滤、排序和浏览的交互式显示。要启用熊猫数据帧的数据表显示,请在笔记本单元格中键入以下内容:

%load_ext google.colab.data_table#To diable the display
%unload_ext google.colab.data_table

这里有一个相同的快速演示:【https://colab.research.google.com/notebooks/data_table.ipyn】T4b

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

Colab |作者图片中的数据表扩展

10.比较笔记本👀

Colab 可以很容易地比较两个笔记本。使用 Colab 菜单中的View > Diff notebooks或导航到[https://colab.research.google.com/diff](https://t.co/wu8ce4ngMl?amp=1)并将要比较的笔记本电脑的 Colab URLs 粘贴到顶部的输入框中。

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

比较 Colab |作者图片中的笔记本

包裹

这些是我发现非常有用的一些 Colab 技巧,特别是在 GPU 上训练机器学习模型的时候。尽管 Colab 笔记本最多只能运行 12 个小时,然而,有了上面分享的技巧,你应该能够充分利用你的会议。

👉有兴趣看我写的其他文章。这个 回购 包含了我分类写的所有文章。

使用计算机视觉捕捉真实世界的事件

原文:https://towardsdatascience.com/use-computer-vision-to-capture-real-world-events-57dc890e82d5?source=collection_archive---------21-----------------------

变更数据

利用计算机视觉协助 COVID 疫苗分发

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

来自 Pexels凯文·Ku拍摄的照片。

在这篇博文中,我将描述使用计算机视觉捕捉不同事件的一般方法,重点是如何使用计算机视觉进行一系列应用来帮助疫苗分发。这篇博文比较长,但是我涵盖了一些不同的场景,这些场景在很多情况下会有帮助。如果你想查看代码,可以在这里找到。如果对应用程序进行了改进,本文也会更新!

一年多来,新冠肺炎疫情以多种方式影响了我们的生活,也给我们带来了诸多挑战。有了现在可用的疫苗,我们有能力加速疫情的终结,只要疫苗能够安全有效地分发。应该尽一切努力帮助这一进程。进入计算机视觉!

在开发应用程序时,最好考虑到特定的用例及环境。为了确定计算机视觉如何帮助疫苗接种过程,我们的团队咨询了疫苗接种中心的一名志愿者,以了解更多关于该过程的信息,并寻找应用计算机视觉的机会。如果你想看这次讨论的录音和应用的演示,你可以在 YouTube 上观看。

在志愿者的疫苗接种中心,有三个主要阶段:等待接种疫苗(和/或等待登记)、接种疫苗和接种后监测。我们的志愿者确定的主要问题是,我们认为计算机视觉可以很容易地帮助我们:减少长时间的等待时间,帮助个人练习社交距离,以及监控疫苗接种后的房间。由于目前的方法是手动点击器计数器,因此有一种方法来验证已经进行了多少次疫苗接种也是有用的。

疫苗接种过程中的一些其他障碍,如难以导航的网站,不适合用计算机视觉来解决。其他挑战,如多余的表单输入,可以通过将计算机视觉许可证验证解决方案与更高效的在线注册流程相结合来解决!

该解决方案使用三个模块化应用程序,可以单独使用或与仪表板结合使用,以帮助解决上述问题。第一个应用程序监视等候室,记录个人之间的距离、戴口罩的个人比例以及等候室中有多少椅子是空的。第二个应用程序监控发生了多少次疫苗接种事件。第三个应用程序监视患者何时举手,表示他们需要志愿者的帮助。通过整合这些解决方案,以及一些关于正在使用的疫苗类型和当天疫苗接种预约数量的一般输入数据,我们还可以帮助提供一种验证方法,以确定打开了多少个疫苗瓶、打开的疫苗瓶中还剩多少剂量,以及是否到达了当天的最后预约。这些数据可以帮助管理等待时间,如果排队速度比预期慢或快,就会自动发送短信通知即将到来的预约,如果一天结束时打开的小瓶中还有疫苗剂量,就会拨打等待名单。

因为这些应用程序不是为真实的站点开发的,只是尽可能接近真实场景,所以使用了库存视频数据,而这些数据正是驱动应用程序实现的原因。如果您构建自己的疫苗接种应用程序,确切的应用程序将很可能非常不同;要么过程会略有不同,要么拍摄角度会有所不同。

候诊室申请

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

照片由来自 PexelsPaula Schmidt 拍摄。

候诊室应用协助分析社交距离和面具检测,以及在候诊室椅子无人时进行监控。距离其他人至少 6 英尺(大约)并且戴着面具的人有绿色的边界框;如果一个人与另一个人的距离小于 6 英尺,或者没有戴口罩,就会显示红色方框。

为了确定等候室有多满,我们检测等候室的椅子上有多少人。这是通过使用免费提供的股票 alwaysAI 模型 yolov3 进行对象检测来实现的。结果过滤函数用于将结果限制为带有“人”标签的结果,以确保只检测到对人的预测。这是通过在每把椅子周围创建一个边界框来实现的,并注意当一个人的边界框与最近的椅子边界框重叠超过某个阈值时——比如大约 70%。使用该阈值是因为一些人在椅子上前倾,或者将脚伸向侧面,因此使用阈值< 100%允许以更一般化的方式检测一个人正坐在椅子上。关于检测到多少个面具、每对人之间的平均距离或距离以及有多少椅子被占用的报告被发送到服务器(参见最后一节)。

开发该应用程序的第一步是执行遮罩检测。

alwaysAI 的产品经理托德·格里德(Todd Gleed)训练了一个新模型,使用标签“面具”(代表任何戴着面部覆盖物的脸)和“无面具”(代表没有任何覆盖物的脸)。通过与我分享项目的模型,我能够测试不同的版本。在应用程序中测试该模型时,它偶尔会工作,但在股票视频数据上有困难,这些数据具有较小的遮罩实例(人比他们在训练数据中离摄像机更远)。股票数据碰巧只使用了更柔和的中性色。我还注意到,当患者坐在登记工作人员的正对面时,该模型并不总是能够做出任何预测(无论是“戴口罩”还是“不戴口罩”);所以从那个角度拍摄的图像在数据集中可能没有得到很好的表现。我们当然可以对模型进行更多的训练,使用更接近用例的数据,但是我修改了应用程序代码。

因为知道哪些人戴着面具是有用的,要么人的边界框必须与面具检测的边界框进行比较,要么对应于人检测框的图像可以简单地用作面具检测模型的输入,这就是我选择要做的。

对于每个“人”检测框,对应于人的原始帧部分被切掉,并且该图像通过掩模检测模型运行。在这个应用中使用了类似的方法。此外,如果模型不能做出任何预测,我们就有能力说‘这里有一个人,但我不知道他们是否戴着面具’;如果有人背对着相机,或者由于其他原因很难检测到遮罩,这将非常有用。如果检测到一个人,但无法确定他们是否戴着面具,则此人的边界框会用红色标记,并给出“未检测到面具”的标签。该应用程序在登机工作人员正对面的角度上仍然有问题。

应用程序的这一部分确实使用了跟踪,但是,这可能是不必要的。在这种情况下,跟踪对于查看病人如何从一张椅子移动到另一张椅子是有用的,但是对于候诊室,我们可能只关心是否所有的椅子都满了,或者注意有多少椅子是空的,等等。这可以通过物体检测来实现。每当有人坐在椅子上或离开椅子时,这些信息都会被发送到仪表板应用程序。

在这个应用中,距离是通过对一个人使用硬编码的标准测量来完成的,大约 3.5 英尺,并使用像素标度,例如在这个示例应用的中使用的。如果你想看这个逻辑的演示和解释,你可以在 YouTube 上查看这个关于距离测量的视频教程。在这种情况下使用三英尺半,因为人们通常坐在用于开发应用程序的股票数据中。使用硬编码的比例是可能的,因为只有一个静态摄像机,每当检测到一个人坐着时,整个人都在画面中。根据相机角度和环境,您的应用可能需要更强大的距离测量方法,例如使用帧中尺寸已知的其他对象,或者检查关键点以查看是否找到完整的人,或者如果只找到部分人,则使用不同的比例。你也可以使用深度相机进行更精确的测量。

疫苗接种申请

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

照片由来自佩克斯古斯塔沃·福林拍摄。

对于疫苗接种应用程序,我建模的场景是单个表的静态视图。医疗专业人员坐在桌旁,并且定期有患者过来坐在桌旁。一段时间后,医务人员绕过桌子,站在病人旁边,给他们注射疫苗。因此,可以通过记录两个人何时进入图像的一部分,记录他们何时离开,然后基于这些时间戳确定他们在该区域停留了可接受的持续时间,来捕捉“接种事件”。每次发生疫苗接种事件时,都会向仪表板服务器发送 POST 请求。

这种实现只需要跟踪并注意到被跟踪的边界框在设定的时间内位于图像的特定部分,与上一节中描述的方式完全相同。根据摄像机角度和每个疫苗接种站的摄像机数量,您可能需要采取类似于候诊室椅子的方法,或者您可能需要使用关键点来记录某人何时坐着或站着。

疫苗接种后监测应用程序

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

照片由 RODNAE ProductionsPexels 拍摄。

在个人接种疫苗后,他们通常被放入一个大房间约 15 分钟,在那里他们可以坐下来,如果他们感到不适,可以通过举手通知医疗保健专业人员。第三个应用程序旨在协助此疫苗接种后监测。这是一个非常简单的概念——捕捉举手动作。在这个应用程序中也做了类似的事情。在这种情况下,我没有定义什么是不良姿势,而是抓住了“举手”的不同概念。在本应用程序使用的普通视频中,当一个人的肘部高于相应的肩部时(注意:这意味着肘部的 y 坐标小于相应肩部的 y 坐标),可以通过记录来捕捉举手动作。

不过,这是一种过于简单的抓牌方式。看看这一部分顶部图像中的所有人,或者想想当你举起手臂时,你的手臂与你的头、肩膀和其他关键点的关系。也许你的朋友举起手臂的方式有所不同——也许你的手臂向上伸直,所以你的手腕在你肘部的正上方,肘部在你肩膀的正上方。也许你的朋友只是把他们的手放在他们的脸上,所以他们的手腕在他们的肩膀上,但是他们的肘部在侧面,在垂直位置上在手腕和肩膀之间。在相机视图中,也许你看不到手腕、胳膊肘或肩膀。您可以使用真实世界的举手动作进行测试,看看在给定相机角度的情况下,哪些关键点关系反映了最常见的举手动作!

为了防止捕捉到某人刚刚拂去脸上的头发或可能调整眼镜时的动作,这些动作可能导致与举手非常相似的关键点关系,我们可以在应用程序中使用“共识”逻辑。这将在检测到举手时启动一个计时器,然后计算在特定超时时间内检测到举手的次数。总结果数除以当前人数,然后将其与检测到“硬加薪”的总次数进行比较。例如,如果我们运行循环 10 次,有一个人举手,我们应该有 10 个“举手”结果和 20 个“没有举手”结果。只要“举手”事件的数量大于或等于事件总数除以人数,我们就将其记录为真正的举手。每当有人举手,这就被发送到仪表板服务器。在我们的手势控制应用中使用了类似的方法。你也可以看看关于这个话题的 YouTube 的记录!

将这一切结合在一起

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

迈克·范·肖特沃特摄于佩克斯

在我最初的实现中,三个应用程序使用一个用 Dash Plotly 生成的仪表板捆绑在一起。因为 alwaysAI 是基于 Python 的,所以您可以将这些应用程序与现有的 Python 包集成。这个 GitHub 存储库提供了一个基本的 Dash 仪表板作为 alwaysAI 应用程序;您可以将所有数据(在每个应用程序中使用“server_url”属性)发送到这个仪表板,处理事件日志,并使用这些数据填充仪表板中的各种图形和表格!请注意,在单个应用程序中,我们将数据发送到“路由”和 URL。为了处理传入的数据,您需要在 dashboard_server/app.py 中的各个应用程序中创建发送数据的路由,如下所示:

@app.route("/event", methods=["POST"])
def event():
    body = request.json
    # process body further, send to managing object

您可以创建额外的路由(如 ‘/setup’ ,或者您可以为每个单独的应用程序创建不同的端点)。创建一个特定的类来解析和管理传入的数据可能会很有用。因此,您可以在 dashboard_server/app.py 中实例化一个“经理”对象(您可以自己定义的类的实例),然后将所有数据传递给这个对象并处理它。例如,烧瓶路径可能如下所示:

manager = DataManager()@app.route("/event", methods=["POST"])
def event():
    body = request.json
    manager.process_data(body)

事实上,如果您只想聚合数据并发出警报,或者根据结果编写数据文件,那么您可以不使用 Dash 可视化工具来完成这些工作——只需使用这些路由来处理传入的数据,并让一些应用程序逻辑使用数据管理实例来确定要采取的操作。

如果您正在使用 Dash,那么您的 dashboard_server/app.py 中的回调函数可以调用这个管理对象上的方法来获取数据以填充您的可视化。例如,上述 GitHub 存储库中的回调可以修改为如下所示:

# Dash Callbacks
@dash_app.callback(
   output=[Output("logs", "data"), Output("logs", "columns")],
   inputs=[Input('interval-component', 'n_intervals')]
)
def render_log_table(n_intervals):
   df = manager.get_log_table_df() 
   return df.to_dict('records'), [{"name": i, "id": i} for i in df.columns]

在“DataManager”类中,您可以定义函数 get_log_table_df() 并实现它来返回正确的数据。

将重新格式化的数据存储在 pandas 数据帧中可能是有用的,因为 Dash 中的许多组件都将数据帧作为输入

最后的想法

虽然所有其他应用程序都设置为使用 alwaysAI streamer 功能(用于查看应用程序输出的本地网页)运行,但这主要是为了展示应用程序是如何工作的。如果您需要对 streamer 进行更多的控制,您可以自己构建;你可以在这里找到各种关于 T2 的例子。如果您不需要整合可视化,也可以将此模板用于您的中央服务器。您也可以在没有流媒体工具的情况下运行这些应用程序,只需使用计算机视觉服务生成的信息向您的服务器发送请求。如果你想使用 streamer,但是你想隐藏人脸,你总是可以使用人脸检测模型(比如alwaysai/res10 _ 300 x300 _ SSD _ ITER _ 140000),然后在对 edgeiq.blur_objects() 的调用中使用从结果返回的预测。当然,如果您曾经开发过使用健康相关数据的生产应用程序,您将需要遵守 HIPAA 和卫生组织的所有要求。

疫苗接种中心用例很可能不再需要,但是您可以使用计算机视觉来捕捉许多不同的事件!

利用数据科学找到你的下一家餐馆

原文:https://towardsdatascience.com/use-data-science-to-locate-your-next-restaurant-e99b27efec3b?source=collection_archive---------33-----------------------

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

在你的城市开一家 Chipotle 连锁店| Justin Snyder 摄影在 Unsplash

这个博客提供了一种利用现有的特许经营位置来决定你的餐馆的最佳位置的方法。

注意:关于详细的分析和统计,请查看 GitHub 代码

虽然传统上,根据可行性研究、各种成本和经济因素来确定在哪里开餐馆是一个重要的决定,但依靠数据科学可以提供更深入的见解。住在伊利诺伊州布卢明顿的我继续寻找下一个最好的墨西哥卷饼店,使用他们在 Kaggle 上的位置数据,如下图所示。

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

图 1。 Chipotle 在美国的特许经营店。热门位置(红色)和其他位置(蓝色)|作者图片

地理分析

下一个需求是获取邻居信息,这里我们没有直接提供。幸运的是,各种供应商都提供 API 数据,如 Google、Yelp 等。存在。我推荐 Foursquare ,它每天提供大约 50000 个免费 API 信用点,并且易于使用,提供:

  • 场馆-该地区的所有场馆
  • 用户-用户的个人资料详细信息
  • 提示-用户的评分、照片和评论

我们可以迭代我们的位置并查询场馆以获得相关信息,如下所示:

结果为我们提供了邻近位置及其类别。数据可以整理为一个数据帧:

数据预处理

数据可能有一些重复次数太少的类别。根据数据集的大小,设定一个截止频率(例如:最少出现 5 次),并去除其他异常地点。然后,我们可以得到如下所示的数据帧:

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

**图二。**包含位置和查询的邻域数据的初始数据帧|作者的图像

我们的目标是为我们的餐厅主题确定最佳场地,并以此为基础筛选出我们城市的类似区域。最后的预处理步骤是为每个地点找到前 10 个最常见的地点。

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

**图 3。**入围网点附近的公共场馆|图片作者

聚集场馆

入围后,一种方法是只选择最常见的场馆。另一方面,聚类方法可以为我们提供一个地区的共同主题的答案。使用 K-Means 聚类提供了这些途径。

对于当前场景,最佳位置与其他特许经营位置的比较如下:

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

**表 1。**最佳表演地点和普通小吃店的场馆主题对比

两个城市都有相似的顶级场馆,唯一的区别参数是顶级场馆附近的人口密度较高。

本地相似集群

最后一项任务是查询所选城市中的类似位置。使用 Foursquare API,查询以上场馆,可以入围最佳位置。根据聚类,可行的位置必须靠近其他类似的餐厅,尤其是墨西哥的场馆。

关于地点的最终决定还必须考虑避免新的特许店靠近现有的 Chipotle 地点。

使用该图,有 3 个位置应该避免,留下两个区域有相似的场地:城市的西部和南部(市中心)部分。

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

**图 4。**布鲁明顿墨西哥餐馆的位置(绿色)和墨西哥小吃店的位置(红色)|图片由作者提供

商业决策

根据查询,我们比较这两个地区,以最终确定餐馆可以在哪里开业。最后要考虑的是社区的安全和价格。

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

**图五。**西部的位置更安全,同样昂贵|作者图片

结论

考虑到以下因素,城市西部似乎是最佳选择:

  • 南部有一大群餐馆,竞争会很激烈。
  • 除此之外,市中心区(南部)附近有许多餐馆,竞争非常激烈。
  • 另一方面,在相对安全的西部地区,餐馆都很远。
  • 此外,该地区是一个很好的匹配,因为其他机构在价格和目标人群方面与 Chipotle 相似。

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

图 6。布卢明顿所有餐馆的位置。突出显示的区域是建议打开下一个系列的地方|作者图片

这是对地理位置的预可行性可行性检查,最终位置可以根据该地区的实际土地可用性、价格和其他因素来决定。

非常感谢您的阅读!我希望听到您的反馈,如果您有任何疑问,我会尽快回复。

使用 git 子模块在 docker 映像中安装一个私有的定制 python 包

原文:https://towardsdatascience.com/use-git-submodules-to-install-a-private-custom-python-package-in-a-docker-image-dd6b89b1ee7a?source=collection_archive---------8-----------------------

这是一个复杂的题目,但我发誓并不难

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

这条蟒蛇已经包装好了,可以装船了!(图片由世界光谱像素上拍摄)

哇,这个标题包含了很多术语!简单地说,这篇文章为您提供了最好的方式,让您可以私下轻松地分享您的 Python 代码,甚至可以在 docker 容器中运行它!最终,您将能够分发随处运行、易于维护和更新的私有包。我们来编码吧!

准备

您已经创建了一个 Python 脚本,其中包含了您想要与其他人共享的各种方便的函数。对于如何实现这一点,您有两种选择:

  1. 将您的代码打包并在 PyPi 上公开发布,详见本文 。这意味着任何人都可以通过调用pip install *yourpackage* 来安装这个包,就像熊猫一样
  2. 将你的代码打包并私下分发 如本文 所述。这意味着只有某些人能够安装这个软件包,比如你公司的同事。

我们选择第二个选项,确保我们的代码保持私有。我们将基于第二个选项中的文章,因此请务必先阅读它。阅读完之后,您就有了一个 Python 包,您可以从您的 g it 存储库中 pip 安装它。

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

一个专为你准备的私人 Python 包!(图片由像素像素上拍摄)

问题是

如果你遵循了本文 中的说明,你的 git repo 中有一个包,你可以像pip install git+https://github.com/mike-huls/toolbox.git一样安装它。在这个例子中,我们将想象我们正在创建一个 Python 项目,它使用了本文中的工具箱包。

我们希望在 docker 容器中运行我们的项目。为了构建 Docker 映像,我们必须首先将源代码复制到映像中,然后安装我们使用的所有软件包。这是通过提供我们使用的所有包的列表来完成的。您可以使用pip freeze > requirements.txt生成这个列表。生成的 requirements.txt 将包含我们所有包的名称和版本。

问题是即使是我们私装的包也是按名称和版本列出的。这导致 pip 在 PyPi 上搜索工具箱,但是它找不到这个包,因为我们已经从我们的 Git repo 中私下安装了它。我们也不能提供我们的git+[GIT_REPO_URL],因为我们的 Docker 映像没有登录 git 的凭证。有一种方法可以使用 ssh 密钥来解决这个问题,但在我看来这很难管理;有一个简单得多的选项,可以让您的同事更容易地获得代码,而不必麻烦地生成或分发 ssh 密钥。

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

pip 试图在公共 PyPi 上找到我们的私有包(图片由 Andrea Piacquadio 在 Pexels 上提供)

解决方案

我们将使用 git 子模块将包拉到我们的项目目录中,安装它,然后修改我们的 Docker 文件,将包安装到我们的 Docker 映像中。方法如下:

1 添加子模块

转到您的项目根目录,然后:

git submodule add [https://github.com/mike-huls/toolbox](https://github.com/mike-huls/toolbox) _submodules/toolbox

(为了便于说明,我在这里使用了一个公共存储库) 这将在您的根目录下创建一个名为 _submodules 的文件夹,其中包含另一个包含您的 Python 包的文件夹。

2 安装软件包

只需执行
pip install _submodules/toolbox来安装软件包

3 创建 Dockerfile 文件

一旦我们想要创建 Docker 图像,只需重复前面的两个步骤;将子模块文件夹复制到映像中,然后再次运行安装。

**FROM** python:3.8
WORKDIR **/**app

**#** Install regular packages
**COPY** requirements.txt .
RUN pip install **-**r requirements.txt

**#** Install submodule packages
**COPY** _submodules**/**toolbox _submodules**/**toolbox
RUN pip install _submodules**/**toolbox*--upgrade*

**#** **copy** **source** code
**COPY** .**/** .

**#** command **to** run **on** container **start**
CMD [ "python", "./app.py"]

就是这样!现在你有了一个拥有“真相之源”的中央储存库。您可以在这里提交问题、添加功能请求、协作和推送更新,非常简单。其他优势包括:

可用性:
用户可以继续使用pip install git+REPO_URL;这不足以建立形象。你的程序员可以用一种非常简单的方式继续安装你的包。然后,当代码准备好构建到映像中时,只需拉出子模块并将其包含在 docker 文件中,就可以非常容易地包含该包。

一个干净的 repo
除此之外,git 将为您跟踪您的子模块。调用`pip freeze > requirements.txt``并注意到工具箱没有列出。这是因为 git 知道它是一个子模块。它也被忽略了,这样你就不会“污染”你的项目报告。

轻松更新
更新我们项目中使用的软件包非常简单;只需执行:

git submodule update --remote --merge
pip install _submodules/toolbox --upgrade

这将首先把所有新代码拉到包文件夹中,然后升级包。别忘了用一个虚拟环境

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

用定制的、私人的 Python 包运送那些容器(图片由 Cameron VentiUnsplash 上提供)

结论

定制的私有 Python 包易于安装、维护、更新和分发。使用这个简单的方法将它们构建成 Docker 图像会使它们更加令人惊叹。

我希望我在这篇文章中的解释是清楚的。如果你有建议/澄清,请评论,以便我可以改进这篇文章。同时,查看我的其他关于各种编程相关主题的文章。编码快乐!

—迈克

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

使用谷歌云平台发送电子邮件通知

原文:https://towardsdatascience.com/use-google-cloud-platform-for-sending-email-notifications-9c518f5a57a5?source=collection_archive---------10-----------------------

使用 Postfix、Mailjet 和 DNS 记录配置您自己的每日股票摘要报告

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

布雷特·乔丹在 Unsplash 上的照片

如果你曾经想过找到一种方法,可以轻松地不断了解你个人投资的当前结果,这篇文章就是为你准备的。

在以前的帖子中,我介绍了一种使用谷歌服务管理个人投资的方法,如谷歌资产负债表和计算引擎(来自谷歌云平台)。我鼓励您也访问这些帖子,因为您可以浏览主要实现文件(但也包括虚拟机目录)所需的步骤,我们将在这里使用这些文件作为我们解决方案的输入。

https://levelup.gitconnected.com/python-and-linux-i-o-redirection-for-managing-investments-ef009be30f39

下面,我列出了我们在这篇文章中将要经历的主要步骤:

  1. 文件输入和存储它的实例(1)
  2. 用于邮件服务本身的实例(2)
  3. Mailjet 和电子邮件真实性

请记住,我使用谷歌云平台作为选择的云服务提供商,但如果你愿意,你应该可以使用其他服务。

1.文件输入和存储它的实例(1)

如上所述,这里将要使用的文件输入是我之前分享的其他帖子中提到的解决方案的结果。为了理解当前的文章流,阅读这些文章并不是强制性的。然而,为了从整体上实现解决方案,您还应该遵循其中涵盖的所有步骤。

文件本身非常简单:

实例 1 中的每日结果示例文本文件

导入要突出显示的内容:

  • “lucasnunesfe9”是实例用户;
  • “实例-示例”是正在使用的实例;
  • 该文件的路径是:"。/python script/log/result _ output . py "

除此之外,这个文件的内容是什么?

这是两列,代表一个表。第一列“Ticker”是在巴西股票市场上交易的本例投资组合公司的每一张股票(用作示例),第二列“Result”是在给定时刻每张股票的余额。更具体地说,该文件设置为从上午 10 点到下午 5 点(UTC-3)每 15 分钟生成一次,使用 cron 作业。

好了,这应该足以让你熟悉我们将在本文中使用的输入。

2.用于邮件服务本身的实例(2)

你可以考虑从谷歌云平台实例发送电子邮件的多种方式。在我的案例中,我选择了 Mailjet 服务,因为:

  • 从构建和维护 SMTP 中继服务器的角度来看,我需要选择一些第三方电子邮件服务来避免这种开销;
  • 从选择哪个第三方电子邮件服务选项的角度来看,主要是因为在撰写本文时,它提供了相当数量的每月免费发送的电子邮件(6,000 封),并且如果需要,它有一个很好的界面用于一些配置和活动指标分析。此外,它的部署过程相当直截了当

请使用后面的链接来浏览部署它的非常详细的步骤,我没有理由在这里粘贴它们。我会确保在整篇文章中突出可能的棘手部分。

SSH 文件输入实例

由于这个项目考虑了两个实例,所以需要确保这两个实例可以相互访问。更具体地说,应该允许前面提到的第二个实例连接到第一个实例。

请看下图:

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

实例 1 和实例 2 通信图

这是必需的,因为我们通过部署了 Mailjet 服务的实例(实例 2)发送电子邮件通知内容(输入文件,在实例 1 中可用)。

防火墙规则

您可能会注意到,在上图中,我还包括了“VPC 网络”标签。这是相关的,因为默认情况下,2 个实例所属的 GCP VPC 网络拥有一些防火墙显式规则,这些规则允许实例之间通过 SSH 进行通信(更具体地说,“default-allow-internal”和“default-allow-SSH”-确保它们都已设置并应用于实例,并且没有排除实例 IP 的 IP 范围过滤器)。

除了上面提到的默认防火墙规则之外,还有一个防火墙规则需要额外设置:

  • 流量类型:出口
  • 协议:TCP
  • 端口:2525(Mail Jet 服务的一部分,逐步部署)

发送电子邮件

您应该在实例 2 中设置一个 cron 作业,理想情况下,在实例 1 中设置的最后一个文件输入更新之后运行(以便每天使用最后一个更新)。

我将 cron 作业输入拆分如下,以便单独识别每个部分:

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

Cron 作业语法分解

这就是发送电子邮件作为每日股票结果通知的目的。

3.Mailjet 和电子邮件真实性

在遵循 Mailjet 的服务部署流程时,系统会指示您配置您的电子邮件发件人地址。只要选择流程中的这一步,您就可以通过访问此链接轻松进行配置(向下滚动页面,直到出现下图):

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

Mailjet 片段

如果已经完成了这一步,那么只需要等待 Instance 2 cron 作业运行。当它运行时,您将在几秒钟内收到电子邮件通知:

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

电子邮件通知片段

好了,成功了!但是,有没有什么引起你的注意?这个橙色的消息框肯定不是理想的。这是什么意思?

在这个例子中,我使用我的 Gmail 帐户发送电子邮件通知。正如你所注意到的,据说“邮件声称是从你的账户发出的,但 Gmail 无法核实实际来源”。换句话说…不可能确保这封邮件是由我在 Mailjet 中列为授权发件人的电子邮件地址发送的。这就是当涉及到 DNS(域名服务器)记录配置。

DNS 记录是一堆信息(简要查看),在处理域名和主机名时可能非常重要。特别是在我们的例子中,我们特别感兴趣的是 TXT 记录(可以用于您的邮件域之外的源的文本信息,在这个例子中,用于 Mailjet),称为 SPF(发件人策略框架)。

在其他也可以用于安全措施的 TXT 记录中,如 DKIM 和 DMARC,SPF 专门用于指定允许为您的域发送电子邮件的邮件服务器。您可以通过配置您的域的 DNS 记录来做到这一点。

问题是免费的网络邮件服务,如 Gmail(我的例子),还有其他如雅虎或 Outlook,不允许我们配置他们的 DNS 记录。出于这个原因,你应该使用一个域名托管服务(GoDaddy,Bluehost,DreamHost,仅举几个例子),它通常允许你编辑它的 DNS 记录。

因此,这一步将取决于你选择哪个域名托管服务,但你应该找到它的 DNS 管理页面,在那里你将把 Mailjet 的信息添加到你的域名 DNS 记录中。

通过更新 Mailjet 中的邮件发送者列表和 cron 作业的邮件发送者部分,我等待 cron 作业再次运行,以检查橙色消息框是否已经消失:

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

DNS 配置后的电子邮件通知片段

略有不同,对吧?但是,这对于确保您的电子邮件通知不会被标记为垃圾邮件(从安全角度来看是正确的)非常重要!

结论

通过上图概括你所做的事情:

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

总图

你已经设法每天将你的股票结果通知到你的电子邮件中,并确保你的电子邮件客户端不会将其标记为垃圾邮件。

这一过程为您提供了一个基础,您可以根据自己的情况考虑不同的需求和条件,在此基础上进行调整。

是的,电子邮件的正文设计必须改进!

注来自《走向数据科学》的编辑: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

使用 ipywidgets 和 matplotlib 可视化噪声分解:这是毕达哥拉斯的

原文:https://towardsdatascience.com/use-ipywidgets-and-matplotlib-to-visualize-noise-decomposition-in-3d-this-is-pythagorean-371ac9769aea?source=collection_archive---------31-----------------------

使用 3D 向量来帮助你的大脑。

自本月(4 月 22 日)起,Medium 决定你的作品必须拥有至少 100 名追随者才能获得奖励。 如果你喜欢这篇文章,只要你按下那个“跟随”按钮 :)很多欢呼,我希望你喜欢这篇文章!

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

图片作者。

众所周知,独立噪声源的总噪声方差是方差之和。因此,对于方差为σi 的 3 个独立噪声源,我们得到:

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

因此,总噪声标准偏差为:

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

这个方程可以简单地比作坐标向量(X,Y,Z)的通常欧几里得距离,其长度为:

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

看到这里的模式了吗?

这意味着,我们可以将具有独立标准偏差(σ₁、σ₂、σ₃)的“噪声矢量”表示为具有坐标(X=σ₁、Y=σ₂、Z=σ₃)的空间中的点:总标准偏差则由该矢量的范数(或欧几里德距离)给出。

我们的大脑习惯于将一个和分解成一组互相相加的项(x+y+z = total),但它真的不擅长使用“平方”分解(d = x +y +z)来分解。使用我们的大脑更习惯看到的 3D 向量表示,可以帮助我们更好地理解总噪声来自“哪里”:它主要来自σ₁吗?一点σ₂?没有σ₃?

在这篇文章中,我们将看到如何快速构建一个交互式可视化工具来表示噪声源及其对总噪声的影响,使用 ipywidgets 来实现交互体验,以及 matplotlib 的 3D 绘图功能。

Python 实现

为了可视化我们的噪声分解,我们将使用:
—“matplotlib”及其用于绘图的 3D 工具包
—“ipywidgets”来创建滑块和回调以更新绘图

我们将创建 3 个滑块来控制每个标准偏差的值,这类似于 3D 噪声空间中总噪声的(X,Y,Z)坐标。

我们首先创建 3 个浮动滑块来设置我们的独立噪声分量,一个标签来显示总标准偏差,一个“输出”来保存我们的 matplotlib 数字/ax。然后,我们将所有东西一起装入一个“HBox”中。注意创建子情节时的“投影=3d”参数:这是我们告诉 matplotlib 我们想要在 3d 中工作的方式。

现在,在回到` init '构造函数方法之前,我们将添加一些有用的方法。首先,我们创建一种方法来检索每个标准差分量值,并使用众所周知的等式σtot = √(σ₁ +σ₂ +σ₃来计算总标准差。

现在,我们使用 matplotlib 的“颤动”函数来绘制一组向量,以显示每个噪声分量以及总噪声。

最后,一个简单的“repr__”方法可以轻松地显示我们的滑块和图形输出:

现在回到“init”方法,我们定义了一个回调函数,它将用于在任何滑块的每次变化时更新标签和颤动图。然后我们在每个滑块上注册这个回调:

最后,我们初始化箭筒,并添加轴标签和限制:

这再容易不过了

我们现在可以创建一个实例,并开始试验:

瞧!

然后,您可以移动每个浮动滑块来设置每个标准差的值。该图会相应地更新每个向量的长度,并显示总标准偏差,这也表示 3D 向量的长度。

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

在我让你走之前,请注意:

  • 尝试更改主向量的颜色,以便更好地区分独立向量和分量向量。
  • 尝试使用%matplotlib qt获得更好的图形性能

完整代码

使用机器学习来检测数据集中的错误

原文:https://towardsdatascience.com/use-machine-learning-to-detect-errors-in-a-dataset-2028ffdf2aa1?source=collection_archive---------29-----------------------

如何使用泛化语言大海捞针

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

雷诺·莱蒂安在 Unsplash 上的照片

结构化数据集中损坏的数据值比您想象的要常见得多。早期检测这些错误对于下游分析任务的执行至关重要。然而,手动检查每个数据点既不高效也不可能。

这个故事利用了泛化树和泛化语言的概念,并提出了一种聚合不同语言的结果来发现表格数据集中的格式错误的方法。如果你需要泛化树和语言的详细介绍,你可以浏览下面的故事。

简而言之,由泛化树导出的泛化语言将原始值泛化成模式。例如,让我们考虑下图中给出的一般化树。

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

作者图片

从那棵树,我们可以得到一种语言,如果x不是一个符号,它将每个变量x转换成一个值\A。这种语言将把像03.17.2019这样的原始日期值转换成模式\A{2}.\A{2}.\A{4}

沿着这个思路,在 《自动检测:表中数据驱动的错误检测 、黄志鹏和叶烨中,他使用了一种泛化语言来缓解检测错误时的稀疏性问题。正如我们将在后面看到的,不同的语言对不同类型的错误是敏感的。因此,问题陈述可以概括为一个约束优化难题。

我们如何选择一组适当的泛化语言,由一个特定的泛化树归纳,以检测尽可能多的错误,受内存预算和精度值?

根据这一定义,我们得出以下挑战:

  • 如何创建验证数据集来评估每种泛化语言
  • 如何设置阈值θ,低于该阈值时,我们的分数表示样本错误
  • 如何聚合选择不同泛化语言所导致的结果

学习率是为那些对 AI 和 MLOps 的世界感到好奇的人准备的时事通讯。你会在每周五收到我关于最新人工智能新闻和文章的更新和想法。在这里订阅!

生成验证数据的远程监督

给定一种泛化语言L,我们必须有一种方法来量化它在检测错误时的精度。例如,给定一个表语料库C(即,一组用作训练数据的许多表),如果我们将一个值v归纳为一个模式p₁ = L(v),并且发现它与由C中一个表的同一列中的不同值u导出的另一个模式p₂ = L(u)不兼容,我们应该能够判断这是正确的预测还是误报。

我们可以手动标记例子,并用它们来验证一种泛化语言的性能,但这通常太昂贵,而且扩展性不好。为了克服这个问题,我们可以使用一种叫做的远程监控技术。因此,为了创建一个将验证泛化语言的数据集,我们从我们的表语料库C中取出两个干净的列,我们将其标记为C₁C₂。然后,我们对来自C₁的值v进行采样,并将其与C₂的副本合并,产生一个新的“脏”列C₂'。这是因为v很可能与C₂中的其他值不兼容。

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

由于日期格式不同,C₁的红色值与 C₂的其他值不兼容。因此,C₂’现在是一个新的,由作者生成的*“肮脏”专栏—* 图像

接下来,我们可以使用C₂中的任意值u和我们合并的值v:(u,v,-)符号表示不兼容的对,来创建否定验证示例(即不兼容值对)。同样,我们可以创建兼容值对:C₂中任意一个u,t(u,t,+)这样工作,我们有一组用 **T¯** 表示的不相容对和一组用 **T⁺** 表示的相容对。这两个集合的联合构成了验证集合 **T** 。这组数据并不完美,但我们可以廉价地创建的大量数据往往会比那些根据少量手工标注的样本训练的模型更好。

在下面的部分中,我们使用具体的例子来更好地理解。

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

表 1: NPMI 使用三种不同的概括语言对 10 个例子进行评分——图片由作者提供

表 1 给出了如果我们使用三种一般化语言:L₁L₂L₃一般化五个正面(即兼容)和五个负面(即不兼容)的例子,我们得到的 NPMI 结果。NPMI 代表归一化的点态互信息,由下面的公式给出。

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

简而言之,计算两个值在同一列中共存的概率,超过在一列中遇到值vu的概率的乘积。现在,我们应该定义一个阈值θ,低于该阈值的 NPMI 分数表示错误。

阈值定义

现在让我们考虑表 1 中的语言L₁。如果我们想要计算它的精度分数,我们应该将正确分类的错误的数量除以它识别为错误的所有示例的数量。

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

因此,第一步是定义一个阈值,低于该阈值的示例被认为是损坏的。例如,让我们设置这个阈值θ = -0.4。从T⁺开始,第三个示例被归类为错误,从开始,第六、第八和第九个示例被视为无效。因此,我们可以计算精度为p = 3/4 = 0.75。问题是θ = -0.3-0.2会产生相同的结果。我们应该有办法唯一确定θ。为此,我们定义以下公式。

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

有了这个,我们可以为θ设置一个唯一的值,为固定的精度值P。因此,在上面的例子中,为了达到精度p = 0.75,我们设置了θ = 0.5。这是因为任何小于0.5的值在精度方面表现较差,而任何大于0.40.3的值违反了第二个约束。

以这种方式,我们可以确定哪些例子应该被标记为错误,给定它们的 NPMI 分数。然而,为了达到更好的覆盖率,我们应该选择一套泛化语言,因为每个人对不同类别的错误都很敏感。因此,下一步是要看看我们如何聚集由我们的语言选择引发的预测。

结果汇总

对于本节,让我们定义两种语言。第一个定义如下。

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

第二个的公式如下。

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

让我们考虑两个示例值:03.17.201903-17-2019;两个日期使用不同的模式。使用第一种语言,我们相应地将两个例子概括为\A{2}.\A{2}.\A{4}\A{2}-\A{2}-\A{4}。对于第二种语言,我们得到同样的模式:\D{2}\S\D{2}\S\D{4}。正如我们所看到的,用语言L₂概括不会发现格式错误。因此,一个简单的获得平均 NPMI 分数的方法是行不通的,因为使用第二个推广计算的结果应该被完全忽略。

然而,考虑到这两种语言的互补性,我们应该选择这两种语言,因为L₁不会发现第一个示例值和像03.MR.2020这样的模式之间的差异。为了汇总结果,我们只需要一种语言就可以对它产生的分数有信心。因此,我们选择最低的 NPMI 分数。直觉上,因为每种语言对不同类型的错误敏感,如果一种语言对一个值v产生非常低的兼容性得分,我们信任它,因为它真的很自信。**因此,汇总不同泛化语言结果的一种方法是联合它们的预测。**例如,使用表 1,如果我们联合L₁L₃预测的误差,我们检测到每个误差加上由L₁产生的一个假阳性。

下一节将介绍一种贪婪算法,根据内存预算和精度值来选择由特定泛化树导出的最终泛化语言集。然后,我们可以使用这个集合来概括我们的值,计算 NPMI 分数,并根据某个阈值来检测错误。

自动检测的贪婪算法

假设我们有一组三种候选泛化语言。每种语言都在内存中占据一个特定的空间,该空间与一个阈值θ相关联,并且根据使用该阈值做出的预测,还会有一个精度分数。表 2 总结了所有这些。第一组包含每种语言在中指示为错误的示例,第二组包含每种语言在T⁺中预测为错误的示例。

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

表 2:一组候选的泛化语言及其度量——作者图片

我们的目标是根据内存预算选择一个子集,其中包括我们拥有最佳错误覆盖率的语言M = 500MB。下面的算法返回这个集合。

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

让我们一步一步来。作为输入,我们有一个集合L,它是候选泛化语言的集合。我们还初始化一个空集G和一个变量来计算使用的内存(即curr_size = 0)。首先,从候选集L中,我们只保留那些其内存占用在我们限制范围内的泛化语言M。因此,从表 2 中可以看出,所有语言都在500MB的限制范围内。接下来,我们寻找能提供最大增量收益的语言。这由下面的公式给出。

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

我们增加curr_size变量,并从我们保存的语言集中减去选择的语言。根据内存预算,我们不断迭代,直到选择了所有可能的语言。然后,我们也选择最好的单个语言,并将其与集合G的错误覆盖率进行比较。最后,我们返回检测到更多错误的内容。

为了使用上面的例子将其接地,首先,我们选择L₁,因为它具有最大的增量增益,并将其附加到 set G

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

下一轮,我们只能选择L₂,因为选择L₃会违反我们的记忆限制(200 + 400 > 500)。然后,我们选择单一的最佳语言,即L₃,因为它具有最佳的错误覆盖率。最后,我们将集合G ( 5错误)的错误覆盖率与语言L₃ ( 4错误)的覆盖率进行比较,并返回集合,因为它检测到更多的错误。

有了最佳的泛化语言集,我们就可以基于它们来泛化我们的值,计算 NPMI 分数,并预测可能的错误。

结论

在这个故事中,我们介绍了 【自动检测:表中数据驱动的错误检测】【黄志鹏】和何,以及他们自动检测结构化数据集中格式错误的方法。

我们提出了一种使用远程监督创建验证集的方法,一种为每种语言唯一确定阈值θ的方法,以及一种从候选集中找到泛化语言最佳组合的贪婪算法。

关于作者

我叫迪米特里斯·波罗普洛斯,我是一名为阿里克托工作的机器学习工程师。我曾为欧洲委员会、欧盟统计局、国际货币基金组织、欧洲央行、经合组织和宜家等主要客户设计和实施过人工智能和软件解决方案。

如果你有兴趣阅读更多关于机器学习、深度学习、数据科学和数据运算的帖子,请在 Twitter 上关注我的 MediumLinkedIn@james2pl 。此外,请访问我的网站上的资源页面,这里有很多好书和顶级课程,开始构建您自己的数据科学课程吧!

面向开源可复制机器学习的 MLflow 和 DVC

原文:https://towardsdatascience.com/use-mlflow-and-dvc-for-open-source-reproducible-machine-learning-2ab8c0678a94?source=collection_archive---------4-----------------------

DVCMLflow 是两个被广泛采用的开源项目,各有所长。DVC 擅长数据版本控制,MLflow 是多种工具的结合体,但主要用于实验跟踪和工件记录功能。这两个工具都是开源的,但这并不意味着您可以轻松地拥有一个使用它们的开源项目。您无法将使用 DVC 版本化的数据与开放世界共享,也无法将为您生成的实验页面 MLflow 显示给所有人-这种情况已不复存在。

DAGsHub 已经与 DVC 整合,你可以在我之前讨论 DVC 和 DAGsHub 的文章中了解更多。它现在也与 MLflow 集成在一起。这意味着 MLflow 用户现在可以在一致的环境中管理 MLflow 实验及其代码和数据集。

如果您只对集成细节感兴趣,您可以滚动到下面关于 MLflow with DAGsHub 的部分。否则,请继续阅读,以获得 MLflow 的概述、MLflow 的一些优势和差距,以及关于 DAGsHub 和 MLflow 集成的详细信息

什么是 MLflow

MLflow 是一个管理 ML 生命周期的开源平台,包括实验、再现性、部署和中央模型注册

GitHub 上每天约有 60,000 次下载,8,000 次下载——ml flow 是一款开源工具,最初由 Databricks 推出,自 2018 年推出以来广受欢迎。它帮助数据科学家管理机器学习生命周期的多个阶段。其中一个阶段是“实验跟踪”——这是一个公认的术语,用来记录模型每次运行时得到的结果的变化。MLflow 提供的收集这些实验的解决方案被称为“MLflow Tracking”。其他工具也提供了很好的功能,我推荐阅读这个实验跟踪工具对比来更深入地了解它们之间的区别。

MLflow 有什么用途,为什么它是实验跟踪的首选解决方案

它有最大的社区

一个大型的机器学习从业者和公司社区已经采用 MLflow 作为解决方案。这通常是一个强有力的指标,表明某个工具正在做正确的事情。一个大的社区意味着更多的教程,更多的在线问答,或者针对用户遇到的常见问题在 GitHub 上的公开问题。MLflow 已经有 290 个贡献者,据报道有 200 多家公司在他们的工作流程中使用它,这对这类项目来说意义重大。这提供了一种安全感,MLflow 将在未来许多年继续开发和使用

简单且开源

开源工具是个人、研究人员和非营利组织的必需品。这为他们提供了免费的解决方案、社区支持和最大的灵活性。MLflow 无疑是当前实现这一承诺的先锋之一。跟踪 API 是精心设计的,具有全面而简单的客户端库,提供简单的手动日志记录功能,如:

# Start a run
mlflow.start_run()# Log an hyper-param
mlflow.log_param()# Log a metric
mlflow.log_metric()

它还为大多数常见的高级机器学习框架提供自动日志记录功能,包括 Scikit-learn、Tensorflow、Keras、XGBoost、FastAI、PyTorch 等。
以 Scikit-learn 为例:

# Automatic logging with mlflow
mlflow.sklearn.autolog()

设置起来相对容易——开始跟踪实验所需要的只是安装一个客户端库(即 python 库)并在代码中使用日志 API 调用。

要预览实验或比较结果,您需要通过在命令提示符下运行以下命令来启动一个基于 web 的本地用户界面:

# Start the mlflow web ui
mlflow ui

你可以在[http://localhost:5000](http://localhost:5000.) 的浏览器中找到它。

实时跟踪

“实时”意味着您可以在代码运行时跟踪性能——或任何指标,这在您想要观察损失时特别有用,例如,如果没有收敛,就在中间停止训练。实时日志记录是一把双刃剑,因为它不能保证再现性。这将实验跟踪工具的领域一分为二。有些人——比如 ml flow——将跑步训练的开始视为基线。其他人——像DVC——在培训结束时将存储库的状态视为需要签入和访问的时间点。

MLflow 缺少什么使其成为显而易见的选择

设置远程服务器很难

为一个小团队或开源项目设置一个持久的远程服务器在技术上是复杂的,并且可能是昂贵的。

首先,你需要建立一个在线机器,可以被外界访问,最好有一个可读的、持久的 URL。

其次,由于您不希望任何人能够查看或记录您的服务器上的实验,您需要管理访问控制。您可以通过支持身份验证的中间服务器来运行您的调用,然后将通信传递给服务器本身。如果您希望能够添加用户、删除用户并提供对项目的公共访问,您需要围绕它构建一个完整的系统。不幸的是,对许多人来说,这些复杂性将是交易的破坏者。如果你最终设法解决了这些问题,你仍然需要向云提供商支付运行机器的费用,你可能不会为你正在写的论文或你的开源人脸检测项目这样做。这就是为什么 MLflow 实验可能永远不会走出您的本地机器或内部网络。

用户界面缺乏灵活性

Mlflow 的用户界面有一个主菜单,您可以在其中选择和切换不同的实验。“实验”是一组“运行”,用户可以将其定义为一个层次结构。您可以决定是为每个项目创建一个实验,还是为同一个项目创建多个实验。您可以选择多个运行并在它们之间进行比较,但不能在不同实验的运行之间进行比较。

对于每次运行,您可以选择您记录的图形,并在单独的页面中显示它们,但是您不能在单个摘要页面中一次性预览它们。

缺乏背景和连通性

假设您已经安装了 MLflow 服务器,并使用它为多个项目记录实验。现在,您想与同事共享项目的状态。您需要给她发送一个指向存储库的链接,一个指向 MLflow 服务器的链接,并指定这个特定项目的实验内容。另一种常见的情况是,当您想要将您的研究结果发布到工作场所之外的社区时。您需要找到一种方法来应用如前所述的凭证管理,以便只有他们可以查看项目。此外,您的 MLflow UI 作为整个项目的一部分是不可发现的。您可以在存储库Readme.md文件中放置一个链接,但是前面提到的访问问题仍然适用。

带 DAGsHub 的 MLflow

连接到项目的其余部分

随着 MLflow tracking now 与 DAGsHub 的集成,您最终可以以一种有意义的方式管理 MLflow 实验。项目的所有组件现在都已连接。换句话说,您的存储库主页现在将显示您的代码、您的数据管道和您的所有 MLflow 实验。

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

按作者

您可以比较实验,看到一个有趣的实验,并轻松地一键查看生成实验的代码和数据集。正如在谈论 MLflow 的用户界面时提到的,比较不同实验的运行需要打开两个不同的窗口。现在情况不再是这样了。现在可以比较不同实验的运行,当然,可以在一个地方看到所有的度量图。

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

按作者

最小设置

首先,你需要在注册,创建一个存储库,并向其中推送代码。然后,在您的存储库主页上,您将获得 MLflow 的跟踪 URI。

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

按作者

假设您已经熟悉如何使用 MLflow 的,那么您现在要做的就是将这个 URI 设置为您的跟踪 URI,或者使用环境变量MLFLOW_TRACKING_URI或者在您的代码中添加以下代码行:

# Set an mlflow remote server programatically 
mlflow.set_tracking_uri("https://dagshub.com/<DAGsHub-user-name>/<repository-name>.mlflow")

如果您想要记录参数和指标,您需要拥有对存储库的写权限——也就是成为贡献者。MLflow 客户端支持基本认证,为了指定您的凭证,您需要使用环境变量MLFLOW_TRACKING_USERNAMEMLFLOW_TRACKING_PASSWORD

就是这样,你可以记录你的实验,并像这个例子项目一样与公众分享。如果你的知识库是私有的,那么实验当然也是私有的。

分发您的项目并与任何人共同创作

我们在 DAGsHub 的任务之一是降低开源机器学习生命周期工具的准入门槛。我们在 DVC 做到了这一点,现在我们正在与 MLflow 合作。我们让用户决定如何利用他们喜欢的每个方面。我认为,为社区提供一个专业管理工作的解决方案,而不需要 DevOps 知识,将使开源、可复制的数据科学不仅仅是一个幻想。

摘要

我们已经看到 MLflow 被广泛采用,它是开源的,并且简单明了,但是如果没有任何 DevOps 知识,免费使用它会有一些困难。现在,通过使用专用的 MLflow 远程服务器将 MLflow 连接到任何存储库,您可以从 DAGsHub 的实时日志记录中受益。这里有一个关于如何使用 MLflow 和 DAGsHub 的视频链接。如果您有任何问题,或者您希望我们支持更多 MLflow 功能,请随时通过我们的社区聊天联系我们。

机器学习在经济研究中的应用:文献告诉我们什么

原文:https://towardsdatascience.com/use-of-machine-learning-in-economic-research-what-the-literature-tells-us-28b473f26043?source=collection_archive---------5-----------------------

对过去四十年来发表在主要经济期刊上的 20 篇优秀文章的选择性综述。

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

克拉克·杨在 Unsplash 上的照片

M 机器学习主题在 20 世纪 80 年代开始大规模出现在经济文献中,当时主要概念如反向传播、递归神经网络(RNNs)和受限玻尔兹曼机器(RBM) 被发现,像计算机视觉这样的主题吸引了很多关注。在过去的几十年里,在四个主要的经济期刊上发表的关于机器学习的文章的频率增加的趋势是显而易见的(见下图)。

在这篇文章中,我分享了机器学习在经济学中应用的文献中的发现,并简要回顾了我认为在这一领域最有影响力的 20 篇文章。这是从经济期刊(基于文章影响力得分)中主观选择的论文,可能对计划深入这一令人兴奋的领域的应用研究人员或对人工智能溢出到其他领域感兴趣的任何人有用。

我确定了在经济文献中使用 ML 方法的四个主要领域:

  • 预测和预报
  • 情感分析和自然语言处理(NLP)
  • 图像处理和计算机视觉
  • 流程自动化和优化

最后,我参考了这位领先经济学家对未来的展望,并对经济学中的整个人工智能领域的发展方向做了一些评论。

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

经济学前 4 名期刊(QJE、计量经济学、AER、Restud)的 ML 文章,来源: Constellate。

将人工智能融入经济学的早期尝试

关于这个主题的第一篇文章是 1984 年美国经济评论(AER)的一篇文章,作者是 Cohen 和 Axelrod ,该文章展示了一个将信念更新为新体验的模型,该模型依赖于一个相当古老的人工智能程序来玩跳棋。作者表明,该模型的性能优于其他国家的最先进的模型。

在一项令人兴奋的研究中,亚瑟(AER,1991) 设计了一个参数化的学习自动机,一种“复制”人类行为的算法,并根据人类受试者对其进行校准。该论文的结论是,我们可以设计人工学习代理,并校准它们的“合理性”,以复制人类行为。

霍兰德和米勒(AER,1991) 研究了复杂适应性人工智能系统和经济主体的行为。如今,存在广泛的基于计算机的自适应算法来探索这种系统,包括分类器系统、遗传算法、神经网络和强化学习机制。

过程自动化

在任何领域中,ML 的理想用例是优化和过程自动化,从这个意义上讲,是节省劳动力成本和(或)提高生产率。例如, Fernald 和 Jones (AER,2014) 提出,人工智能将允许机器取代工人,这在某种程度上可能导致未来更高的增长。新的研究技术可能会让计算机和机器人取代劳动力,从而极大地影响生产和经济增长。

预测和预言

监督最大似然法已经在许多应用中用于预测,在那里它达到极好的性能。与其他一些统计方法相比,超参数调整、训练验证测试分割和改进的优化算法(如 ADAM )有助于实现更好的 ML 性能。

Kleinberg 等人(AER,2015)Kleinberg 等人(QJE,2017) 强调了使用机器学习技术改进预测如何能够产生巨大的政策影响。用这种方法可以解决许多问题。例如,在刑事司法系统中,法官必须决定是拘留还是释放被捕者。依赖于对被捕者犯罪概率的预测的决定可以得到 ML 的支持。

其他例子包括:(1)在教育中,预测哪个老师会有最大的增值;(2)在劳动力市场政策中,预测失业持续时间以帮助工人决定储蓄率和求职策略;(3)在监管方面,有针对性地进行卫生检查;(4)在社会政策方面,预测高风险青年,以便有针对性地进行干预;以及(5)在金融领域,贷款人识别潜在借款人的潜在信用价值。,2015) 。

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

照片由 Unsplash 上的 Clarisse Croset 拍摄

同样, Chalfin 等人(AER,2015) 证明了使用最大似然法提高工人生产率预测所带来的社会福利收益。他们在两个基本应用中说明了这种方法的价值——警察招聘决策和教师任期决策。

Bajari 等人(AER,2015) 回顾并应用几种流行的 ML 方法进行需求估算。他们表明,与标准线性回归或 logit 模型相比,这些方法可以产生更高的预测准确性。

还有许多其他的例子,在这些例子中,ML 被用来预测对政策决策很重要的变量。在国际经济学中,艾买提等(JIMF,2018) 利用序列岭回归对主要国际货币的汇率进行预测。这是一个为政策制定实施最大似然法的实际例子,因为他们得出结论,他们的最大似然法模型导致改进的预测和更低的均方根误差(RMSE)。

情感分析和自然语言处理

越来越多的带标签的训练数据集刺激研究人员在经济学的各种问题上使用情感分析。带有文本每个部分的标签的情感数据集(例如,1 =正面,0 =负面;1 : 25 是 1 最负,25 最正,等等。)帮助研究人员制作可以在自己的数据集中使用的分类器。

随着 2010 年代 NLP 和语言建模的巨大进步,一些优秀的论文出现在顶级期刊上。一些综述文章包括阿尔加巴等人(JES,2020) ,概述了在经济科学中使用文本、音频和视觉数据的语义分析方法。 Gentzkow 等人(JEL,2019) 纯粹关注文本数据,并审查适当的统计方法和对经济问题的各种应用。

在货币经济学中,汉森等人(QJE,2017) 利用计算语言学发现央行行长的沟通模式。文本数据的量化可以衡量央行行长声明的影响,并简化丰富的沟通措施的构建。 Hansen 和 McMahon (JIE,2016) 用类似的基于文本的方法研究同一主题。

NLP 技术可能有助于提高标准统计方法的准确性。例如,在企业融资中, Goberg 和 Maksimovic (RFS,2014) 改进了对金融约束(即企业获得融资的能力)的衡量。在预测不利经济冲击后的投资削减方面,基于文本的指标优于文献中使用的其他指标。

NLP 的商业经济学应用包括 Bandiera (JPE,2020) 使用广泛使用的 NLP 算法(潜在的狄利克雷分配— LDA)构建 CEO 行为指数。除了良好的性能,它还允许减少数据的高维度。

图像处理和计算机视觉

图像处理和图形数据处理文章常用各种卷积神经网络(CNN),并频繁使用大数据。许多数据集已经可以免费获得,研究人员可以为他们的应用程序使用预处理的数据或预训练的模型(为了完整性,这个过程被称为迁移学习)。

Donaldson 和 Storeygard (JEP,2016) 使用卫星数据(来自轨道的遥感数据)审查文章的文献。小卫星在地球上空一定距离飞行,收集照片图像和其他数据,这些数据可用于研究地球上的过程。例如, Henderson 等人(AER,2012) 使用卫星数据来衡量次国家和超国家地区的经济活动(GDP 增长),这在当前的衡量标准下是不可能的。

纳伊克等人(PNAS,2016) 使用街景的 360 度全景图像来预测美国五个城市的城市物理变化(街道的物理外观)的决定因素。纳伊克等人(AER,2016) 关注城镇的物理外观与其居民的行为和健康之间的实证联系。他们使用支持向量机从街道图像中量化城市外观。

我们要去哪里?

经济学中 AI 的研究向何处去,未来的研究有哪些方向?让我们从苏珊·艾希(斯坦福大学商学院)那里得到启发,她预测在不久的将来会有新的发明出现。

我在此引用了来自 Athey (2019) 的确切内容:

  1. 为预期任务(预测、分类和聚类,例如文本分析)采用现成的 ML 方法。
  2. 对预测方法的扩展和修改,以考虑公平性、可操作性和可解释性等因素。
  3. 开发基于机器学习的新计量经济学方法,旨在解决传统的社会科学评估任务。
  4. 利用现代数据设置,包括大面板数据集和具有许多小实验的环境,对因果效应的识别和估计策略的渐进进展。
  5. 更加强调模型的稳健性和其他辅助分析,以评估研究的可信度。
  6. 经验主义者大规模采用新方法。
  7. 生产力和测量研究的复兴和新路线。
  8. 设计和分析大型管理数据的新方法,包括合并这些来源和隐私保护方法。
  9. 跨学科研究的增加。
  10. 经济研究的组织、传播和资助的变化。
  11. 作为工程师的经济学家与公司、政府一起在数字环境中设计和实施政策。
  12. 与企业和政府合作,设计和实施数字实验,包括一次性的和持续的过程,包括多臂 bandit 实验算法。
  13. 研究开发可快速测量的高质量指标,以促进快速增量创新和实验。
  14. 在各级经济学教学中更多地使用数据分析;跨学科数据科学项目的增加。
  15. 人工智能和 ML 对经济影响的研究。

结论

我收录了 20 篇 A 级文章,展示了 ML 方法在经济学中的大量应用。在未来,我们可以期待在经济期刊上发表的文章快速增长,以及人工智能社区正在开发的新技术的实施。目前,最大似然法仍然是一种应用统计方法,但由于其独特的统计方法,它在许多情况下优于标准统计方法。特别是在预测方面,它在预测的准确性方面占主导地位。

我想提到的最后一篇论文是 Mullainathan 和 Spiess (JEP,2017) 对这个主题做了很好的介绍。

PS:你可以订阅我的 邮箱列表 每次我写新文章都会收到通知。如果你还不是中等会员,你可以在这里加入https://medium.com/@petrkorab/membership

参考文献的完整列表(按出现的顺序):

[1]迈克尔·d·科恩和罗伯特·阿克塞尔罗德,1984 : 应对复杂性:改变效用的适应性价值,《美国经济评论》,第 74 卷,第 1 期(1984 年 3 月),页 30-42。

[2 ] W. Brian Arthur,1991: 设计行为像人类代理人的经济代理人:有限理性的行为方法,《美国经济评论》,第 81 卷,第 2 期,论文与会议录。(1991 年 5 月),第 353-359 页。

[3]约翰·h·霍兰德和约翰·h·米勒,1991:经济理论中的人工适应性主体,《美国经济评论》,第 81 卷,第 2 期,论文与会议录。(1991 年 5 月),第 365-370 页。

[4] John G. Fernald 和 Charles I. Jones,2014:美国经济增长的未来,《美国经济评论》第 104 卷第 5 期,论文和会议录。(2014 年 5 月),第 44–49 页。

[5]乔恩·克莱因伯格、延斯·路德维希、森迪尔·穆莱纳坦和齐亚德·奥伯迈尔,2015:预测政策问题,《美国经济评论》,第 105 卷,第 5 期。,论文和会议录,第 491-495 页。

[6]乔恩·克莱因伯格,希马宾杜·拉卡拉朱,朱雷·莱斯科维奇,延斯·路德维希,森迪尔·穆莱纳坦,2017:人类决策与机器预测,《经济学季刊》,第 133 卷第 1 期,(2018 年 2 月),第 237–293 页。

[7]亚伦·查尔芬、柳文欢·达尼埃里、安德鲁·希利斯、祖宾·杰尔维、迈克尔·卢卡、延斯·路德维希和森迪尔·穆莱纳坦,2015:机器学习的生产率和人力资本选择,《美国经济评论》,第 106 卷第 5 期,(2016 年 5 月),第 124–27 页。

[8] Patrick Bajari,Denis Nekipelov,Stephen P. Ryan 和 Miaoyu Yang,2015: 需求估计的机器学习方法,《美国经济评论》,第 105 卷第 5 期,论文与会议录(2015 年 5 月),第 481–485 页。

[9] Christophe Amat,Tomasz Michalski,Gilles Stoltz,2018:简单机器学习方法的基本面和汇率可预测性,J 国际货币与金融杂志,第 88 卷,2018 年 11 月,第 1–24 页。

[10] Andres Algaba,David Ardia,Keven Bluteau,Samuel Borms,Kris Boudt,2020:计量经济学与情绪:方法和应用概述,经济调查杂志,第 34 卷,第 3 期,2020 年 7 月,第 512-547 页。

[11] Matthew Gentzkow,Bryan Kelly,和 Matt Taddy,2019:作为数据的文本,经济文献杂志,第 57 卷,第 3 期,第 535-574 页。

[12]Stephen Hansen Michael Mcmahon Andrea Prat,2018:Fomc 内部的透明度和审议:一种计算语言学方法,经济学季刊,第 133 卷第 2 期,2018 年 5 月,第 801–870 页。

[13] Gerard Hoberg,Vojislav Maksimovic,2017:重新定义金融约束:基于文本的分析,《金融研究评论》,第 28 卷第 5 期,2015 年 5 月,第 1312–1352 页。

[14] Oriana Bandiera,Andrea Prat,Stephen Hansen,Raffaella Sadun,2020: 政治经济学杂志,第 128 卷第 4 期,2020 年 4 月。

[15]戴夫·唐纳森和亚当·斯托里加德,2016:从上面看:卫星数据在经济学中的应用,《经济透视杂志》,第 30 卷第 4 期,第 171–198 页。

[16] J. Vernon Henderson,Adam Storeygard,David N. Weil,2012:从外层空间衡量经济增长,《美国经济评论》,第 102 卷第 2 期,第 994-1028 页。**

*[17] Nikhil 纳伊克、Scott Duke Kominers、Ramesh Raskar、Edward L. Glaeser 和 César A. Hidalgo,2017:计算机视觉揭示城市物理变化的预测器,*美国国家科学院学报,7 月 18 日,第 114 卷,第 29 期,第 7571-7576 页。

[18]尼基尔·纳伊克,拉梅什·拉斯卡尔,塞萨尔·a·伊达尔戈,2016:城市也是物质的:使用计算机视觉来衡量城市外观的质量和影响,《美国经济评论》,第 106 卷第 5 期,2016 年 5 月,第 128-32 页。

[19] Susan Athey,2019:机器学习对经济学的影响,载于:人工智能经济学:一个议程,芝加哥大学出版社,2019 年 5 月,第 507–547 页。

*[20] Sendhil Mullainathan 和 Jann Spiess,2017:机器学习:一种应用的计量经济学方法,*经济展望杂志,第 31 卷第 2 期,2017 年春季,第 87–106 页。

在 TensorFlow 服务中使用预先训练的 Huggingface 模型

原文:https://towardsdatascience.com/use-pre-trained-huggingface-models-in-tensorflow-serving-d2761f7e69f6?source=collection_archive---------15-----------------------

将数千个社区 NLP 模型投入生产

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

克里斯托夫·高尔在 Unsplash 上拍摄的照片

HuggingFace 简化了 NLP,只需几行代码,你就拥有了一个完整的管道,能够执行从情感分析到文本生成的任务。作为一个预训练模型的中心,加上它的开源框架 Transformers,我们过去做的许多艰苦工作都得到了简化。这使我们能够编写能够解决复杂的 NLP 任务的应用程序,但缺点是我们不知道幕后发生了什么。尽管拥抱脸变形金刚执行了这种惊人的简化,但我们可能希望从所有代码中提取一些抽象,并简单地使用许多可用的预训练模型中的一个。在这篇文章中,我们将学习如何使用 TensorFlow 服务中的许多预训练模型之一,这是一种将机器学习模型投入生产的流行服务。

我将使用这个 Distilbert 预训练模型进行情感分析,它将预测给定文本是正面还是负面的。不幸的是,Transformers 没有直接导出到 TensorFlow Serve 的功能,因此我们必须做一些工作来实现我们的目标。首先,我们需要安装 Tensorflow、Transformers 和 NumPy 库。

pip install transformers
pip install tensorflow
pip install numpy

在第一部分代码中,我们将从 Transformers 加载模型和标记器,然后以正确的格式将其保存在磁盘上,以便在 TensorFlow Serve 中使用。

from transformers import TFAutoModelForSequenceClassification
import tensorflow as tfMAX_SEQ_LEN = 100model = TFAutoModelForSequenceClassification.from_pretrained("distilbert-base-uncased-finetuned-sst-2-english")callable = tf.function(model.call)
concrete_function = callable.get_concrete_function([tf.TensorSpec([None, MAX_SEQ_LEN], tf.int32, name="input_ids"), tf.TensorSpec([None, MAX_SEQ_LEN], tf.int32, name="attention_mask")])model.save('saved_model/distilbert/1', signatures=concrete_function)

首先,我们用 TFAutoModelForSequenceClassification 加载模型。加载变形金刚模型的一个关键方面是选择正确的类。由于我们使用预训练模型进行情感分析,我们将使用 TensorFlow 的加载器(这就是为什么我们导入了 TF AutoModel 类)进行序列分类。如果你不确定加载什么类,只需检查模型卡或“在变形金刚中使用”页面上的“拥抱脸模型”信息,以确定使用哪个类。

在代码片段中,我们声明了一个签名函数,它是 TensorFlow Serve 所必需的。这个函数对于向 TF Serve 中的可服务模型声明我们的数据的输入形状是必要的,它由变量 MAX_SEQ_LEN 定义。在这种情况下,我已经定义了模型将接受两个输入,两个大小为 200 的列表,分别用于 input_ids(我们从 tokenizer 获得的 id)和 attention_mask(如果输入序列长度小于最大输入序列长度时使用)。记住我们为每个输入声明的名称也很重要,因为它是我们稍后将在发送给模型的 HTTP 请求中定义的参数。在执行这几行之后,我们应该在工作目录中有一个包含以下文件的新目录:

如果你还没有安装 TensorFlow Serve (我推荐和 Docker 一起使用)现在就做吧。安装完成后,我们可以从 Docker 中提取映像,并使用加载了以下命令的 Distilbert 模型开始运行我们的服务:

docker run -p 8501:8501 --mount type=bind, source=/PATH_TO_YOUR_DIRECTORY/saved_models/distilbert, target=/models/distilbert -e MODEL_NAME=distilbert -t tensorflow/serving

这将导致 TensorFlow Serve 在端口 8501 加载 Distilbert(模型文件必须位于用数字命名的目录下,否则 TF Serve 不会加载模型),我们可以通过 HTTP 请求该端口。在下一节中,我将展示如何对我们的加载模型进行预测。

import requests
from transformers import AutoTokenizer, AutoConfigtokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased-finetuned-sst-2-english")text = "I like you. I love you"
encoded_input = tokenizer(text, pad_to_max_length=MAX_SEQ_LEN, max_length=MAX_SEQ_LEN)#TF Serve endpoint
url = "http://localhost:8501/v1/models/distilbert:predict"

payload={"instances": [{"input_ids": encoded_input['input_ids'], "attention_mask": encoded_input['attention_mask']}]}print(payload)
>> { "input_ids": [101, 1045, 2066, 2017, 1012, 1045, 2293, 2017,  102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "attention_mask": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }headers = {
  'Content-Type': 'application/json'
}

response = requests.request("POST", url, headers=headers, data=json.dumps(payload))

print(json.loads(response.text)['predictions'])
>>[[-4.2159214, 4.58923769]]

我们首先从 transformers 调用模型标记器,将输入文本转换成 id 列表及其相应的注意掩码,两者都有填充,以获得发送到我们加载的模型所需的格式。令牌化后,我们对 TensorFlow 执行 POST 请求,使用正确的有效负载提供服务,在这里我们获得呈现的值。但是等等,这个模型不是应该对文本中的情感进行分类吗?嗯,我们还缺少最后一步,将 softmax 函数应用于我们的结果向量。

import numpy as npdef softmax(x):e_x = np.exp(x - np.max(x))
    return e_x / e_x.sum(axis=0)print(softmax(json.loads(response.text)['predictions'][0]))
>>[0.0001 0.9999]

得到的向量是输入文本为负或正的概率。在这种情况下,0.0001 的概率为负,0.9999 的概率属于正类。如果我们将结果与用变压器加载管道的输出进行比较,我们可以看到两者是相同的。

总结这篇文章,我们使用了许多 huggingface 预训练模型中的一个,并将其加载到 TensorFlow Serve 上,这样我们就可以发出 HTTP 请求,并轻松地将这些模型扩展到生产中。我们还学习了如何使用模型记号化器向我们加载的模型发出请求,以及如何将 softmax 函数应用到我们的结果中以获得所需的值。在我的下一篇文章中,我将展示我们如何通过编写我们的记号赋予器来将自己从 transformers 库中完全抽象出来,并使用它来请求我们加载的模型。喜欢随时提出建议或改进意见,希望这篇文章能帮助你实现你的目标。

使用 Data.gov 上编目的公共数据集推动数据科学项目

原文:https://towardsdatascience.com/use-public-datasets-cataloged-on-data-gov-to-power-data-science-projects-1a7d84e9212b?source=collection_archive---------24-----------------------

Data.gov 存储了描述美国联邦、州和地方政府级别发布的超过 280,000 个免费和公共数据集的元数据。它简化了通过下载或 API 查找和获取数据的过程。

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

笔记本电脑上的图表照片。由 unsplash.com 的卢卡斯·布拉泽克提供。

介绍

最近,我发表了一篇关于如何获取和分析 analytics.usa.gov上关于公众使用大约 57,000 个美国联邦政府网站的数据的文章。Data.gov,另一个政府网站,作为各种政府数据集的公共交换中心。

Data.gov 包含描述超过 280,000 个免费公共数据集的元数据。它对由美国联邦政府实体管理的丰富多样的数据集合进行了编目,在某些情况下,还包括州、地方和部落政府级别的数据。Data.gov 是一个向美国公众开放的政府数据交换中心。

本文介绍了什么是 Data.gov,政府实体如何在网站上发布关于其公共数据集的元数据,网站编目的数据类型,如何搜索数据,以及如何从其源实体下载数据集。

什么是 Data.gov?

美国总务管理局(GSA)内的技术转化服务部 (TTS)负责管理 Data.gov。它在 2009 年建立了这项服务。迄今为止,TTS 已经收集、记录和发布了 280,518 个数据集的元数据。

以下声明指导 Data.gov 的工作:

使命 : 为美国公众设计并交付一个数字政府。

愿景 : 全民可信的现代政府体验。

TTS 用 CKANWordPress 建造了 Data.gov。它在 GitHub 上公开开发代码。

在 data.gov 上索引的数据集遵循DCAT-美国模式 v1.1 指南。通过这种模式,一组一致的元数据(标题、描述、标签、发布者等)被应用于所有数据集,以使它们可被发现和理解。

政府实体如何向 Data.gov 添加数据集?

《开放政府数据法案》是美国国会循证决策法案的基础的一部分,它要求联邦政府以开放和机器可读的形式向公众提供数据。同时,它必须保证隐私和安全。

操作指南指导政府机构发布元数据来描述网站上的公共数据集。一致的元数据提高了可发现性和影响力。

Data.gov 主要是一个联邦政府网站和服务。但是州、地方和部落政府也可以在平台上发布元数据来描述他们的公共数据集。

Data.gov 存储什么类型的数据?

如上所述,Data.gov 存储的元数据描述了存储在其他地方的成千上万个数据集中的数据。它不保存定义的数据,但存储和显示可下载文件和 API 的链接以获取数据。

超过 280,000 个数据集,Data.gov 上索引的数据太大了,无法简明地描述。以下是可用数据类型的一个小示例:

  • 国内生产总值
  • 气候和天气
  • 税收、税率和退税
  • 地理空间数据
  • 住房统计
  • 海洋
  • 人口普查和人口
  • 风能和太阳能
  • 教育
  • 出生率和死亡率

我怎样才能找到 Data.gov 的数据?

Data.gov 的数据目录使得搜索数据集变得容易。下面的屏幕截图提供了使用数据目录搜索页面查找数据集的提示。

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

Data.gov 数据目录搜索屏幕。作者捕获的图像。

如何从 Data.gov 获取数据和 API 信息?

通过点击搜索结果中的数据源链接,可以访问数据和 API。

下载数据

如下图所示,在数据目录搜索页面的搜索文本框中搜索关键字 fishing ,会返回 14230 个数据集。前两个数据集包含关于北达科他州鱼类资源和渔业设施的数据。

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

搜索“钓鱼”的数据集结果作者捕获的图像。

在本例中,当您单击数据源链接时,您将被转到北达科他州托管的网站或数据集文件。

点击 CSV 下载一个 CSV 文件。当在 Excel 中打开时,该文件显示该州在其湖泊中放养的鱼的数据。

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

北达科他州鱼群数据集的子集。作者捕获的图像。

API 信息

元数据 API

Data.gov 管理数据集的元数据,而不是原始数据。虽然搜索工具可以很容易地找到感兴趣的数据集,但可以在程序中使用 CKAN APICSW 端点来查询数据集和检索元数据。更多信息参见数据采集

数据集 API

大多数数据集都是可下载的文件。较少的数据集具有可用于访问数据的 API。要查找 API 或有关它们的信息,请使用在格式过滤器部分选择的 API 搜索Data.gov 数据集目录

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

“钓鱼”和包含“API”的格式的搜索结果作者捕获的图像。

单击大烟雾山国家公园鱼类分布(2014) 数据集的 API 链接将打开一个新的浏览器选项卡。它显示一个页面,其中包含有关访问数据的信息。

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

单击大烟山国家公园鱼类分布(2015)数据集的 API 链接时显示的 arcGIS 页面。作者捕获的图像。

关于 Data.gov 的新文章

关注即将发布的关于 Data.gov 的文章,例如:

  • 编写一个使用 CKAN API 访问数据集元数据的程序。
  • 探索各种类型的数据集。
  • 探索数据工具以支持数据从业者的工作。
  • 有趣或不寻常的数据集。

结论

Data.gov 为美国各级政府管理的数据集提供易于查找的元数据。该平台简化了通过下载或 API 查找和获取数据的过程。

Data.gov 是政府做得好的一个例子。

关于作者

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

关注 Randy 即将发表的关于公共数据集的文章,以推动数据分析见解和决策、编程、数据分析、摄影、自行车旅行等。你可以在 shootproof.com 和 shutterstock.com 看到他的一些照片。

使用 Python 和 Bulk Insert 将数据从 CSV 文件快速加载到 SQL Server 表中

原文:https://towardsdatascience.com/use-python-and-bulk-insert-to-quickly-load-data-from-csv-files-into-sql-server-tables-ba381670d376?source=collection_archive---------2-----------------------

了解如何编写 Python 代码来执行 SQL Server BULK INSERT 实用程序,以便将 CSV 文件中的数据高速加载到数据库表中

介绍

数据采集是许多数据分析项目和系统开发生命周期的重要组成部分。本文将向您展示如何编写一个简单的 Python 程序,该程序使用 BULK INSERT 实用程序将 CSV 文件中的数据快速插入到 SQL Server 数据库表中。

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

SQL Server 的批量插入实用程序可以直接从 Python 执行,以便将 CSV 文件中的数据快速插入到数据库表中。图片由作者提供。

为什么使用这种方法?

有许多方法可以将 CSV 文件中的数据加载到 SQL Server 表中。这里有几个方法:

  • 从命令行运行大容量插入实用工具。
  • 从 SQL Server Management Studio (SSMS)运行大容量插入实用工具。
  • 使用 SQL Server Management Studio (SSMS)导入平面文件向导。
  • 编写一个程序,打开 CSV 文件,逐个读取其记录,并调用 SQL INSERT 语句将行插入到数据库表中。

如果有这么多方法可以将数据从 CSV 导入 SQL Server 数据库,为什么还要编写一个 Python 程序来调用 BULK INSERT 实用程序将数据加载到表中呢?以下是为什么这可能是一个有用的方法的一些原因:

  • Python 程序可以在执行大容量插入之前执行流程步骤。
  • Python 程序可以确保不会将重复数据写入目标表。
  • 该程序可以在大容量插入之后清理或转换数据。
  • 它可以执行错误处理功能。
  • 它可以通过电子邮件或其他方式发送有关其行动的通知。

本文中使用的软件

我使用 Windows 10 环境和各种微软工具及其他工具进行软件开发、数据库和数据分析工作。下面是我在这篇文章中使用的软件列表:

  • Windows 10 Home —虽然我使用 Windows,但其中一些工具可能在其他操作系统中也能工作。
  • 记事本 —记事本有助于查看原始格式的 CSV 文件数据。
  • Microsoft Excel — Excel 有助于查看列和行格式的 CSV 文件中的数据。
  • 微软 SQL Server 2019 Express—SQL Server 有很多版本。Express 和 SQL Server Developer 都是免费版本。
  • 微软 SQL Server Management Studio(SSMS)——使用这个前端工具管理和查询 SQL Server 数据库。它是免费的,运行良好。
  • 微软 Visual Studio 社区版 —我试过微软 Visual Studio 代码 (VS 代码)集成开发环境(IDE)。尽管如此,我还是更喜欢用 Visual Studio 编码,因为我已经使用它很多年了,我发现它很容易配置和使用,除了它众多的深度菜单选项。
  • Python 3 . 9 . 2—这是撰写本文时最新的 Python 版本,但任何最新版本都应该可以工作。

生成测试数据

对于本文给出的例子,我从免费的在线数据生成器生成了一个包含 10,000 条虚构数据记录的 CSV 文件。该文件名为 c:\test_data_folder\person.csv。它包含列 ID、职务、电子邮件地址和姓氏。Python 程序将执行 SQL Server BULK INSERT 语句,将数据从文件加载到表中。

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

person.csv 文件的内容。图片由作者提供。

创建数据库和表

关于 SQL Server 版本的重要说明

微软在 SQL Server 2017 中引入了使用 BULK INSERT 从 CSV 文件插入数据的功能。因此,您需要该版本或更新版本才能使用此功能。

创建数据库

下面是创建名为 HR(人力资源)的数据库的步骤:

连接到 SQL Server

  • 发射 SSMS。
  • 连接到数据库服务器。在本例中,我使用 Windows 身份验证连接到本地安装的 SQL Server Express 实例。

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

连接到 SQL Server Management Studio (SSMS)中的 SQL Server 数据库引擎。图片由作者提供。

创建人力资源数据库

  • 在对象资源管理器中展开[+数据库]节点。右键单击[+数据库],然后单击[新建数据库…]。
  • 在“新建数据库”对话框中,在“数据库名称”文本框中输入“HR”。保持所有设置不变。单击[确定]创建数据库。

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

与 SSMS 一起创建人力资源数据库。图片由作者提供。

验证 HR 数据库出现在对象资源管理器中。如果没有,右键单击数据库,然后单击[刷新]。它应该进入视野。

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

对象资源管理器列出数据库。图片由作者提供。

创建表格

此时,HR 数据库将不包含任何表或其他对象,如存储过程。虽然 BULK INSERT 可以在运行时创建表,但我发现提前创建表有好处。例如,我可以指定表的键列以及每列的类型和长度。再次查看 CSV 文件中的示例数据,让我们创建具有相同名称和以下数据类型的列:

  • ID — INT
  • 职位名称 — NCHAR(60)
  • 邮箱地址 — NCHAR(120)
  • 名字姓氏 — NCHAR(80)

因为所有行都有所有列的值,所以将每一列设置为 NOT NULL。此外,由于 ID 是每一行的唯一标识符,因此选择它作为键。

按照以下步骤创建表格:

  • 在对象资源管理器中,单击[+ HR]查看数据库中的选择。
  • 右键单击[+表格],单击[新建],然后单击[表格…]。
  • 输入如下所示的数据。输入列名、数据类型和允许空值后,右键单击 ID 列名并单击[设置主键]。将 ID 设置为键将确保表中只有一行可以包含任何 ID 值。

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

Person 表的列信息。图片由作者提供。

  • 单击功能区菜单中的保存图标,在“选择姓名”对话框中,输入姓名“Person”点击[确定]保存表格。
  • 在对象资源管理器中,单击[+ Tables]展开节点。然后,右键单击[- Tables]并单击[Refresh]。现在应该可以看到 Person 表了。
  • 点击[+ dbo。Person]然后点击[+ Columns]来检查表格的结构。它应该类似于下图。

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

对象资源管理器中显示的人员表列。图片由作者提供。

Python 程序

现在 HR 数据库和 Person 表已经存在,让我们研究一个使用批量插入实用程序的简单 Python 程序。它只是将 CSV 文件中的所有记录插入到 Person 表中。

代码模块

这个 Python 程序由两个模块或文件组成:

  • c_bulk_insert.py 包含了 c_bulk_insert 类。它包括连接数据库、构建和执行 BULK INSERT 语句的函数,以便将 CSV 文件中的数据插入到数据库表中。
  • SQL _ server _ bulk _ insert . py简单地实例化 c_bulk_insert 类,并用完成其工作所需的信息调用它。

代码逻辑

当程序实例化类 c_bulk_insert 时,它执行以下步骤:

  1. 连接到 SQL Server 数据库。
  2. 使用目标表的名称、输入 CSV 文件和一些设置来构造大容量插入查询。
  3. 打开数据库游标。
  4. 执行查询。
  5. 清理:提交批量插入事务,关闭游标,并关闭数据库连接。

代码

模块 c_bulk_insert.py 中的 Python 类 c_bulk_insert 执行上述代码逻辑部分中描述的逻辑。

""" 
    Name:           c_bulk_insert.py
    Author:         Randy Runtsch
    Date:           March 17, 2021
    Description:    This module contains the c_bulk_insert class that connect to a SQL Server database
                    and executes the BULK INSERT utility to insert data from a CSV file into a table.
    Prerequisites:  1\. Create the database data table.
                    2\. Create the database update_csv_log table.
"""import pyodbcclass c_bulk_insert:def __init__(self, csv_file_nm, sql_server_nm, db_nm, db_table_nm):# Connect to the database, perform the insert, and update the log table.conn = self.connect_db(sql_server_nm, db_nm)
        self.insert_data(conn, csv_file_nm, db_table_nm)
        conn.closedef connect_db(self, sql_server_nm, db_nm):# Connect to the server and database with Windows authentication.conn_string = 'DRIVER={ODBC Driver 17 for SQL Server};SERVER=' + sql_server_nm + ';DATABASE=' + db_nm + ';Trusted_Connection=yes;'
        conn = pyodbc.connect(conn_string)return conndef insert_data(self, conn, csv_file_nm, db_table_nm):# Insert the data from the CSV file into the database table.# Assemble the BULK INSERT query. Be sure to skip the header row by specifying FIRSTROW = 2.qry = "BULK INSERT " + db_table_nm + " FROM '" + csv_file_nm + "' WITH (FORMAT = 'CSV', FIRSTROW = 2)"# Execute the querycursor = conn.cursor()
        success = cursor.execute(qry)
        conn.commit()
        cursor.close

sql_server_bulk_insert.py 模块实例化 c_bulk_insert。它用以下方式调用它:

  • CSV 文件名
  • SQL Server 实例引擎名称
  • 数据库名称
  • 目标表名
""" 
    Name:           sql_server_bulk_insert.py
    Author:         Randy Runtsch
    Date:           March 17, 2021
    Description:    This program is the controller that uses the Microsoft Transact-SQL BULK INSERT
                    statement to quickly insert the rows from a CSV file into
                    a SQL Server table.
    Prerequisites:  1\. Create the database data table.
                    2\. Create the database update_csv_log table.
"""from c_bulk_insert import c_bulk_insertbulk_insert = c_bulk_insert(r'c:\\test_data\\person.csv', 'xxxxx-DESKTOP-\\SQLEXPRESS', 'HR', 'Person')

结果呢

程序运行后,在 SSMS 执行一个选择查询,显示它将 CSV 文件中的记录写到 Person 表中。

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

在 SSMS 运行 SELECT 查询显示,Python 程序成功执行了 BULK INSERT 实用程序,将 CSV 文件中的记录写入 Person 表。图片由作者提供。

从这里去哪里

可能有许多原因和方法来增强程序。这里有一些想法:

  • 错误处理添加到数据库连接、查询执行和程序的其他部分。例如,程序可以使用错误处理来正常关机,重试一定次数,并通过电子邮件通知相关方。
  • 自动化程序在需要时将数据插入数据库。例如,使用 Windows 任务计划程序安排程序定期运行,以便从新的 CSV 文件中插入人员记录。
  • 创建并写入一个日志表以捕获程序开始和结束时间以及其他重要事件。添加其他消息,如错误详细信息,以确定要解决的问题。

结论

正如您所看到的,使用 Python 调用 BULK INSERT 是一种自动化部分工作流的方式,可以快速地将数据从 CSV 文件插入到 SQL Server 数据库表中。这可能是一种添加到您的数据分析或软件开发工具包中的便捷技术。

关于作者

Randy Runtsch 是一名数据分析师、软件开发人员、作家、摄影师、自行车手和冒险家。他和妻子住在美国明尼苏达州东南部。

关注 Randy 即将发表的关于公共数据集的文章,以推动数据分析解决方案、编程、数据分析、摄影、自行车旅行、啤酒等。

使用 Python 自动更新 PowerPoint

原文:https://towardsdatascience.com/use-python-to-automate-the-powerpoint-update-4a385acf1243?source=collection_archive---------0-----------------------

使用 Python 编辑 PowerPoint 幻灯片的分步教程

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

cyda 编辑的 PowerPoint 幻灯片

目标

在两篇关于更智能地使用 Microsoft Excel 的文章之后,我收到了一些直接消息,说他们对这一领域感兴趣,并希望我能分享更多关于其他 office 产品的信息。它刺激我做一个与办公室小贴士相关的系列文章的收藏。第一个是微软的 PowerPoint 。在本文中,您将了解到

  1. 如何确定 PowerPoint 幻灯片中的形状
  2. 修改幻灯片,如插入图像改变文字
  3. 以不同格式输出幻灯片的方法,如 PNG 或 PDF。

另外,如果你还没有看过我写的关于微软 Excel 的文章,请随意查看下面的链接。

https://medium.com/mlearning-ai/use-excel-to-scrape-data-no-codes-required-f13748587b0d

背景

在许多人的日常工作中,他们不得不频繁地定期更新 PowerPoint 幻灯片中的数字,如表格数字、日期、KPI 统计数据等。每天花 15-30 分钟来处理这些乏味的工作是很烦人的。

在下面的示例中,我们假设定期更新货币汇率,以弹出变化最大的货币汇率,我们需要显示变化百分比最大的货币汇率的价格趋势。

所有代码和资料都上传到我的 GitHub。你可以查一下民间的 和这种回购的 来进一步研究。=)

步骤 1-定义相应的组件

首先,我们必须决定要更新的元素。以我的幻灯片为例,总共有 7 个地方需要更新。

  1. 上次更新日期时间
  2. 前 5 名表
  3. 底部 5 表
  4. 顶级数字标签
  5. 底部图形标签
  6. 最高数字
  7. 底部图形

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

滑梯的 7 个部件(照片由 cyda 拍摄)

步骤 2 —数据准备

在理解了要更新的组件之后,接下来是要用于更新的数据源。在一般的办公工作中,数据可以从 SQL server 中提取或从电子邮件中接收数据文件等。这里,我们将演示从互联网上抓取数据的情况。我们将使用雅虎财务数据作为例证。

[https://finance.yahoo.com/currencies](https://finance.yahoo.com/currencies)

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

来自雅虎财经的货币(照片由 cyda 拍摄)

我不会深入讨论数据是如何收集的,因为这不是本文的重点。基本上就是两行代码。首先,我们使用requests获取页面。然后,我们使用pandas提取表格。请注意,我们还记录了刮擦日期和时间,以备后用。

import requests
import pandas as pd
from datetime import datetimedatetime_now = datetime.now()
full_list_url='[https://finance.yahoo.com/currencies'](https://finance.yahoo.com/currencies')
full_list_page = requests.get(full_list_url)
df = pd.read_html(full_list_page.text)[0].drop_duplicates()
df['pct_change'] = df['% Change'].str.slice(stop=-1).astype(float)

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

测向数据结构(cyda 拍摄

这张桌子看起来不错,包括了我们需要的所有东西。我们现在可以进入下一步,对表进行排序,并获得前 5 名和后 5 名货币的汇率。

top_df = df.sort_values(['pct_change'], ascending=False).reset_index(drop=True)[:5]
top_df = top_df[['Name', 'Last Price', 'Change', '% Change']]bottom_df = df.sort_values(['pct_change'], ascending=True).reset_index(drop=True)[:5]
bottom_df = bottom_df[['Name', 'Last Price', 'Change', '% Change']]

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

top_df 和 bottom_df 的数据结构(图片由 cyda 提供)

数字都准备好了。唯一剩下的就是那两块地了。要生成绘图,您只需遵循以下代码。放心吧!我会一步一步地解释,这很容易理解。

  1. 获取货币汇率的数据。
  2. 提取收盘价并绘制成折线图。
  3. 设置图表的格式,如颜色、字体大小或透明背景,以便与 PPT 主题保持一致。
  4. 将绘图保存到 PNG 中。
import json
import matplotlib.pyplot as plttop_name = top_df['Name'][0].replace('/', '')
bottom_name = bottom_df['Name'][0].replace('/', '')for idx in range(2):

    name = [top_name, bottom_name][idx]
    file_path = ['top.png', 'bottom.png']

    url = '[https://query1.finance.yahoo.com/v8/finance/chart/'](https://query1.finance.yahoo.com/v8/finance/chart/') + name + '=X?region=US&lang=en-US&includePrePost=false&interval=30m&useYfid=true&range=1mo&corsDomain=finance.yahoo.com&.tsrc=finance'
    header = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'}
    page = requests.get(url, headers=header)
    temp_json = json.loads(page.text)
    price_list = temp_json['chart']['result'][0]['indicators']['quote'][0]['close']
    price_list = [price for price in price_list if price != None]
    fig, ax = plt.subplots(figsize=(12, 6))
    ax.plot(price_list, color='#43B7A4')
    ax.set_xticks([])
    ax.tick_params(axis='y', colors='#43B7A4', labelsize=20)
    for axis in ['top','bottom','left','right']:
        ax.spines[axis].set_color('#43B7A4')
        ax.spines[axis].set_linewidth(4)
    plt.savefig(file_path[idx], transparent=True)

1.获取数据

特定货币汇率的价格系列数据可以在以下链接中找到。只有一个参数,那就是该货币汇率的name

url = '[https://query1.finance.yahoo.com/v8/finance/chart/'](https://query1.finance.yahoo.com/v8/finance/chart/') + **name** + '=X?region=US&lang=en-US&includePrePost=false&interval=30m&useYfid=true&range=1mo&corsDomain=finance.yahoo.com&.tsrc=finance'

请注意,这次您需要指定一个header,以便成功获取页面数据。标题用于假装您正在通过浏览器访问页面。

header = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'}

其余的应该很容易理解,这是获取页面数据并以 JSON 格式加载的常见过程。

page = requests.get(url, headers=header)
temp_json = json.loads(page.text)

2.绘制折线图

要得到价格表,我们只需检查数据的字典结构,就可以得到。有一点需要提醒的是,我在这里进行了一次检查,删除了价格表中的那些None数据,因为我发现价格表中有一些数据缺失。

price_list = temp_json['chart']['result'][0]['indicators']['quote'][0]['close']
price_list = [price for price in price_list if price != None]

我们使用matplotlib来绘制直线。

fig, ax = plt.subplots(figsize=(12, 6))
ax.plot(price_list, color='#43B7A4')

3.将图表风格化

我做了一些东西来润色剧情。

  • 删除日期的 x 轴刻度
ax.set_xticks([])
  • 更改 y 轴刻度的字体大小和字体颜色
ax.tick_params(axis='y', colors='#43B7A4', labelsize=20)
  • 改变边框颜色,使线条宽度变大
for axis in ['top','bottom','left','right']:
    ax.spines[axis].set_color('#43B7A4')
    ax.spines[axis].set_linewidth(4)

4.保存情节

最后,我们将图形保存为 PNG 格式。请注意,要使背景透明,只需指定transparent=True

plt.savefig(file_path[idx], transparent=True)

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

顶部和底部货币图(照片由 cyda 拍摄)

步骤 3— PowerPoint 更新

这是我们今天的重点。在使用 Python 编辑 PowerPoint 之前,需要有python-pptx包。要安装它,您可以在终端中键入以下代码。

pip install python-pptx

按照我们通常的做法,我先给你看所有的代码,然后一步一步地教你。

from pptx import Presentation
from pptx.util import Inches
import win32com.client
import oscurrencies_ppt = Presentation('Currencies.pptx')
slide = currencies_ppt.slides[0]shapes = slide.shapes
for shape in shapes:
    if shape.shape_type == 13:
        shapes.element.remove(shape.element)
top_img_path = 'top.png'
bottom_img_path = 'bottom.png'
top_pic = slide.shapes.add_picture(top_img_path, Inches(0.40), Inches(4.85), width=Inches(5.30))
bottom_pic = slide.shapes.add_picture(bottom_img_path, Inches(5.25), Inches(4.85), width=Inches(5.30))
ref_element = slide.shapes[0]._element
ref_element.addprevious(top_pic._element)
ref_element.addprevious(bottom_pic._element)shapes = slide.shapes
text_box_list = []
auto_shape_list = []
table_list = []
for shape_idx in range(len(shapes)):
    shape = shapes[shape_idx]
    if shape.shape_type == 17:
        text_box_list.append(shape_idx)
    if shape.shape_type == 1:
        auto_shape_list.append(shape_idx)
    if shape.shape_type == 19:
        table_list.append(shape_idx)last_update_date_textbox_height = max([shapes[shape_idx].height for shape_idx in text_box_list])
last_update_date_idx = [shape_idx for shape_idx in text_box_list if shapes[shape_idx].height == last_update_date_textbox_height][0]
top_label_left = min([shapes[shape_idx].left for shape_idx in auto_shape_list])
top_label_idx = [shape_idx for shape_idx in auto_shape_list if shapes[shape_idx].left == top_label_left][0]
auto_shape_list.remove(top_label_idx)
bottom_label_idx = auto_shape_list[0]
top_table_left = min([shapes[shape_idx].left for shape_idx in table_list])
top_table_idx = [shape_idx for shape_idx in table_list if shapes[shape_idx].left == top_table_left][0]
table_list.remove(top_table_idx)
bottom_table_idx = table_list[0]paragraph = shapes[last_update_date_idx].text_frame.paragraphs[0]
paragraph.runs[4].text = datetime_now.strftime("%#d %b %Y %H:%M")
paragraph = shapes[top_label_idx].text_frame.paragraphs[0]
paragraph.runs[0].text = top_df['Name'][0].replace('/', ' / ')
paragraph = shapes[bottom_label_idx].text_frame.paragraphs[0]
paragraph.runs[0].text = bottom_df['Name'][0].replace('/', ' / ')
top_table = shapes[top_table_idx].table
for i in range(5):
    for j in range(4):
        cell = top_table.cell(i+1, j)
        paragraph = cell.text_frame.paragraphs[0]
        run = paragraph.runs[0]
        run.text = str(top_df.iloc[i, j])
bottom_table = shapes[bottom_table_idx].table
for i in range(5):
    for j in range(4):
        cell = bottom_table.cell(i+1, j)
        paragraph = cell.text_frame.paragraphs[0]
        run = paragraph.runs[0]
        run.text = str(bottom_df.iloc[i, j])currencies_ppt.save('New_Currencies.pptx')ppt_file_path = os.getcwd() + '\\New_Currencies.pptx'
powerpoint = win32com.client.Dispatch('Powerpoint.Application')
deck = powerpoint.Presentations.Open(ppt_file_path)
img_file_path = os.getcwd() + '\\Currencies.png'
powerpoint.ActivePresentation.Slides[0].Export(img_file_path, 'PNG')
pdf_file_path = os.getcwd() + '\\Currencies.pdf'
deck.SaveAs(pdf_file_path, 32)deck.Close()
powerpoint.Quit()
os.system('taskkill /F /IM POWERPNT.EXE')

代码看起来又长又复杂。不要惊慌。如果你理解了结构,你就能很容易地处理它。

  1. 指定您正在处理的幻灯片。
  2. 移除现有地块。
  3. 添加新的地块。
  4. 定义元件的形状指数。
  5. 逐个更新组件。
  6. 把 PPT 导出成我们想要的任何格式。

1.加载 PPT 并指定幻灯片

currencies_ppt = Presentation('Currencies.pptx')
slide = currencies_ppt.slides[0]

从上面的代码可以看到括号里的数字0。它指的是幻灯片编号。因为我正在制作第一张幻灯片,所以我将编号指定为0。例如,如果您的常规更新幻灯片在幻灯片 10 中,那么您必须将编号指定为9

2.移除旧地块

步骤 1 中,我们定义了 7 个组件,有两个图——组件 6 和组件 7。要替换它们,我们首先必须删除它们。否则,新图将与旧图重叠。但问题是‘我们如何指定幻灯片中的特定项目?’

python-pptx中,不同的物体有不同的形状。要检查幻灯片中的形状,您可以执行以下代码。

for shape in slide.shapes:
    print(shape.shape_type)

以我的幻灯片为例,下面是我收到的输出。

PICTURE (13)
PICTURE (13)
TEXT_BOX (17)
TABLE (19)
TABLE (19)
TEXT_BOX (17)
TEXT_BOX (17)
AUTO_SHAPE (1)
AUTO_SHAPE (1)

然后我们就可以算出老剧情应该是PICTURE (13)。要删除它们,我们只需要检查形状类型是否等于 13。

shapes = slide.shapes
for shape in shapes:
    if shape.shape_type == 13:
        shapes.element.remove(shape.element)

3.添加新的地块

使用以下功能可以很容易地添加图表。

add_picture(image_file, left, top, width=None, height=None)

基本上,你要做的事情是设置图像文件路径和你要放的图像的 x-y 位置,就像下面这样。

top_img_path = 'top.png'
bottom_img_path = 'bottom.png'top_pic = slide.shapes.add_picture(top_img_path, Inches(0.40), Inches(4.85), width=Inches(5.30))
bottom_pic = slide.shapes.add_picture(bottom_img_path, Inches(5.25), Inches(4.85), width=Inches(5.30))

请注意,图形的另一个步骤是指定图像的放置顺序。通过这样做,你必须找到一个相对形状作为参考形状,并使用addnextaddprevious函数来指定它们的关系。这就好比 PowerPoint 中的Bring ForwardSend Backward的概念。

ref_element = slide.shapes[0]._element
ref_element.addprevious(top_pic._element)
ref_element.addprevious(bottom_pic._element)

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

有无相对位置的区别(照片由 cyda 拍摄)

4.查找形状索引

要编辑形状,我们必须确定它引用了哪个形状索引。简而言之,我们首先将形状分类到不同的列表中,并根据x-coordinate (left)y-coordinate (height)确定相应的形状索引。

shapes = slide.shapes
text_box_list = []
auto_shape_list = []
table_list = []
for shape_idx in range(len(shapes)):
    shape = shapes[shape_idx]
    if shape.shape_type == 17:
        text_box_list.append(shape_idx)
    if shape.shape_type == 1:
        auto_shape_list.append(shape_idx)
    if shape.shape_type == 19:
        table_list.append(shape_idx)

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

将形状分类成列表(照片由 cyda 拍摄)

文本框列表

文本框有三种形状。为了识别最后更新日期时间形状,我们可以找到具有最大高度的形状。

last_update_date_textbox_height = max([shapes[shape_idx].height for shape_idx in text_box_list])
last_update_date_idx = [shape_idx for shape_idx in text_box_list if shapes[shape_idx].height == last_update_date_textbox_height][0]

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

文本框(照片由 cyda 拍摄)

自动形状列表

只有两种自动形状,即顶部标签和底部标签。它们具有相同的高度,但 x 坐标不同。在left中具有最小值的一个将是顶部标签,另一个将是底部标签。

top_label_left = min([shapes[shape_idx].left for shape_idx in auto_shape_list])
top_label_idx = [shape_idx for shape_idx in auto_shape_list if shapes[shape_idx].left == top_label_left][0]
auto_shape_list.remove(top_label_idx)bottom_label_idx = auto_shape_list[0]

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

自动整形(照片由 cyda 拍摄)

表格列表

由于也只有两个表格,我们可以简单地应用类似的技巧,就像我们在自动形状列表中所做的那样。

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

表(照片由 cyda 拍摄)

top_table_left = min([shapes[shape_idx].left for shape_idx in table_list])
top_table_idx = [shape_idx for shape_idx in table_list if shapes[shape_idx].left == top_table_left][0]
table_list.remove(top_table_idx)bottom_table_idx = table_list[0]

5.更新组件

要更新组件,一个非常重要的规则是遵循形状内部的变化值,而不是格式。在下面,我用最后更新日期时间作为例子。

纯文本(不要用这个)

shapes[last_update_date_idx].text = 'Last Update: ' + datetime_now.strftime("%#d %b %Y %H:%M")

带格式的文本(用这个)

paragraph = shapes[last_update_date_idx].text_frame.paragraphs[0]
paragraph.runs[4].text = datetime_now.strftime("%#d %b %Y %H:%M")

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

纯文本和带格式文本的插图(照片由 cyda 拍摄)

从上面的图像中,你可以看出区别。一个段落实际上不仅用于存储形状的值,还用于存储格式信息,如对齐、字体、超链接等。因此,请记住更改段落运行中的文本值,而不是形状值。

附图的标记实际上具有相同的结构,我将再次重复这个概念。让我们转到表值的更新。

top_table = shapes[top_table_idx].table
for i in range(5):
    for j in range(4):
        cell = top_table.cell(i+1, j)
        paragraph = cell.text_frame.paragraphs[0]
        run = paragraph.runs[0]
        run.text = str(top_df.iloc[i, j])

基本上,这很简单。我们找到感兴趣的表格,并为表格中的每个单元格更改段落运行中的值。请注意,i指的是行记录,j指的是列。

6.导出文件

教程差不多完成了,最后一步是将文件转换成我们想要的格式。基本上,让我分享人们会使用的最常见的文件结构。

另存为 PPT

currencies_ppt.save('New_Currencies.pptx')

另存为 PNG

import win32com.client
import osppt_file_path = os.getcwd() + '\\New_Currencies.pptx'
powerpoint = win32com.client.Dispatch('Powerpoint.Application')
deck = powerpoint.Presentations.Open(ppt_file_path)img_file_path = os.getcwd() + '\\Currencies.png'
powerpoint.ActivePresentation.Slides[0].Export(img_file_path, 'PNG')deck.Close()
powerpoint.Quit()
os.system('taskkill /F /IM POWERPNT.EXE')

另存为 PDF

import win32com.client
import osppt_file_path = os.getcwd() + '\\New_Currencies.pptx'
powerpoint = win32com.client.Dispatch('Powerpoint.Application')
deck = powerpoint.Presentations.Open(ppt_file_path)pdf_file_path = os.getcwd() + '\\Currencies.pdf'
deck.SaveAs(pdf_file_path, 32)deck.Close()
powerpoint.Quit()
os.system('taskkill /F /IM POWERPNT.EXE')

结论

关于使用 Python 在 PowerPoint 中自动化工作的 office 技巧到此结束。如果你有兴趣了解更多这类工作技巧,请给个赞并关注。请继续关注我的下一篇教程。=)

如果你觉得我的文章有用,请在我的 LinkedIn 页面上为我的技能背书,鼓励我写更多的文章。

https://medium.com/mlearning-ai/use-python-to-send-outlook-emails-d673ce9e33e4 https://medium.com/mlearning-ai/use-python-to-process-pdf-work-7a9d77d718f4

用 Python 构建 Excel 自动化工具

原文:https://towardsdatascience.com/use-python-to-design-automation-tools-for-excel-users-e824b37c646d?source=collection_archive---------12-----------------------

用于销售分析的 Excel 自动化工具的设计可供您的同事在没有任何 Python 知识的情况下使用

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

Excel 自动化—(图片由作者提供)

你读过多少文章说“Excel 已死,Python 万岁”,“Python 是新的 Excel”或者“Excel 过时了”?

但是当你环顾四周,在你的团队或其他部门你几乎找不到其他同事使用 Python。

而当你提到它时,它被视为一个人们无法信任的黑匣子,因为“*它太复杂了”、“我们看不到公式”*或“我无法在我的电脑上运行它”

推广它的第一步是让他们有可能在没有 python 知识的情况下在他们的计算机上运行您的脚本。

💌新文章免费直入你的收件箱:时事通讯

如果你喜欢看,看看这篇文章的视频版本

1.方案

你是一家大型零售公司的数据科学家,供应链团队的同事请求你帮助分析销售数据**。**

对于本例,我们将从 Kaggle 挑战:商店商品需求预测挑战中获取一个数据集。我在另一篇文章(链接)中使用这个数据集进行商店需求预测。

数据集

  • 2013 年 1 月 1 日至 2017 年 12 月 31 日的交易
  • 913,000 销售交易
  • 50 独特的 SKU
  • 10 店铺

**目标:**你的同事想要为每个商店建立一个按商品统计的月销售额数据透视表。

**问题:**拥有近 100 万条记录,您的同事正在接近 Excel 的极限。因此,他们请求数据科学家的支持,以找到神奇的解决方案。

http://samirsaci.com

2.解决办法

我们将设计一个 python 脚本来执行数据处理,创建数据透视表并将结果导出到 Excel 文件中。

您的脚本正在执行以下任务:

  1. 从 Kaggle Challenge 导入初始原始数据(sales_data.csv)
  2. 日期格式化
  3. 每对商店、商品按月销售的数据透视表
  4. 按商店和项目对记录进行排序
  5. 将最终报告保存在 Excel 文件中

3.使用可执行文件(.exe)

**目标:**创建一个可执行文件(。exe),它将运行您的脚本,并且可以在您的计算机上没有安装 python 的情况下使用。

工具箱中的新 Python 库:Pyinstaller

PyInstaller 将 Python 应用程序及其所有依赖项打包到一个包中。用户可以运行打包的应用程序,而无需安装 Python 解释器或任何模块。

第一步:安装 Pyinstaller

pip install pyinstaller

步骤 2:将 python 脚本保存在当前目录中

将它保存在与销售记录初始文件(sales_data.csv)相同的目录中。将文件命名为:“pivot.py”

步骤 3:使用 Pyinstaller 创建可执行文件

在命令提示符下输入以下命令

pyinstaller --onefile pivot.py

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

Pyinstaller 处理日志—(图片由作者提供)

当该过程完成时,您将看到此消息“从 EXE-00.toc 成功构建 EXE”还有你的(。exe) fill 会弹出一个名为“Build”的文件夹。

步骤 4:使用你的可执行文件

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

您的新(。文件处理日志—(图片由作者提供)

请你的同事剪切并粘贴这个(。exe)文件,并单击以启动脚本。由于在脚本的每一步都放置了打印消息,他们可以跟踪这个过程。

**结果:**在流程结束时,他们可以找到保存在您文件夹中的销售报告(sales_report.xlsx)。

超越:自动化数据提取

在开始构建报告之前,您需要从 ERP 中收集数据。如果您正在使用 SAP,您可能会对这一系列关于 ERP 自动化的文章感兴趣

https://www.samirsaci.com/sap-automation-of-product-listing-for-retail/ https://www.samirsaci.com/sap-automation-for-retail/

4.结论

关注我的 medium,了解更多与供应链数据科学相关的见解。

您现在有了一个工具来与其他同事分享您的工作,并构建将影响您公司的生产力并支持人们自动完成枯燥任务的工具。

这可以与使用 seaborn 的酷可视化、获取数据的外部 API 的连接、预测未来销售的机器学习模型或任何可以为您的计算带来附加值的东西相结合。

关于我

让我们在 LinkedinTwitter 上连线,我是一名供应链工程师,正在使用数据分析来改善物流运营和降低成本。

如果你对数据分析和供应链感兴趣,可以看看我的网站

https://samirsaci.com

参考

[1] Kaggle 数据集,商店商品需求预测挑战,链接

使用 Python 来格式化 Excel

原文:https://towardsdatascience.com/use-python-to-stylize-the-excel-formatting-916e00e33302?source=collection_archive---------0-----------------------

使用 Python 格式化 Excel 电子表格的分步教程

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

自动生成风格化报告的步骤(照片由 cyda 拍摄)

目标

你必须每天定期更新报告吗?你有没有想过一种方法来自动化这些繁琐,无聊,机器人的工作?你可能会说“是的,但是我不能,因为有很多格式的东西需要我手动添加到 Excel 中”。今天,我将向您展示 Python 如何处理 Excel 电子表格格式并自动生成报告。

加密货币为例

我是一个加密货币爱好者,我会每天查看不同硬币的价格。然而,逐个检查所有硬币是非常耗时的,这就是为什么我想每天早上用一个程序自动为我生成总结报告。如果你有兴趣了解更多的金融数据分析,可以随时查看我的出版物。

https://medium.com/financial-data-analysis

所有的代码和数据都上传到了我的 GitHub。你可以和民间的 这种回购 来进一步研究。=)

数据抓取

首先,我们需要收集数据以显示在表格中。例如,您可以从公司数据库中查询数据。您可以从您的业务伙伴处获取数据。或者就像我这个案例,瞬间从网上刮数据。我在这里使用的数据源是 CoinDesk API。关于这个 API 如何工作和参数设置的更多细节,你可以查看我下面的文章。

https://medium.com/financial-data-analysis/web-scraping-cryptocurrency-1-minute-price-data-python-471dd165d934

import json
from urllib import request
url = "[https://production.api.coindesk.com/v2/tb/price/ticker?assets=all](https://production.api.coindesk.com/v2/tb/price/ticker?assets=all)"
response = request.urlopen(url)
data = json.loads(response.read().decode())

通过上面的代码,我们可以很容易地获得不同硬币的最新加密货币定价。我在下面展示了数据应该是什么样子。

{'statusCode': 200,
 'message': 'OK',
 'data': {'BTC': {'iso': 'BTC',
   'name': 'Bitcoin',
   'slug': 'bitcoin',
   'change': {'percent': 0.6642429710971107, 'value': 298.538427},
   'ohlc': {'o': 44944.160494,
    'h': 46843.67,
    'l': 43480.540171,
    'c': 45242.698921},
   'circulatingSupply': 18814943.79249204,
   'marketCap': 851238837219.2552,
   'ts': 1631590859000,
   'src': 'tb'},
  'ETH': {...}}}

数据列表

然而,数据是 JSON 格式的,不容易阅读。因此,我们必须将数据预处理成表格格式。

def flatten_json(coin_dict):
    flatten_dict = {}
    def flatten(x, name=''):
        if type(x) is dict:
            for key in x:
                flatten(x[key], name + key + '_')
        else:
            flatten_dict[name[:-1]] = x
    flatten(coin_dict)
    return flatten_dictimport pandas as pd
master_df = pd.DataFrame()
for coin in data['data'].keys():
    temp_df = pd.json_normalize(flatten_json(data['data'][coin]))
    master_df = master_df.append(temp_df)
master_df = master_df[['iso', 'name', 'ohlc_o', 'ohlc_h', 'ohlc_l', 'ohlc_c', 'change_percent']].reset_index(drop=True)
master_df.columns = ['Symbol', 'Name', 'Open', 'High', 'Low', 'Close', 'Pct_Change']
master_df.iloc[:, 2:] = master_df.iloc[:, 2:].apply(lambda x: round(x, 2))
master_df['Pct_Change'] = master_df['Pct_Change'] / 100
master_df = master_df.sort_values('Pct_Change', ascending=False).reset_index(drop=True)
master_df.to_csv('master_df.csv', index=False)
master_df.head()

为了将 JSON 转换成表,您可以遵循以下步骤。

  1. 展平 JSON 中每一个硬币数据的字典
  2. 将所有硬币数据帧添加到一个主数据帧中
  3. 选择我们感兴趣的栏目
  4. 重命名列以便于参考
  5. 四舍五入以简化表格
  6. 按百分比变化排序

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

cyda 拍摄的照片

Excel 格式

最后是主菜。只要记住一件事,在写代码之前,你应该先在头脑中有一个设计。例如,下面是我的模板草稿。有草稿的原因是因为它帮助你更好地定义列或索引来放置元素(标题、表格、备注等)。

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

照片由 cyda

1.将表格添加到 excel 中

file_name = "Cryptocurrency.xlsx"
sheet_name = "Summary"writer = pd.ExcelWriter(file_name, engine='xlsxwriter')
master_df.to_excel(writer, sheet_name=sheet_name, startrow = 2, index = False)

只需注意一点,您可能会看到有一个参数 startrow 设置为 2。这是因为我们希望保留前两行作为标题和间距,我们将在第 3 行开始写表(Python 计数值从 0 开始,所以基本上设置为 2 意味着第 3 行)

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

照片由 cyda 拍摄

2.将标题添加到 excel

from datetime import datetime
workbook  = writer.book
worksheet = writer.sheets[sheet_name]worksheet.write(0, 0, 'Cryptocurrency Pricing Summary on '+datetime.now().strftime('%d %b %Y'), workbook.add_format({'bold': True, 'color': '#E26B0A', 'size': 14}))

若要定义要写入文本的单元格,您可以从上到下然后从左到右计数。比如你在写 A1,那么它就是(0,0)。如果你写的是 C4,那么应该是(3,2)。

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

照片由 cyda

3.将备注添加到 excel 中

worksheet.write(len(master_df)+4, 0, 'Remark:', workbook.add_format({'bold': True}))
worksheet.write(len(master_df)+5, 0, 'The last update time is ' + datetime.now().strftime('%H:%M') + '.')

这里有一个技巧要记住。由于数据框在每次更新中可能具有不同的行数,因此在编写注释字符串时,您应该更好地考虑它的记录。例如,这里我将行索引设置为 len(master_df)+4 ,这是表中的行数加上标题和间距。

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

照片由 cyda

4.给表格标题添加颜色

header_format = workbook.add_format({'bold': True, 'text_wrap': True, 'fg_color': '#FDE9D9', 'border': 1})
for col_num, value in enumerate(master_df.columns.values):
    worksheet.write(2, col_num, value, header_format)

对于表头,引入了两个参数。第一个是 text_wrap 。它被设置为 True,这样,如果空间不足以显示,页眉的文本将换行到下一行。第二个是 fg_color。它用于设置单元格的前景色。

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

照片由 cyda

5.向表格添加边框

row_idx, col_idx = master_df.shape
for r in range(row_idx):
    for c in range(col_idx):
        if c == 6:
            worksheet.write(r + 3, c, master_df.values[r, c], workbook.add_format({'border': 1, 'num_format': '0.00%'}))
        else:
            worksheet.write(r + 3, c, master_df.values[r, c], workbook.add_format({'border': 1, 'num_format': '0.00'}))

诀窍和以前的案例类似。只需记住将行索引设置为 r+3 ,因为表中第一个值前面有三行。

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

照片由 cyda

6.设置列宽

worksheet.set_column(0, 6, 12)
worksheet.set_column(1, 1, 20)

供您参考,函数参数如下:
(起始列索引、结束列索引、列宽)

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

cyda 拍摄的照片

结论

希望这篇文章能帮助到那些不得不定期更新 Excel 电子表格的人。如果你想知道更多的编程技巧,你可以订阅我的媒体,我会更新和分享更多的技巧。=)

如果你觉得我的文章有用,请在我的 linkedIn 页面上为我的技能背书,鼓励我写更多的文章。

原载于 cydalytics.blogspot.com 的

https://medium.com/mlearning-ai/use-excel-to-scrape-data-no-codes-required-f13748587b0d https://medium.com/mlearning-ai/use-python-to-send-outlook-emails-d673ce9e33e4 https://medium.com/mlearning-ai/use-python-to-process-pdf-work-7a9d77d718f4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值