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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

电子商务销售报告:错误图表、SQL 处理和 Data Studio 仪表板

原文:https://towardsdatascience.com/e-commerce-sales-reporting-err-diagram-sql-processing-and-data-studio-dashboard-2500e8f79af?source=collection_archive---------17-----------------------

这个项目旨在向您介绍如何利用 SQL 进行多数据集的关系映射和数据处理,并在 Data Studio 的帮助下创建一个自动化的报告仪表板

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

布莱克·维斯兹在 Unsplash 上的照片

SQL 是每个数据分析师都应该熟悉的基本语言之一,以便在关系数据库中存储、操作和检索数据。事实上,有许多不同的关系数据库管理系统(RDMS)使用 SQL 作为它们的标准语言,即 MySQL、Oracle、SQL Server 等。

也就是说,这个项目旨在最大限度地提高我使用 SQL 的能力,以**探索和操作一家电子商务公司的多个数据集。**不仅仅局限于数据处理;我决定扩展这个项目的范围,通过插入 Data Studio 构建一个报告仪表板来扩展结构化数据对可视化的适用性。

如果你感兴趣,可以在 Kaggle 查看公开提供的数据集。以下是该项目的主要亮点的快速总结:

  1. 用错误图映射数据集关系
  2. 将数据存储在中央数据库中的 SQL 处理
  3. 带有 Data Studio 的报告仪表板

1.数据集关系映射

我们应该如何处理彼此共享关系的多个数据集?

如果参考 Kaggle 提供的数据库,有 7 到 8 个独立的数据集代表一个电商销售报表:订单、客户、order_items、付款、发货等。在数据处理之前,我们需要确定所有数据集之间的关系,以避免可能导致数据丢失的错误映射。

以“order”和“customer”数据集为例,一个客户可以有 0 个或多个订单(一个 customer_id 对应不同的 order_id),但是一个订单只与一个客户绑定(一个 order_id 对应一个 customer_id)。

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

订单数据集

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

客户数据集

MySQL 自带构建 ERR 图的内置功能,允许我们可视化地映射和绘制数据集之间的关系。那么什么是 ERR 图呢?

实体关系图 (ER)显示数据库中存储的实体集的关系。换句话说,我们可以说 er 图帮助你解释了数据库的逻辑结构——Guru99.com

增强实体关系 (EER)基本上是 ER 图的扩展版本。EER 模型是用高级模型设计数据库的有用工具。有了它们的增强功能,您可以通过更精确地钻研属性和约束来更彻底地规划数据库—Cacoo.com

为了提供更直观的例子,

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

图片鸣谢:https://www . visual-paradigm . com/guide/data-modeling/what-is-entity-relationship-diagram/

数据集之间的关系由一个称为乌鸦食物符号的符号系统表示,如下所示:

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

图片来源:https://cacoo . com/blog/er-diagrams-vs-eer-diagrams-what-the-difference/

从本质上讲,ERR 图有助于我们更好地理解数据集之间的关系,以便我们能够更有效地进行数据处理。

对于这个项目,为了简单起见,我只选择了 5 个数据集,它们之间的关系可以很容易理解,如下图所示:

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

  • (1)客户和订单:1 个客户可以有多个订单,所以批注样式应该是“一个或多个”。
  • (2) orders 和 order_items: 1 个订单可以有多个 order_items,又是“一个或多个”。
  • (3)订单和付款:1 个订单只能有 1 次付款,“有且只有一个”的造型。
  • (4) order_items 和 products:类似地,1 个订单项目仅与 1 个产品相关联,这意味着“一个且只有一个”样式。

2.SQL 处理

什么是 SQL 处理,SQL 如何帮助将原始数据转换成更结构化、更可用的格式?

对于 SQL 处理的正式定义,

SQL 处理是 SQL 语句的解析、优化、行源生成和执行。根据语句的不同,数据库可能会省略其中的一些阶段— Oracle

本质上,我们导入原始数据库并操纵跨表数据,将其转换为一个(或多个)结构化数据库,该数据库易于消化、理解和扩展。

如果您回头参考上面的 ERR 图,我们能够将所有数据集连接到一个数据库中,作为进行进一步操作之前的参考中心。你可以从一个集中的中心加入和操作,但我建议将这些步骤分开,因为在与现有数据一起处理之前,用中心将未来数据导入工作流更容易**。**

转到连接过程,正如关系所表明的,可以使用连接(也称为内部连接)或左连接,这取决于您希望您的结构化数据库是什么样子。对于连接语法,它只映射存在于两个数据集之间的值,并删除只出现在其中一个数据集的值。对于左连接,除了映射连接的值之外,它还包括“左”数据集中不存在于另一个数据集中的值。

在我的数据集中,我对(1)使用了 JOIN 来只获取存在于两个数据集(客户和订单)中的值,而对(2)、(3)和(4)使用了 LEFT JOIN 来返回那些没有出现在其他数据集中的值。在这种情况下使用左连接的原因是为了识别从输入数据中推断缺失信息的“空”值。

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

MySQL 中的 SQL 查询

SQL 语句的一些重要亮点:

  • 创建表:这是为了创建一个集中的数据库作为一个枢纽,我以前分享的是未来的数据输入所必需的。
  • TIMESTAMPDIFF:这是将时间戳格式的值转换成我们更喜欢的时间指示器(例如小时、分钟)。在本例中,我将原始值转换为“分钟”,然后除以 60 除以 24,得到天数。

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

在创建了一个集中的原始数据库后,我开始将数据转换成一种更加结构化和可用的格式,即:

  • 时间戳列(例如,order_approved_at、order_delivered_carrier):例如,我想计算从批准订单到将订单交付给承运人的天数。
  • 价格列(如单价、运费):我想计算每个订单的总价

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

该 SQL 语句的关键亮点是按分组的**。选择文本和聚合时(例如,求和、相减、相乘等。),我们需要使用 GROUP BY 将相同的数据分组。例如,我们可能有多个具有相同值的 order _ id,因此按 order _ id 分组以将多个 order _ id 的总价格合并为一个。**

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

我们可以进一步深入数据库,以生成与我们的业务目标一致的列和值。

3.Data Studio 仪表板

什么是 Data Studio,它如何帮助构建视觉上引人入胜的报告仪表板?

处理完数据库后,我们可能希望直观地解释数据,以进行分析和报告。事实上,有多种平台提供与关系数据库系统集成的可视化服务,即 Tableau、Datorama 和 Data Studio。在这种情况下,我使用 Data Studio,因为它可以选择与 MySQL 集成,并且易于使用,可以在仪表板中进行进一步的处理,仪表板也使用 SQL 作为标准语言。

我不会详细介绍如何使用这个平台,因为它非常简单,你应该根据自己的需要来玩:https://datastudio.google.com/

我的报告控制面板和关键分析亮点的快速快照:

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

  • 总收入(包括总收入和净收入)约为 1200 万至 1400 万美元,但“tracked_gross_revenue”仅为 50 万美元,这意味着输入数据中没有正确跟踪大量缺失的收入。
  • 交付流程:虽然平均预计交付日为 23 天,但实际交付日只需 12 天。这就解释了为什么交货延迟(预计交货天数和实际交货天数之差)是负数。
  • 批准到交付持续时间:批准订单不到 1 天,将订单发送给承运人不到 3 天,订单到达客户手中大约需要 9 天。
  • 产品信息:平均产品名称长度为 6 个字符,描述长度为 103,e-com 网站中的照片总量为 27k。
  • 随时间变化的收入:2016 年至 2018 年,收入从 2017 年 3 月开始上升,此后持续稳定。
  • 地理表现:大部分收入来自南美城市,但随着电子商务网站在全球范围内的广泛使用,我们看到了积极的趋势。
  • 产品性能:在十大产品类别中,健康和美容产品是购买最多的。
  • 支付类型:信用卡占所有支付类型的 74%,表明这是主要的支付方式。

瞧啊。这就是这个项目的结尾——电子商务销售报告。我希望这篇文章对你有用并且容易理解。

在不久的将来,请留意我在即将开展的数据科学和机器学习项目!与此同时,您可以在这里查看我的 Github 以获得完整的资源库:

github:【https://github.com/andrewnguyen07
www.linkedin.com/in/andrewnguyen07领英:

谢谢!

使用 Python 和 Microsoft Azure 进行电子邮件情感分析—第 1 部分

原文:https://towardsdatascience.com/e-mail-sentiment-analysis-using-python-and-microsoft-azure-part-1-6212f4cb6ee3?source=collection_archive---------20-----------------------

我们的“已发送邮件”文件夹说明了我们的行为举止?我们能利用这些和其他补充数据来确定工作中快乐或悲伤的趋势吗?

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

塞巴斯蒂安·赫尔曼在 Unsplash 上的照片

这是由多个部分组成的文章的第 1 部分。

简介

坦白地说,在大多数与数据相关的事情上,我认为自己是个“菜鸟”。我在传统数据中心和云基础架构方面有相当丰富的经验,但在处理数据方面还是新手。在过去的 12 个月里,卡格尔几乎是我最好的朋友。

也就是说,我一直在尽可能多的研究我缺乏的技能——微积分、统计学、编码、数据工程概念等等。我认为最好的学习方法之一就是去做,但也要记录下我所经历的过程。此外,确保保持它的乐趣!

我还加入了一个链接,链接到我写这篇文章时创建的笔记本。随意使用和修改你认为合适的!

概念背景

对于我们这些经常使用电子邮件的人来说,我们都发送过几次,或者多次,或者可能每天都发。

  • “根据我的最后一封电子邮件…”
  • “展望未来,我建议……”
  • “这完全是胡说八道!”

这些看起来有点眼熟吗?对许多人来说,很容易通过电子邮件有意或无意地显示你当前的情绪状态。你可能厌倦了多次解释同样的情况,也许你的电子邮件反映了你越来越疲惫,或者也许你的车今天早上坏了,你只是今天过得不好。

不管原因是什么,我们的电子邮件历史实际上可以提供一个有用的视角,让我们了解我们在一个组织中的态度。

本文的剩余部分将集中在利用 Jupyter 笔记本、Microsoft Azure 文本分析 API 来提供动力,以及使用 Python 来探索、清理和呈现情感分析结果。

当然,我也会模糊或消毒某些数据,只是为了确保在这之后我还有一份工作。😃

开发环境

核心环境将包括以下内容:

  • Outlook 已发送邮件 CSV 导出
  • Azure 文本分析 API
  • Azure 笔记本( Jupyter 笔记本 )

具体到 Python,我们将使用以下包:

  • Numpy
  • 熊猫
  • MatPlotLib
  • Azure AI 文本分析

现在我们已经了解了将要使用的工具的基础,让我们开始构建吧!

步骤 1 —部署 Azure 文本分析 API 实例

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

弗拉基米尔·阿尼奇耶夫在 Unsplash 上拍摄的照片

我们首先需要部署一个 API 实例,这是本文剩余部分的目标。导航到https://portal.azure.com并登录。如果您没有帐户,您可以通过使用以下方式之一创建订阅来访问免费试用/信用点数:

天蓝色通行证:https://www.microsoftazurepass.com/

VS 开发要领:https://visualstudio.microsoft.com/dev-essentials/

登录后,我们需要搜索文本分析 API。

  • 点击创建资源。
  • 键入文本分析按回车键。
  • 点击创建。

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

创建文本分析 API 实例

接下来,我们需要输入关于服务及其定价层的详细信息。键入一个名称订阅(如果您有多个活动)、位置(建议选择离您最近的一个)、定价层 (F0 是免费的,对此工作正常),以及一个供它居住的资源组。如果没有,点击创建新的并给它命名。

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

Azure 文本分析 API 信息

部署完成后,从左侧选择所有资源并点击您的 API 资源。然后,点击键和端点并将端点键 1 复制到记事本或其他东西中以备后用。

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

关键点和端点检索

步骤 2— Outlook CSV 导出

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

照片由米卡·鲍梅斯特Unsplash 上拍摄

下一步是获取您的电子邮件发送项目的 CSV 导出。考虑到我们正在寻找我们自己的个人情感分数,我们将只关心我们发送的物品。

  • 打开展望
  • 文件→打开&导出→导入/导出
  • 导出到文件
  • 逗号分隔值(CSV)
  • 选择您的已发送邮件文件夹
  • 选择一个导出位置
  • 完成导出

步骤 3—设置和检查 CSV 数据

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

照片由 Kirill PershinUnsplash 上拍摄

现在我们已经有了 CSV,我们需要开始编写代码来探索和准备用于分析的数据。我强烈建议不要打开。csv 文件,因为我们中的许多人拒绝整理或保持我们的邮箱干净。相反,我们将坚持把它加载到熊猫数据帧中。

我们需要创建一个新的 Jupyter 笔记本来工作。我只是暂时把我的名字简单地叫做email 情操. ipynb 。如果你没有安装 Jupyter,也不想使用托管版本,我强烈建议你查看一下 Anaconda 获得一个全面的软件包。

现在我们有了笔记本,我们需要安装 Python 的 Azure 文本分析 API 包(如果你还没有的话)。

!pip install azure-ai-textanalytics

我们将假设我们的开发环境已经安装了 Pandas 和 Numpy(Anaconda 和 Azure 笔记本都提供了它们)。

然后我们可以继续导入必要的包。我们还将把我们的 Azure 文本分析 API 密钥和端点信息(来自步骤 1)分配到这个单元格中。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.pyplot import figure
from azure.ai.textanalytics import TextAnalyticsClient
from azure.core.credentials import AzureKeyCredential#Key and enpoint from Azure Text Analytics API service
key = "f7c7c91cd70e493ea38521d1cbf698aa"
endpoint = "[https://mediumapi.cognitiveservices.azure.com/](https://mediumapi.cognitiveservices.azure.com/)"

我们还需要定义一些我们稍后将在笔记本中使用的函数。为了便于组织,我只是将两者都添加到一个单元格中,这样它们就在笔记本中的相同位置了。

我们需要一个函数来为文本分析 API 提供认证,以及一个用于核心情感分析的函数。我们遵循微软文档中下面的快速入门中的代码,但是会对核心函数做一些修改以满足我们的特定需求。

虽然 auth 函数很简单,但我们需要修改情感分析函数来迭代一系列列表(与单个硬编码字符串相比),只检索总得分(我们将在下一篇文章中探索情感得分范围),并递增我们稍后创建的频率表。

#Creating the Azure authentication function
def authenticate_client():
    ta_credential = AzureKeyCredential(key)
    text_analytics_client = TextAnalyticsClient(endpoint=endpoint, credential=ta_credential)
    return text_analytics_client#Core function for running sentiment analysis
#Modified to fit our specific needs
#Added global variables we'll use later in this notebook
def sentiment_analysis_example(client,list_name): 
    global senti_results 
    senti_results = {'Positive':0,'Neutral':0,'Negative':0,'Unknown':0}
    global senti_errors
    senti_errors = []
    documents = list_name
    for row in documents:
        response = client.analyze_sentiment(documents = row)[0]
        try:
            if response.sentiment == "positive":
                senti_results['Positive'] += 1
            elif response.sentiment == "neutral":
                senti_results['Neutral'] += 1
            elif response.sentiment == "negative":
                senti_results['Negative'] +=1
            else:
                senti_results['Unknown'] +=1
        except:
            senti_errors.append(row)
    return(senti_results,senti_errors)#Assigning authentication function to object
client = authenticate_client()

现在我们有了 Azure API 函数设置,我们准备开始探索和准备我们的数据集。

#Assign your filename to a variable
emailFile = ‘BenSent.CSV’#Display the first 5 rows of our CSV to inspect
#Notice encoding — this seemed to work for our CSV
email_data = pd.read_csv(emailFile,encoding=’ISO 8859–1')
email_data.head()

如果您运行上面的代码,您应该会看到类似下面的输出。

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

Outlook 导出提供了大量的列(有用或无用),但是您会发现缺少一个关键的数据点—时间戳。

不幸的是,Outlook 不提供将日期/时间属性映射到 CSV 导出的功能。为了简单起见,我们将只分析我们的数据集作为一个完整的批处理。我们将看看如何在后续帖子中包含日期。

步骤 4—清理和准备数据集

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

马库斯·斯皮斯克Unsplash 拍摄的照片

根据这种情况下的可用数据,我们将重点关注我们在电子邮件中对他人说了什么,并确定总体上是积极、中立还是消极的情绪。我们需要创建一个单独的对象,只包含来自 Body 列的内容。我们将用熊猫来做这件事。

#Assign Body column to new object
email_body = email_data['Body']#Display top 5 rows and the overall length of the series
print(email_body.head())
print('\n')
print("Starting email count:",email_body.shape)

在这里,我使用按列标签选择,考虑到我们有这些可用的。您也可以使用列索引,或者您喜欢的任何东西。

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

现在我们可以看到只有正文内容,这是我们将用来执行情感分析的内容。当我们继续清理这个的时候,我们将密切监视我们的系列的形状。我们目前从 1675 行开始。

接下来,我们会注意到前 5 行中有我们不想分析的奇怪字符,比如\r\n等等。我们将使用一个简单的str.replace来删除这些。

#Removing \r and \n characters from strings
email_body = email_body.str.replace("\r","")
email_body = email_body.str.replace("\n","")#Display top 5 rows and the overall length of the series
print(email_body.head())
print('\n')
print("Current e-mail count:",email_body.shape)

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

接下来,我们将删除不想分析完整电子邮件线程的转发或尾随电子邮件线程。一个例子是行索引 3,其中我们看到在电子邮件线程中我的回复后面有一个日期。

我将使用我知道会自动添加到每个已发送邮件中的东西——我的签名块——来清理这些尾随邮件。以此为目标,我们可以根据识别签名词和尾随消息将数据划分到不同的列中。

#Removing trailing email threads after start of my email signature
split_df = email_body.str.partition("Regards")
print(split_df[0:3])
print('\n')
print("Current e-mail count:",split_df.shape)

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

从形状和输出中,我们现在可以看到我们有 3 个不同的分区列——一个用于电子邮件正文内容,一个用于识别签名块单词(在我的例子中是“问候”),一个用于结尾消息。

我们现在需要删除这些额外的列,将注意力放回到正文上。我们还将删除被标识为没有信息的行。

#Removing extra fluff from partitioning
clean_col = split_df.drop(columns=[1,2]) #1 contains "Regards", 2 contains trailing text
#Removing rows with NaN - no data
clean_nan = clean_col.dropna()print("E-mail count before NaN removal:",clean_col.shape[0]) #Display before NaN removal
print("E-mail count after NaN removal:",clean_nan.shape[0]) #Display before NaN removal

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

我们可以看到,在分区之前,我们有 1,675 行。我们删除了包含我签名前后的两栏内容。删除了 NaN 的行后,我们只剩下 1,642 封电子邮件。我们需要通过删除 PTO 邮件和转发邮件来继续清理。我们还将在正文列中添加一个列名。

#Updating the primary column with name EmailBody
clean_nan = clean_nan.rename(columns={0:"EmailBody"})#Remove emails with default out of office reply
clean_pto = clean_nan[~clean_nan.EmailBody.str.contains("Hello,I am currently")]#Remove emails with a forwarded message
cleaned_df = clean_pto[~clean_pto.EmailBody.str.contains("---------- Forwarded message ---------")]print("E-mail count before removals:",clean_nan.shape[0]) #Pre PTO count
print("E-mail count after removing PTO messages:",clean_pto.shape[0]) #Post PTO count
print("E-mail count after also removing forwarded messages:",cleaned_df.shape[0]) #Post fwd removal

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

检查形状后,我们可以看到我们从1642行到1460行,最后到1399行。请记住,我们正在清理所有这些内容,以确保我们的情感分析返回尽可能准确的信息。

如果我们打印cleaned_df系列,我们会看到我们的行看起来是空的。我们需要确保我们删除这些,这样我们的分析就不会出错。我们将通过使用 Pandas 的df.replace来做到这一点,并用 NaN 替换空数据。

#Considering we know we still have rows with no data, we'll replace the empty space with NaN
#We can see all visible rows with nothing now show NaN
cleaned_df['EmailBody'].replace(" ",np.nan,inplace=True)
print(cleaned_df)

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

现在我们的空行将显示 NaN。我们现在可以使用pd.dropna()删除这些行。

#We can now find all rows with NaN and drop them using pd.dropna
cleaned_df = cleaned_df.dropna()
print(cleaned_df)
print('\n')
print("E-mail count after dropping empty rows/rows with NaN:",cleaned_df.shape)

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

移除 NaN 后,行数减少到 1,288 行。请随意继续探索您的数据,以确保您没有应该删除的额外内容。虽然这并不完美,但我们确实希望结果尽可能合理。

至于最后一步,我们将把数据帧转换成包含字符串的列表。我们将用它发送给我们的 API 并返回我们的结果。

#Create an empty list to store values
#Iterate over each row in the dataframe and append it to the listsenti_list = []for row in range((cleaned_df.shape[0])):
    senti_list.append(list(cleaned_df.iloc[row,:]))

#Length of list matches length of old df 
print("E-mail count before error removal, ready for analysis:",len(senti_list))

我们可以打印列表的长度,以确保它与我们的 DataFrame 行数相匹配,事实也确实如此。

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

步骤 5—执行情感分析

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

照片由蒂姆·莫斯霍尔德Unsplash 上拍摄

现在我们有了一个“嗯,我清理了”数据的列表,我们可以开始将数据发送到我们的 Azure API,检索结果,并可视化我们的数据。

我们将提供新创建的列表作为核心情感分析函数中的 list_name 参数。该函数的编写方式不仅提供了结果的频率表,还提供了包含行本身的列表,这些行在分析时可能包含错误。

下一部分可能需要一段时间,这取决于有多少行被发送到 API。您可能还会发现自己不得不扩展自己的 API 服务。如果是这样的话,我建议你为了练习的目的,把你的清单削减一下。

#Trigger the sentiment analysis function, passing in our list of lists
sentiment = sentiment_analysis_example(client,senti_list)

一旦完成,我们就可以回顾最初的结果。

print(senti_results)
print("\n")
print("Sentiment errors:",senti_errors)
print("Error count:",len(senti_errors))

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

我们在这里可以看到两件主要的事情:我们的数据的总体情绪结果和在分析时出错的行。我们可以看到总共有 11 行没有被分析,这似乎是因为不同的空白。

我们需要遍历这个列表,遍历我们的原始数据集列表,并删除包含这些列表的所有列表。我们还将制作一份列表的副本,这样我们就有了历史版本,以备将来需要。

#Removing the errors from our list of lists
#Assigning to a new variable so we have the unmodified original
senti_cleaned = senti_listfor i in senti_errors:
    for row in senti_cleaned:
        if i == row:
            senti_cleaned.remove(row)

print("E-mail count after removing error rows. Final used for analysis:",len(senti_cleaned))

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

我们可以看到我们正好下降了 11 行,这与错误计数相匹配。我们现在可以对我们的数据副本重新运行分析,以确保没有其他错误。

#Triggering next run of analysis on the final dataset
sentiment = sentiment_analysis_example(client,senti_cleaned)#Displaying the sentiment analysis results
print(senti_results)
print("\n")
print("Sentiment errors:",senti_errors)
print("Error count:",len(senti_errors))

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

查看输出,我们可以验证我们没有更多的错误(您的里程可能会有所不同),并准备好继续绘制我们的结果。

第六步——可视化

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

卢卡斯·布拉塞克Unsplash 拍摄的照片

现在我们已经有了一个很好的字典,我们可以把它们绘制成很好的图表。对于本文,我们将关注两个视图:结果的总体情感百分比和每种情感类型的电子邮件数量。

为此,我们将使用matplotlib.pyplot库。我们将创建一个饼图(以显示百分比)和一个条形图(以按结果显示电子邮件数量)。在显示之前,我们还将对图进行一些格式更改,例如:颜色更改、字体更改、填充/间距、显示大小等。

#Setting our Key/Value pairs from our results
keys = senti_results.keys()
values = senti_results.values()#Establishing some format changes for our charts
figure(num=None, figsize=(8,8),dpi=80)
colors = ['seagreen','lightsteelblue','indianred','silver']
explode = (0.1, 0, 0, 0)
plt.rcParams.update({'font.size': 12})#Creating the first plot (pie chart)
plt.subplot(221)
plt.pie(values,labels=keys,colors=colors, explode=explode,autopct='%1.1f%%',shadow=True,startangle=90)
plt.title('Overall Sentiment Against 1,277 E-mails, by Percentage',bbox={'facecolor':'1','pad':8},y=1.10)#Creating the second plot (bar chart)
plt.subplot(222)
plt.title('E-mail Count by Sentiment Result',bbox={'facecolor':'1','pad':8},y=1.10)
plt.bar(keys,values,width=.8,color=colors)#Adjusting the spacing/padding between subplots
plt.subplots_adjust(left=0.125, bottom=0.1, right=1.8, top=1.3, wspace=0.2, hspace=0.2)#Displaying the plots
plt.show()

现在我们可以看到我们的数据有了一个很好的可视化表示!虽然我们仍然有一堆来自 API 的“未知”响应类型,但我们可以说,总体而言,我们的响应并不像我们想象的那样消极。

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

在接下来的一些帖子中,我们会对每封邮件进行分类,并对其进行分组。我们还希望引入一些其他数据,与我们目前发现的数据进行对比。

希望这篇文章是有用的或者有趣的,并且你在这个过程中学到了一些东西。请记住,我对此非常陌生,非常感谢您的反馈!

使用 Python 和 Microsoft Azure 进行电子邮件情感分析—第 2 部分

原文:https://towardsdatascience.com/e-mail-sentiment-analysis-using-python-and-microsoft-azure-part-2-796e7db76bee?source=collection_archive---------46-----------------------

使用新的电子邮件数据更深入地进行情感分析,并开始探索关系应用程序使用数据。

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

斯蒂芬·菲利普斯-Hostreviews.co.uk 在 Unsplash 上拍摄的照片

这是由多个部分组成的文章的第 2 部分。

第一部分回顾

简单回顾一下,本系列的第 1 部分着重于获取您的电子邮件发送项目的 CSV 导出,并使用 Microsoft Azure 的文本分析 API 返回每行的情感结果。

我们从用于增加频率表的 API 中获取的结果基本上向我们显示了正面、负面、中性或未知结果的总数。

我们还发现,完全理解时间线很困难,因为 Outlook 的任何导出功能都不包括日期时间数据,所以我们的分析只是针对“已发送邮件”文件夹中的大部分邮件。

第二部分导言

自从第 1 部分发表以来,我偶然发现了文本分析 API 的一个新版本(3.1 版),它可以返回一个“混合”的情感结果。我们将探讨这一点,以及以下值得注意的变化:

  • 从名为 RescueTime 的工具中探索应用程序使用细节
  • 查看情感分析结果的详细分数和输出
  • 准备连接数据集并查找相关性
  • 可视化数据

在第 1 部分中,我还提到了 Outlook 本身不允许您导出包含发送或接收日期/时间的电子邮件副本(CSV 或 PST 格式)。

打开 Outlook 应用程序并下载 CSV 的另一种方法是利用 PowerShell 来查询和保存信息。通过使用 PowerShell,我们能够操作 Outlook 应用程序中不可用的字段。

使用 PowerShell 检索带日期时间的电子邮件

下面的代码将提取您的已发送邮件文件夹的邮件正文和发送日期/时间,然后存储到一个 CSV 文件中。确保将-path 开关更新为您想要的值。

在 Excel 中查看文件时(假设您应用了默认设置),您会注意到一些格式问题,如:

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

为了解决这个问题并提供一种更容易在 Python 中使用的格式,我们将打开一个新的空白 Excel 文件,单击“数据选项卡,并在获取&转换数据部分中单击 From Test/CSV 。选择您的 CSV 文件并使用以下设置:

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

你会注意到我们把分隔符改成了|字符,因为我们在大多数邮件文本中很少使用,尤其是在我发送的邮件中。

我们还可以看到一个预览,显示它是如何格式化我们想要的。我们将点击底部的 Load ,将其保存为我们的工作 CSV,现在您就可以将它加载到数据帧中了!

大声向 杰森·布鲁诺 求助 PowerShell 脚本和修改 Excel 格式!

下载更新时间数据

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

斯蒂芬·菲利普斯-Hostreviews.co.uk 在 Unsplash 上的照片

改期从何而来?嗯,大约一年半以前,我下载了一个应用程序,它可以帮助跟踪应用程序中的活动时间,帮助你找到可以削减的地方,还可以大致了解你在哪里花了大部分时间。

我使用这个应用程序大约一个月左右,然后诚实地忘记我已经安装了它。哎呀!

对我有利的是,这个应用程序仍然在收集数据。RescueTime 提供了以 CSV 格式下载你所有数据的能力(在他们网站上你的个人资料中可以找到),所以我知道我要努力把它纳入我确定快乐/悲伤趋势的目标中。

此外,我与 RescueTime 没有任何关联,它只是一个我不久前决定尝试的免费应用程序,它非常有趣,足以融入这个故事。😃

加载和检查数据集

在本节中,我们将跳过许多逐行代码,因为我们使用了第 1 部分中的许多现有代码。我还提供了一个 GitHub 链接到 Jupyter 笔记本,如果你想查看、复制或修改它的话。

当我们导入新的电子邮件发送项目导出时,我们会在需要清理的数据中看到许多相似之处;但是,还要注意我们现在可以使用日期时间数据。呜!这在第 3 部分中可视化和连接数据集时非常有用。

您将看到的代码片段按照第 1 部分中的许多步骤完成了一些常规的数据清理,并添加了一些内容,例如将列转换为 datetime 并稍微更改了一些格式。我也在不断地学习,所以一些代码会不断地变得更有效率。

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

在导入 RescueTime 数据集并对其进行一些初步清理之后,我们可以获得以下一些信息:

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

非常有趣的是,它有我们可以探索的特定级别的细节,但它也提供数据,如:

  • 记录日期
  • 应用程序名称
  • 应用类别
  • 录制时的使用情况(秒)

只是为了好玩,这里有一个我记录的活动 Slack 实例的可视化,我们将在第 3 部分中触及。趋势下降可能是我工作的公司推出微软团队并开始摆脱 Slack 的一个标志。此外,很高兴我的星期六用法并不可怕!

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

记录的松弛窗口在我的屏幕上处于活动状态的实例…

我们将在第 3 部分进一步探索和加入 RescueTime 数据集,但现在我们将把重点转移到根据新的电子邮件数据集来改变我们的情感分析结果。

情感分析调优

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

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

回到我们的电子邮件数据集,我已经使用第 1 部分中的大部分内容清理了数据,考虑到我们现在有一个日期时间列,还添加了一些内容。

为了便于查看,我对主要情感分析功能进行了更改,以从 API 返回我们需要的详细信息,并对清理后的电子邮件数据集进行了一些修改,以利用这些附加功能:

…以及对电子邮件数据集的小改动,以从情感分析输出中获取更多细节。我们使用 DataFrame 中的“message”系列进行发送分析(相比之下,我们将它转换为一个列表)并添加额外的列。

在将我们的消息发送到文本分析 API 之后,我们可以看到我们的结果提供了与第 1 部分中类似的输出(包括更新的“混合”结果),以及我们的数据帧,该数据帧具有包含详细情感分数和总体情感结果的新列。

将这个结果输出到 csv 也是一个明智的选择,因为每次将结果发送到 API 时,都需要一段时间才能获得所有结果。😃

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

演示数据准备

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

安德鲁·尼尔Unsplash 上拍照

简单回顾一下,我们最新数据集的一些优势包括:

  • 电子邮件发送日期
  • 清理的邮件详细信息
  • 详细的情感分析得分结果
  • 总体情绪标签

也就是说,我们可以使用当前状态下的电子邮件数据来绘图,但也可以看看一周中哪一天更积极/消极等,这可能会很有趣…获取每一行的最高报告分数也可能有所帮助。

为了简洁起见,我们首先将 email_clean 数据帧复制到一个名为 email_plot 的数据帧中,我们将(很明显)使用它来绘图。我们还将为一周中的某一天添加一个新列,并从我们的date 列进行翻译。

email_plot['day_of_week'] = email_plot['date'].dt.day_name()

我们也将做同样的事情来获得我们的最高分,但是我们将只让它检查与我们的分数输出相关的列。

email_plot['top_score'] = email_plot[['positive','neutral','negative']].max(axis=1)

现在我们有了一些额外的有趣数据,可以在绘图时使用!

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

可视化新数据

现在,我们已经对消息列进行了适当的清理,添加了情绪得分、总体情绪结果、星期几和最高得分的列,我们准备好绘图了!

最近,我更关注 Plotly,因为我觉得修改布局、颜色地图等更容易。与 MatPlotLib 相比。MatPlotLib 无疑仍然是一个很棒的库,但是我也计划在我的个人网站上发布一些,所以一个交互式的库更有意义。

也就是说,Plotly 能够在生成图时使用facet_col轻松地将图分割成面板。在对情节细节做了一些调整后,我有一个有趣的散点图要看:

如果你是 Plotly 的新手,你可以点击右侧图例中的情绪结果来过滤上面的散点图。

如果我们先过滤,只显示积极的结果,我们实际上可以看到,随着我们从 2019 年 7 月转移到 2020 年 7 月,周四和周五有更多的电子邮件被自信地标记。

如果我们切换到负面结果,我们可以看到周一发送的带有负面标签的电子邮件数量大幅减少,上个季度的周一没有负面邮件!

然而,周二(温和增长)和周三的情况正好相反,因为随着我们进入 2020 年中期,我们可以看到更紧密的点群。

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

负面邮件(左)和正面邮件(右)

有趣的是,周末发送的电子邮件似乎大多是积极的,这可能有助于普遍的周末快乐在我的回复中发挥作用。

结论

虽然这并不意味着在情感结果和整体数据清洁度方面 100%准确,但它绝对是朝着更好的方向迈出的一步,并且能够开始查看我的电子邮件情感趋势。我认为同样值得一提的是,负面情绪并不意味着你是一个彻头彻尾的混蛋或骂人(我并不是一个那么糟糕的人……),而是指在系列中使用的某些词可能会触发 API,导致负面反应得分增加。😃

像往常一样,请在下面的评论区留下任何评论/想法/反馈。我总是在寻找更有效的方法来做某事,寻找我在做某事的过程中可能出现的错误,或者寻找一般的反馈!

请继续关注第 3 部分,我们将本故事中使用的数据与我们的 RescueTime 数据中的 datetime 数据相结合,以发现情感结果与大量应用程序使用之间的相关性!

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

刘汉宁·奈巴霍在 Unsplash 上的照片

使用 Python 的电子邮件通知机器人

原文:https://towardsdatascience.com/e-mails-notification-bot-with-python-4efa227278fb?source=collection_archive---------17-----------------------

一个重要的 PYTHON 技巧

教程—新冠肺炎案例的电子邮件通知示例

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

插图作者:金彩云

在数据科学中,项目的数据来源可能会随着时间而变化,分析结果也会随着时间快速变化。有时候结果的一点点变化可能不会让你感兴趣。但是自己一个人持续跟踪这种变化可能太累了…

本文展示了用 Python 编写电子邮件自动化机器人脚本的指南!

我们开始吧💥

📧准备电子邮件发件人

首先,让我们准备一个电子邮件发件人帐户。我推荐使用 G-mail,因为它易于注册,并且允许你手动调整安全选项。您可以使用您的个人电子邮件或您选择的其他电子邮件提供商。但是我建议为我们的电子邮件机器人创建一个新的电子邮件。🤖

在 G-mail 帐户准备就绪后,通过进入帐户安全设置并进行如下调整,降低帐户安全性以允许 Python 访问您的 G-mail 帐户并发送电子邮件:

  • 用手机取消登录
  • 通过两步验证取消登录
  • 打开不太安全的应用访问选项

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

在 G-mail 中进行设置以允许 Python 发送电子邮件。

使用 Python 的✍Sending 电子邮件

现在,我们开始一个有趣的部分,编写一个脚本来登录您的电子邮件帐户并发送电子邮件。我建议使用一个简单的模块smtplib来完成这项工作。首先,让我们创建一个send_email.py文件,开始导入模块,如下所示:

**import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText**

然后,让我们为您的电子邮件发件人和收件人信息以及电子邮件内容准备所有变量,如下所示。您可以在email_recipients列表中输入几个电子邮件收件人。

#Email Account **email_sender_account = "**<Your Sender Account>**"
email_sender_username = "**<Your Sender Username>**"
email_sender_password = "**<Your Sender Password>**"
email_smtp_server = "**<SMTP, eg smtp.gmail.com for gmail>**"
email_smtp_port =** <SMTP Porf, eg 587 for gmail>#Email Content
**email_recepients =** [**"**<recepient1>**","**<recepient2>**",".."**] **email_subject = "**<Email Subject>**"
email_body** = "<html of your body here>"

之后,我们只需要登录电子邮件服务器。然后,我们将使用for循环来生成电子邮件并发送给所有收件人。

#login to email server **server = smtplib.SMTP(email_smtp_server,email_smtp_port)
server.starttls()
server.login(email_sender_username, email_sender_password)**#For loop, sending emails to all email recipients **for recipient in email_receivers:
    print(f"Sending email to {recipient}")
    message = MIMEMultipart('alternative')
    message['From'] = email_sender_account
    message['To'] = recipient
    message['Subject'] = email_subject
    message.attach(MIMEText(email_body, 'html'))
    text = message.as_string()
    server.sendmail(email_sender_account,recipient,text)**#All emails sent, log out. **server.quit()**

在此之前,您有一个 Python 脚本来向所有收件人发送电子邮件。现在,让我们将它应用到真实世界的用例中。

🌎真实世界的例子

⚠新冠肺炎—电子邮件通知机器人

在本例中,我将展示如何应用我们在上面创建的 Python 脚本向报告新新冠肺炎病例的收件人发送电子邮件。

首先,我们需要获得最新的新冠肺炎数据。通过使用带有几行 Python 代码的BeautifulSoap4request模块,我们可以很容易地从 Worldometers 中抓取这个数据集,如下所示:

#import module **import requests, datetime
from bs4 import BeautifulSoup** #Set the endpoint: Worldometers **url = "https://www.worldometers.info/coronavirus/"
req = requests.get(url)
bsObj = BeautifulSoup(req.text, "html.parser")
data = bsObj.find_all("div",class_ = "maincounter-number")
num_confirmed = data[0].text.strip().replace(',', '')
num_deaths = data[1].text.strip().replace(',', '')
num_recovered = data[2].text.strip().replace(',', '')**

通过这个脚本,它找到了一个名为maincounter-number的类的位置,该类表示新冠肺炎数据的数量:确诊病例、死亡病例和恢复病例。这些数据分别存储在num_confirmed, num_deaths, num_recovered中。然后,我们也可以使用datetime模块获取当前时间,并传递这些变量来为电子邮件正文创建一个 HTML 结构,如下所示:

**TimeNow = datetime.datetime.now()
email_body = '<html><head></head><body>'
email_body += '<style type="text/css"></style>'
email_body += f'<h2>Reporting COVID-19 Cases at {time}</h2>'**
**email_body += f'<h1><b>Confirmed cases</b>:  {confirmed_cases}</h1>'
email_body += f'<h1><b>Recovered cases</b>:  {recovered_cases}</h1>'
email_body += f'<h1><b>Deaths </b>:  {deaths}</h1>'
email_body += '<br>Reported By'
email_body += '<br>COVID-19 BOT</body></html>'**

现在,让我们把所有的东西结合在一起,输入所有的电子邮件信息,然后运行python <filename>.py,试试看是否可行,是的,可行!运行完脚本后,我的收件箱里直接收到了一封电子邮件,里面有实时更新的新冠肺炎案例:

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

运行 Python 脚本后,我的 Outlook 收件箱中的屏幕截图。

您可以看看下面完全组合的 Python 脚本:

电子邮件通知

计划您的机器人

现在,是时候让你的机器人每隔 xx 分钟或 yy 小时或 zz 天定期运行一次了。另外,你应该添加一个发送消息的条件,因为你不需要在 10 分钟内收到 100 封举报邮件。所以你可以这样做:

  • 设置阈值,以便仅在报告了新的 XXXX 病例时发送电子邮件通知。一个普通的if..else..算法运行良好。
  • 使用while true: .../ time.sleep()安排您的机器人
  • 在 Mac/Linux 上使用CRON 或者在 Windows 上使用 Windows 任务调度器来调度你的机器人。
  • 如果你想要一个替代的方法来管理你的脚本定期运行,我推荐使用 PM2 来完成。

结论

本文以新冠肺炎电子邮件通知机器人为例,给出了构建用于自动和定期发送电子邮件的 Python 脚本的演练。本教程中使用的电子邮件发送者是 G-mail,但是可以用任何电子邮件提供商来代替。本文的主要 Python 模块包括**smtplib, request, datetime, bs4** ,我的主要概念是使用最简单的方法来完成工作。✌

作者消息

我希望你喜欢这篇文章,并发现它对你的日常工作或项目有用。如果你有任何问题,请随时联系我。

关于我&查看我所有的博客内容:链接

平安健康!
感谢阅读。👋😄

德国的电动汽车:电动汽车充电站分析

原文:https://towardsdatascience.com/e-mobility-in-germany-analysis-of-electric-vehicle-charging-stations-58d797988738?source=collection_archive---------29-----------------------

慕尼黑是德国电动汽车的领导者💚

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

Jannes Glas 在 Unsplash 上的照片

电动汽车在保证全球未来可持续发展方面发挥着重要作用。电动汽车的受欢迎程度正在持续增加,它们代表了内燃机的一种有吸引力的替代品。然而,为了确保电动汽车的成功,需要为电动汽车充电提供良好的基础设施。

在本文中,我们分析了位于德国各地的充电站。该数据可在以下网页上找到,其中包含向联邦政府报告的德国 ( )可用的公共充电点**!**)。在其他来源中,您可能会发现此数据集中没有的充电位置。

[## 联邦铁路公司

卡丁车是德国最大的汽车制造商之一,是德国最大的汽车制造商之一…

www.bundesnetzagentur.de](https://www.bundesnetzagentur.de/DE/Sachgebiete/ElektrizitaetundGas/Unternehmen_Institutionen/HandelundVertrieb/Ladesaeulenkarte/Ladesaeulenkarte_node.html)

文章分为四个部分:

  • 德国电动汽车充电站数据集
  • 数据帧翻译
  • 探索性数据分析和数据清理
  • 回答问题并得出结论

如果你只对得到的结果感兴趣,直接进入文章的最后部分!▶️

德国电动汽车充电站数据集

bundesnetzagentur . de下载 CSV 文件后,我们可以使用Pandas . read _ CSV函数将其加载到 Pandas 数据框中,并使用 pandas 可视化前 5 行。data frame . head方法。

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

如上所示,我们跳过了文件开头的 5 行(skip prows = 5),因为它们不包含有用的信息(只是关于正在显示的数据的注释)。

数据帧翻译

Bundesnetzagentur 提供德语数据集。因此,在开始探索性数据分析之前,我们必须将数据集翻译成英语。首先,我们使用 熊猫来翻译列名。data frame . renameT5 功能。

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

然后,我们使用熊猫翻译列的条目。Series.replace 方法如下所示。****

我们不打算翻译其余栏目的条目。但是,如果您想翻译它们,您可以使用 googletrans 库,因为这些列包含多个独特的元素。在这种情况下,硬编码翻译将非常耗时。

** [## 使用 googletrans 库翻译熊猫数据框

Googletrans 是一个使用 Google Translate API 的免费 python 库。在这篇文章中,我们解释了如何使用…

towardsdatascience.com](/translate-a-pandas-data-frame-using-googletrans-library-fb0aa7fca592)

数据帧被翻译!现在,我们准备开始探索性数据分析

探索性数据分析和数据清理

探索性数据分析包括分析数据集的主要特征,通常采用可视化方法汇总统计。目标是理解数据,发现模式和异常,并在我们执行进一步评估之前检查假设。

在 EDA 之初,我们想知道尽可能多的关于数据的信息,这是当 熊猫的时候。data frame . info方法就派上用场了。此方法打印数据框的简明摘要,包括列名及其数据类型、非空值的数量、数据框使用的内存量。

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

如上图所示,数据帧包含 13551 个观测值和 22 个变量。列 type_of_plug_2、p2[kw]、type_of_plug_3、p3[kw]、type_of_plug_4 和 p4[kw]包含空值,意味着第二、第三和第四充电点在充电站不可用(记住一个充电站可以有多个充电点)。我们使用 熊猫用字符串‘0’替换空值**。series . fillna**功能,表示没有充电点。

****公钥是允许用户远程检查测量值的数字序列。由于它们不能为我们的分析提供有用的信息,我们将删除这些列。

正如我们在下面看到的,现在,数据帧不包含空值。

删除空值后,我们修改不正确的数据类型。我们可以使用 pandas 来检查列的数据类型。data frame . info方法(就像我们之前做的)或者用 熊猫。DataFrame.dtypes 属性。该属性返回包含每列数据类型的序列。

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

如上图所示,以下各列:(1)longitude [DG],(2) latitude[dg],(3) power_connection_[kw],(4) p1_[kw],(5) p2_[kw],(6) p3_[kw],(7) p4_[kw]为数据类型 object 而非 float 。我们可以用 熊猫。Series.astype 方法将这些列的数据类型转换为 float,将之前的逗号替换为点。

此外,我们必须将列调试日期转换为日期时间。为了实现这一点,我们可以使用 pandas.to_datetime 方法,指定格式来匹配数据。

现在,我们可以运行 熊猫了。DataFrame.info 方法再次检查不适当的数据类型空值是否被正确修改。

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

如上所示,数据集不包含空值,数据类型是预期的类型。

整齐数据集具有以下结构:

  • 每个变量在一个中。
  • 每个观察值位于不同的行。
  • 每种类型的观测单元在不同的表格中。

正如您所看到的,列邮政编码 _ 城市包含两个变量:(1)邮政编码和(2)城市;因此,我们需要将该列拆分为两个不同的列。为此,我们可以用串法拆分( )熊猫。Series.str.split ),设置参数 n=1expand=True

在 Pandas 中处理对象列时,前导空格和尾随空格是一个常见问题。我们必须确保列的条目在开头和结尾不包含空格,因为它们可能会在分析数据时导致错误的结论。

下面的代码显示了几个城市名称包含前导或尾随空格。

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

我们需要删除它们以避免数据分组时出现问题,因为如果我们不删除前导空格,例如“雷根斯堡”和“雷根斯堡”将被视为不同的城市。

**如下所示,我们遍历对象数据类型的列,删除带有**熊猫的条目开头和结尾的所有空格。方法。

最后,我们必须解决最后一个也是更具挑战性的清洁问题。在某些情况下,数据集中出现了同一城市的两个不同名称(如法兰克福和美因河畔法兰克福)。在其他时候,区名也与城市名一起被记录(例如斯图加特-慕尼黑)。

我们可以用 熊猫来识别错误的城市名称。Series.str.contains 的方法如下所示。

我们寻找德国最重要的城市,并创建了一本字典,将错误的名称映射到正确的名称上。然后,我们用这本字典来解释熊猫。Series.replace 函数修改错误的城市名。

数据集包含更多的错误名称,但至少我们已经纠正了稍后将出现在可视化中的城市名称。

最后,我想指出数据框包含多个重复的行,如下所示。

这些重复的观测值不应被删除,因为它们代表位于同一点的几个充电站。

数据清理完成💚。现在,我们准备回答问题,并利用数据得出结论。

回答问题并得出结论

探索性数据分析数据清理是让我们对数据有一个感觉并准备好轻松得出结论的步骤。现在!我们准备使用数据集回答以下问题。****

联邦各州的充电站数量

下图显示巴伐利亚州(3090) 是电动汽车充电站数量最多的州,其次是北莱茵-威斯特伐利亚州(2392)巴登-符腾堡州(1942)。相反,****萨尔州只有91 个 EV 充电站。这是有道理的,因为萨尔州是一个人口稀少的州,没有大城市。****

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

德国哪些城市拥有最多的 EV 充电站?

如下图,慕尼黑(607)德国电动汽车充电站最多的城市,其次是汉堡(535)** 和柏林(519) 。科隆排名第四;但是它的充电站**【134】要少得多。****

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

事实上,德国超过 12% 的充电站位于慕尼黑汉堡,或者柏林如下图。

德国哪些城市的电动汽车充电站最多?

一个充电站可以有多个充电点。下面的饼图描绘了具有 1、2、3 和 4 个充电点充电站的百分比。

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

如上图,德国超过 80%的充电站有 2 个充电点。相反,只有 1.3% 的站有 3 个负荷点。

下面的图显示慕尼黑汉堡柏林也是拥有最多电动汽车充电点的城市。

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

充电站是什么时候投入运营的?

下图显示了每年有多少充电站投入运行(调试日期)。正如您所观察到的,近年来安装的新充电站的数量呈增长趋势。

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

如上图所示,除了 20122020 之外,本年与上年的变动百分比始终为正。需要指出的是,数据集包含 2020 年 5 月 5 日之前的信息。

然而,由于冠状病毒危机,预计 2020 年的新充电站数量将少于 2019 年****

德国充电站的电力

电动汽车的充电时间取决于充电点的电量和车辆的电池容量**。******

充电时间[h] =电池容量[kwh] /充电功率[kw]

因此,充电点的功率输出是一个需要考虑的重要因素,因为它决定了充电速度

下表显示了德国充电点最常见的电源输出

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

2074122kW 的充电点,这是德国最常见的功率输出,其次是 11kW 。另一方面,**超快速150 kw**和 350kW 的充电点较少见;然而,你可以在德国找到超过 450 个这样的人。****

如下图,我们可以找到 62 种不同的动力输出用于德国的电动汽车充电。这些输出按升序排列如下,最常见的是 22.0、11.0、50.0、43.0、3.7、350.0、150.0、42.0、20.0、53.0 千瓦(见上表)。

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

下面的饼图显示了根据功率输出的充电点百分比。

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

大家可以观察到,德国充电点中的 78.28%充电功率为 22kW。超快速充电器( 350kW )仅占总充电点的 1.24% ,是德国安装的最大充电功率。

超快速充电器(> 300 kW)位于哪里?它们是什么时候安装的?

超快速充电点是指充电功率大于或等于 300 kW 的点。正如我们在上面看到的,只有三种不同的功率输出符合这个要求: 300,320,350 kW

下面这段代码显示,德国有 6 个 300 kW 的充电点、10 个 320 kW 的充电点、328 个 350 kW 的充电点在运行,总共有 344 个超快速充电点

如前所述,一个充电站可以有多个充电点。在德国,我们可以找到多达 4 个充电点的充电站。

共有 341 个带超快速充电点的充电站,如下图所示。

350 kW 和 320 kW 的充电点位于只有一个充电点的充电站。相反,有 3 个充电站,2 个 300 kW 的充电点,如下图所示。

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

这些主要位于巴伐利亚,在那里你可以找到超过 80 个带超快速充电器的站

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

下图为站带超快速充电器 ( > 300 kW )于 2018 首次投入运行。此外,我们观察到大多数配备超快速充电器的站点安装在 2019 年。

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

德国第一个 EV 充电站是在 2008 年 7 月安装的,直到 10 年后的 2018 年 3 月,才安装了第一个带有超快速充电器(> 300 kW)的站。

德国最大城市运营的电动汽车充电站总数

接下来我们要一步一步的说明如何获得德国最大城市按年的充电站总数:(1)柏林,(2)汉堡,(3)慕尼黑,(4)科隆,(5)美因河畔法兰克福,(6)斯图加特,(7)杜塞尔多夫,(8)多特蒙德,(9)埃森,(10)莱比锡。

首先,我们用 熊猫。data frame . group by函数。这个函数涉及到拆分对象、应用一个函数、组合结果的一些组合。

我们获得了一个多索引数据框,因为按两列分组将得到两个索引。我们选择一列(例如 operator),因为所有列都提供相同的信息(计数)。然后,我们用 熊猫。data frame . un stack功能。该函数将最内层的索引级别透视到新的列级别。结果是一个数据帧( date_cities ),其中表示城市,而表示试运行日期,即在特定年份和城市投入运行的充电站数量的值。因为我们只想分析德国最大的城市,所以我们在数据框中选择相应的列( date_cities_10 )。****

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

上面的数据框包含在特定的城市投入运营的充电站的数量。由于我们对多年来各个城市的充电站总数感兴趣,所以我们必须计算累计总数,用 0 替换之前的空值。然后,我们使用 plot 函数创建一个多线绘图,其中每条线代表一个城市。

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

如上图所示,科隆、法兰克福、斯图加特、杜塞尔多夫、多特蒙德、埃森和莱比锡的充电站总数逐年缓慢增长。相反,自 2016 年以来,柏林、汉堡和慕尼黑的增长率要大得多。

慕尼黑充电站分布

分析地理空间数据的最佳方式是使用地图。leave是一个数据可视化库,允许直接从你的 Python 代码生成传单网络地图。首先,我们需要安装它,因为叶子包不是 Python 标准库的一部分。为此,我们在 Windows 终端中运行以下命令:

pip 安装叶片

安装并导入叶子后,我们可以用叶子.地图()函数生成一个地图对象。位置参数允许我们在一个特定的位置将地图居中(在我们的例子中是慕尼黑**)。我们还可以提供一个初始缩放级别来将地图缩放到中心。**

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

生成的地图是交互式的,这意味着您可以轻松地放大和缩小。

数据框包含充电站所在的纬度和经度。我们可以使用 CircleMarker() 函数在这些位置绘制圆形标记。

下图显示了充电站在慕尼黑的位置。正如你所观察到的,充电站相当均匀地分布在整个城市。然而,市中心的车站比郊区的多。

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

在上图中,您可以观察到一些标记比其他标记更不透明,这意味着多个桩号位于同一点(重叠的圆形标记)。

正如我们之前提到的,一个充电站可以有多个充电点。慕尼黑的充电站数量遵循以下分布:

  • 1 个充电点:3.95%
  • 2 个充电点:95.06%
  • 3 个充电点:0.16%
  • 4 个充电点:0.82%

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

我们可以根据充电点的数量定制标记的半径和颜色,如下所示。

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

正如你所观察到的,大多数加油站都有两个充电点(紫色的点)。有 4 个充电点(蓝点)的车站位于慕尼黑郊区。

数据帧包含一列,指示充电站的类型:(1)普通,或(2)快速。如果一个充电站至少有一个输出功率大于 22kw 的充电点,则认为它是快速的,如下所示。

在下图中,正常充电站用蓝色标记表示。相反,快充站用红色表示。

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

如上图所示,大部分站点正常**,意味着所有充电点的功率输出都低于 22kW 。慕尼黑只有 10 个快充站。阿拉贝拉公园(及周边)是快速充电站较多的地方(总共 5 个)。**

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

现在轮到你了!您可以生成其他城市的地图,并可视化充电站在这些城市中的分布情况🌐

我们的分析到此结束。然而,仍然有许多问题你可以用这些数据来回答。比如:有多少家公司在管充电站?德国有多少种不同的插头?德国最常见的插头是哪个?…还有更多!🙋

关键要点

  • 巴伐利亚联邦州拥有更多电动汽车充电站(大约 3000 个)。
  • 慕尼黑汉堡柏林德国电动汽车充电站数量最多的城市。
  • 一个充电站可以有多个充电点** (1、2、3 或 4)。德国超过 80%的电动汽车充电站拥有 2 个充电点。**
  • 这些年来,运营中的新充电站的数量在增加。
  • ****德国充电点78.3% 充电功率为 22kW超快速充电器 ( 350kW )仅占总充电点数的 1.24%
  • 第一台超快速充电器(> 300kW)** 于 2018 年投入运行。**
  • 科隆、法兰克福、斯图加特、杜塞尔多夫、多特蒙德、埃森和莱比锡的充电站总数逐年缓慢增长。相反,自 2016 年以来,柏林、汉堡和慕尼黑的增长率要大得多。

感谢阅读💜

阿曼达

TensorFlow 中的急切执行与图形执行:哪个更好?

原文:https://towardsdatascience.com/eager-execution-vs-graph-execution-which-is-better-38162ea4dbf6?source=collection_archive---------3-----------------------

←Part 1|←Part 2|←Part 3|深度学习用 TENSORFLOW 2。X —第 4 部分

使用代码示例比较急切执行和图形执行,了解何时使用两者以及 TensorFlow 为何切换到急切执行|使用 TensorFlow 2.x 进行深度学习

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

图一。急切执行与图形执行(图由作者提供)

T 这是 TensorFlow 2.x 系列深度学习的第 4 部分,我们将比较 TensorFlow 中可用的两个执行选项:

急切执行与图形执行

你可能没有注意到,你实际上可以在这两者中选择一个。原因是 TensorFlow 将急切执行设置为默认选项,除非您想找麻烦,否则它不会打扰您😀。但是,在 TensorFlow 1.x 版本中并非如此。让我们看看什么是急切执行,以及为什么 TensorFlow 在 TensorFlow 2.0 中从图形执行进行了重大转变。

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

图二。图形执行与急切执行的类比(由詹姆斯·庞德拍摄于 Unsplash |由 TVBEATS 拍摄于 Unsplash

急切的执行

渴望执行是一个强大的执行环境,它可以立即评估操作。它不构建图形,并且操作返回实际值,而不是稍后运行的计算图形。通过快速执行,TensorFlow 计算代码中出现的张量值。

急切执行简化了 TensorFlow 中的模型构建体验,您可以立即看到 TensorFlow 操作的结果。由于急切执行直观且易于测试,因此对于初学者来说是一个极好的选择。热切执行不仅使调试更容易,而且还减少了对重复样板代码的需求。急切执行也是研究和实验的一个灵活选项。它提供:

  • 具有自然 Python 代码和数据结构的直观界面
  • 调试更简单,直接调用操作检查测试模型;
  • 自然控制流用 Python,代替图形控制流;和
  • 支持 GPU & TPU 加速。

在急切执行中,TensorFlow 操作由原生 Python 环境一个接一个地执行。这使得急切执行(I)易于调试,(ii)直观,(iii)易于原型化,以及(iv)对初学者友好。由于这些原因,TensorFlow 团队将急切执行作为 TensorFlow 2.0 的默认选项。但是,在接下来的章节中会有更多相关内容……

让我们来看看图形执行。

图形执行

我们在上一节中介绍了急切执行是多么有用和有益,但是有一个问题:

急切执行比图形执行慢!

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

图 3。在 Tensorboard 中的模型示例的图形可视化(图片由作者提供)

由于急切执行在 Python 中逐个运行所有操作,因此它不能利用潜在的加速机会。Graph execution 从 Python 中提取张量计算,并在评估之前构建一个高效的。图形,或者说tf.Graph对象,是带有tf.Operationtf.Tensor对象的特殊数据结构。tf.Operation对象代表计算单元,tf.Tensor对象代表数据单元。无需原始 Python 代码就可以保存、运行和恢复图形,这为跨平台应用程序提供了额外的灵活性。有了图,您可以在 Python 不可用的移动、嵌入式和后端环境中利用您的模型。在本系列的稍后阶段,我们将看到,无论您选择哪一个执行选项,经过训练的模型都被保存为图形。

图表很容易优化。它们允许编译器级别的转换,例如具有常数折叠的张量值的统计推断,在线程和设备之间分布操作的子部分(高级级别分布),并简化算术运算。抓钩执行这些整体优化操作。在图形执行中,只有在我们完全调用了程序之后,才会对所有操作进行评估。因此,总而言之,图形执行是:

  • 非常快
  • 非常灵活
  • 并行运行,即使在子操作层面;和
  • 非常高效,适用于多种设备
  • 拥有 GPU & TPU 加速能力。

因此,尽管难以学习、难以测试且不直观,图形执行对于大型模型训练来说是理想的。对于小型模型培训、初学者和一般开发人员来说,急切执行更适合。

嗯,考虑到急切执行易于构建和测试,而图形执行高效而快速,您会希望用急切执行来构建,用图形执行来运行,对吗?好吧,我们会谈到那个…

寻找两全其美的世界?一个快速但易于构建的选项?继续读:)

在深入代码示例之前,我们先来讨论一下为什么 TensorFlow 在 TensorFlow 2.0 中从图形执行切换到急切执行。

TensorFlow 为什么采用急切执行?

在 2.0 版本之前,TensorFlow 优先考虑图形执行,因为它快速、高效且灵活。对于经验丰富的程序员来说,实现的难度只是一种权衡。另一方面, PyTorch 采用了一种不同的方法,并对动态计算图进行了优先级排序,这是一个类似于急切执行的概念。尽管动态计算图不如 TensorFlow 图执行效率高,但它们为新一波研究人员和人工智能程序员提供了一个简单而直观的界面。默认执行策略的这种差异使得 PyTorch 对新来者更有吸引力。很快,PyTorch 虽然是后来者,却开始追赶 TensorFlow。

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

图 4。TensorFlow vs. PyTorch 谷歌搜索结果由谷歌趋势(图由作者提供)

在看到 PyTorch 越来越受欢迎后,TensorFlow 团队很快意识到他们必须优先考虑急切执行。因此,他们采用了急切执行作为默认的执行方式,而图形执行是可选的。这就好比,PyTorch 将动态计算图设置为默认的执行方法,你可以选择使用静态计算图来提高效率。

由于现在 TensorFlow 和 PyTorch 都采用了初学者友好的执行方法,PyTorch 失去了对初学者的竞争优势。目前,由于其成熟性,TensorFlow 占据上风。然而,毫无疑问,PyTorch 也是构建和训练深度学习模型的一个很好的替代方案。选择权在你…

用渴望编码,用图形执行

在这一节中,我们将使用基本代码示例比较急切执行和图形执行。为了简单起见,我们将有意避免构建复杂的模型。但是,在本系列接下来的部分中,我们还可以使用更复杂的模型来比较这些执行方法。

我们已经提到 TensorFlow 优先考虑急切执行。但这还不是全部。现在,您实际上可以像急切执行一样构建模型,然后用图形执行来运行它。TensorFlow 1.x 需要用户手动创建图表。然后通过将一组输出张量和输入张量传递给一个session.run()调用来手动编译这些图形。但是,在 TensorFlow 2.0 中,图形构建和会话调用被简化为实现细节。这种简化是通过用tf.function()装饰者代替session.run()来实现的。在 TensorFlow 2.0 中,您可以使用tf.function()来修饰 Python 函数,使其作为单个 graph 对象运行。使用这种新方法,您可以轻松地构建模型,并获得图形执行的所有好处。

代码示例

这篇文章将通过几个基本的例子和一个完整的虚拟模型来测试 eager 和 graph 的执行。请注意,由于这是一篇介绍性的帖子,我们现在不会深入到一个完整的基准测试分析*。*

基本示例

我们将从两个初始导入开始:

*[**timeit**](https://docs.python.org/2/library/timeit.html) is a Python module which provides a simple way to time small bits of Python and it will be useful to compare the performances of eager execution and graph execution.*

要运行一个热切执行的代码,我们不需要做什么特别的事情;我们创建一个函数,传递一个tf.Tensor对象,然后运行代码。在下面的代码中,我们创建了一个名为eager_function的函数来计算张量值的平方。然后,我们创建一个tf.Tensor对象,最后调用我们创建的函数。我们的代码以急切的执行方式执行:

***Output:** tf.Tensor([ 1\.  4\.  9\. 16\. 25.], shape=(5,), dtype=float32)*

让我们首先看看如何用图形执行来运行相同的函数。

***Output:** Tensor("pow:0", shape=(5,), dtype=float32)*

通过用tf.function()函数包装我们的eager_function,我们能够用图形执行来运行我们的代码。我们可以用如下所示的timeit来比较这两种方法的执行时间:

*Output:
Eager time: 0.0008830739998302306
Graph time: 0.0012101310003345134*

如您所见,图形执行花费了更多的时间。但是为什么呢?嗯,对于简单的操作,图形执行的表现并不好,因为它必须花费初始计算能力来构建一个图形。我们看到了图形执行在复杂计算中的威力。如果我运行代码 100 次(通过更改 number 参数),结果会发生巨大的变化(主要是由于本例中的 print 语句):

*Output:
Eager time: 0.06957343100020807 
Graph time: 0.02631650599960267*

全模型试验

既然您已经介绍了基本的代码示例,那么让我们构建一个虚拟神经网络来比较 eager 和 graph 执行的性能。我们将:

1-使 TensorFlow 导入使用所需的模块;

2 —建立基本前馈神经网络;

3 —创建一个随机的Input对象;

4 —以热切的执行来运行模型;

5-用tf.function()包装模型,用图形执行运行它。

*If you are new to TensorFlow, don’t worry about how we are building the model. We will cover this in detail in the upcoming parts of this Series.*

以下代码行执行所有这些操作:

*Output:
Eager time: 27.14511264399971
Graph time: 17.878579870000067*

正如您所看到的,我们的图形执行比急切执行多了 40%左右。在更复杂的模型训练操作中,这个余量要大得多。

最终注释

在这篇文章中,我们比较了急切执行和图形执行。虽然急切执行易于使用且直观,但图形执行更快、更灵活、更健壮。因此,对于初学者来说,使用缺省选项“急切执行”是显而易见的。然而,如果你想利用灵活性和速度,并且是一个经验丰富的程序员,那么图形执行是适合你的。另一方面,由于 TensorFlow 的最新改进,使用图形执行变得更加简单。因此,您甚至可以突破自己的极限来尝试图形执行。但是,请确保您知道在图形执行中调试也更加困难。

上面的代码示例向我们展示了对简单的示例应用图形执行是很容易的。对于更复杂的模型,图形执行会带来一些额外的工作负载。

*Note that when you wrap your model with tf.function(), you cannot use several model functions like model.compile() and model.fit() because they already try to build a graph automatically. But we will cover those examples in a different and more advanced level post of this series.*

恭喜

我们已经成功地比较了急切执行和图形执行。

给自己一个鼓励!

这应该会给你很大的信心,因为你现在对急切执行、图形执行以及使用这些执行方法的利弊有了更多的了解。

订阅邮件列表获取完整代码

如果你想获得 Google Colab 的全部代码和我的其他最新内容,可以考虑订阅邮件列表。

现在就订阅

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

如果您刚刚开始使用 TensorFlow,请考虑从本教程系列的第 1 部分开始:

* [## 深度学习应用 TensorFlow 2.x 初学者指南

了解 TensorFlow 平台以及它能为机器学习专家提供什么

towardsdatascience.com](/beginners-guide-to-tensorflow-2-x-for-deep-learning-applications-c7ebd0dcfbee)

检查第二部分:

[## 通过 5 个简单的步骤掌握 TensorFlow 张量

探索 TensorFlow 的构建模块如何在较低的级别工作,并学习如何充分利用张量…

towardsdatascience.com](/mastering-tensorflow-tensors-in-5-easy-steps-35f21998bb86)

或者检查第 3 部分:

[## 用 5 个简单的步骤掌握 TensorFlow“变量”

了解如何使用张量流变量,它们与普通张量对象的区别,以及它们何时优于…

towardsdatascience.com](/mastering-tensorflow-variables-in-5-easy-step-5ba8062a1756)*

基于深度学习和 OpenCV 的早期火灾探测系统

原文:https://towardsdatascience.com/early-fire-detection-system-using-deep-learning-and-opencv-6cb60260d54a?source=collection_archive---------3-----------------------

深度学习| OpenCV

为室内和室外火灾探测创建定制的 InceptionV3 和 CNN 架构。

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

伊利亚·安东内尔在 Unsplash 上的照片

嵌入式处理领域的最新进展已经允许基于视觉的系统在监控期间使用卷积神经网络来检测火灾。在本文中,我们实现了两个定制的 CNN 模型,为监控视频提供了一个经济高效的火灾探测 CNN 架构。第一个模型是受 AlexNet 架构启发定制的基本 CNN 架构。我们将实现并查看它的输出和限制,并创建一个定制的 InceptionV3 模型。为了平衡效率和准确性,考虑到目标问题的性质和射击数据,对模型进行微调。我们将使用三个不同的数据集来训练我们的模型。数据集的链接可以在本文末尾找到。让我们进入编码部分。

1.创建定制的 CNN 架构

我们将使用 TensorFlow API Keras 构建我们的模型。让我们首先创建 ImageDataGenerator 来标记我们的数据。[1]和[2]数据集在这里用于训练。最后,我们将有 980 幅图像用于训练,239 幅图像用于验证。我们也将使用数据增强。

import tensorflow as tf
import keras_preprocessing
from keras_preprocessing import image
from keras_preprocessing.image import ImageDataGeneratorTRAINING_DIR = "Train"
training_datagen = ImageDataGenerator(rescale = 1./255,
                                  horizontal_flip=True,
                                  rotation_range=30,
                                  height_shift_range=0.2,
                                  fill_mode='nearest')VALIDATION_DIR = "Validation"
validation_datagen = ImageDataGenerator(rescale = 1./255)
train_generator = training_datagen.flow_from_directory(TRAINING_DIR,
                                         target_size=(224,224),
                                         class_mode='categorical',
                                         batch_size = 64)validation_generator = validation_datagen.flow_from_directory(      
                                           VALIDATION_DIR,
                                           target_size=(224,224),
                                           class_mode='categorical',
                                           batch_size= 16)

在上面的代码中,应用了 3 种数据扩充技术——水平翻转、旋转和高度移动。

现在,我们将创建我们的 CNN 模型。该模型包含三个 Conv2D-MaxPooling2D 层对,后跟三个密集层。为了克服过度拟合的问题,我们还将增加脱落层。最后一层是 softmax 层,它将给出火灾和非火灾这两个类别的概率分布。还可以在最后一层使用“sigmoid”激活函数,将类的数量改为 1。

from tensorflow.keras.optimizers import Adam
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(96, (11,11), strides=(4,4), activation='relu', input_shape=(224, 224, 3)), tf.keras.layers.MaxPooling2D(pool_size = (3,3), strides=(2,2)),
tf.keras.layers.Conv2D(256, (5,5), activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size = (3,3), strides=(2,2)),
tf.keras.layers.Conv2D(384, (5,5), activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size = (3,3), strides=(2,2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(2048, activation='relu'),
tf.keras.layers.Dropout(0.25),
tf.keras.layers.Dense(1024, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(2, activation='softmax')])model.compile(loss='categorical_crossentropy',
optimizer=Adam(lr=0.0001),
metrics=['acc'])history = model.fit(
train_generator,
steps_per_epoch = 15,
epochs = 50,
validation_data = validation_generator,
validation_steps = 15
)

我们将使用 Adam 作为优化器,学习率为 0.0001。经过 50 个周期的训练,我们得到了 96.83 的训练准确率和 94.98 的验证准确率。训练和验证损失分别为 0.09 和 0.13。

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

我们模型的训练过程

让我们对任何图像测试我们的模型,看看它是否能猜对。为了测试,我选择了 3 张图片,包括一张火的图片,一张非火的图片,还有一张我的图片,包含火一样的颜色和阴影。

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

在这里,我们可以看到我们上面创建的模型在对我的图像进行分类时犯了一个错误。模型有 52%的把握图像中有火。这是因为它被训练的数据集。在数据集中很少有图像教导关于室内火灾的模型。因此,该模型只知道室外火灾,因此当给定一个室内火灾一样的阴影图像时,它会出错。另一个原因是,我们的模型不是一个可以学习火的复杂特征的复杂模型。

我们接下来要做的是,使用标准的 InceptionV3 模型并对其进行定制。复杂模型能够从图像中学习复杂特征。

2.正在创建自定义的 InceptionV3 模型

这次我们将使用一个不同的数据集[3],这个数据集包含室外和室内的火灾图像。我在这个数据集中训练了我们以前的 CNN 模型,结果是它过度拟合,因为它无法处理这个相对较大的数据集,也无法从图像中学习复杂的特征。

让我们从为我们定制的 InceptionV3 创建 ImageDataGenerator 开始。数据集包含 3 个类,但是对于本文,我们将只使用 2 个类。它包含 1800 幅用于训练的图像和 200 幅用于验证的图像。此外,我添加了我的起居室的 8 张图像,以在数据集中添加一些噪声。

import tensorflow as tf
import keras_preprocessing
from keras_preprocessing import image
from keras_preprocessing.image import ImageDataGeneratorTRAINING_DIR = "Train"
training_datagen = ImageDataGenerator(rescale=1./255,
zoom_range=0.15,
horizontal_flip=True,
fill_mode='nearest')VALIDATION_DIR = "/content/FIRE-SMOKE-DATASET/Test"
validation_datagen = ImageDataGenerator(rescale = 1./255)train_generator = training_datagen.flow_from_directory(
TRAINING_DIR,
target_size=(224,224),
shuffle = True,
class_mode='categorical',
batch_size = 128)validation_generator = validation_datagen.flow_from_directory(
VALIDATION_DIR,
target_size=(224,224),
class_mode='categorical',
shuffle = True,
batch_size= 14)

为了使训练更加准确,我们可以使用数据增强技术。在上面的代码中,应用了两种数据扩充技术——水平翻转和缩放。

让我们从 Keras API 导入我们的 InceptionV3 模型。我们将在 InceptionV3 模型的顶部添加我们的层,如下所示。我们将添加一个全局空间平均池层,然后是 2 个密集层和 2 个下降层,以确保我们的模型不会过度拟合。最后,我们将为 2 个类添加一个 softmax 激活的密集层。

接下来,我们将首先只训练我们添加并随机初始化的层。这里我们将使用 RMSprop 作为优化器。

from tensorflow.keras.applications.inception_v3 import InceptionV3
from tensorflow.keras.preprocessing import image
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, GlobalAveragePooling2D, Input, Dropoutinput_tensor = Input(shape=(224, 224, 3))
base_model = InceptionV3(input_tensor=input_tensor, weights='imagenet', include_top=False)x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(2048, activation='relu')(x)
x = Dropout(0.25)(x)
x = Dense(1024, activation='relu')(x)
x = Dropout(0.2)(x)
predictions = Dense(2, activation='softmax')(x)model = Model(inputs=base_model.input, outputs=predictions)for layer in base_model.layers:
  layer.trainable = Falsemodel.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['acc'])history = model.fit(
train_generator,
steps_per_epoch = 14,
epochs = 20,
validation_data = validation_generator,
validation_steps = 14)

在对我们的顶层进行 20 个时期的训练之后,我们将冻结模型的前 249 层,并训练其余的层,即前 2 个先启块。这里,我们将使用 SGD 作为优化器,学习率为 0.0001。

#To train the top 2 inception blocks, freeze the first 249 layers and unfreeze the rest.for layer in model.layers[:249]:
  layer.trainable = Falsefor layer in model.layers[249:]:
  layer.trainable = True#Recompile the model for these modifications to take effectfrom tensorflow.keras.optimizers import SGD
model.compile(optimizer=SGD(lr=0.0001, momentum=0.9), loss='categorical_crossentropy', metrics=['acc'])history = model.fit(
train_generator,
steps_per_epoch = 14,
epochs = 10,
validation_data = validation_generator,
validation_steps = 14)

经过 10 个历元的训练,我们得到的训练准确率为 98.04,验证准确率为 96.43。训练和验证损失分别为 0.063 和 0.118。

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

上述 10 个时期的训练过程

让我们对相同的图像测试我们的模型,看看它是否能猜对。

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

这一次,我们的模型可以让所有三个预测正确。96%确定我的图像不包含任何火。我用于测试的另外两张图像是:

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

来自下面引用的数据集的非火灾图像

实时测试:

现在,我们的模型已经准备好接受真实场景的测试了。下面是使用 OpenCV 访问我们的网络摄像头并预测每一帧是否包含火焰的示例代码。如果一个帧中包含火,我们希望将该帧的颜色更改为 B&W

import cv2
import numpy as np
from PIL import Image
import tensorflow as tf
from keras.preprocessing import image#Load the saved model
model = tf.keras.models.load_model('InceptionV3.h5')
video = cv2.VideoCapture(0)while True:
        _, frame = video.read()#Convert the captured frame into RGB
        im = Image.fromarray(frame, 'RGB')#Resizing into 224x224 because we trained the model with this image size.
        im = im.resize((224,224))
        img_array = image.img_to_array(im)
        img_array = np.expand_dims(img_array, axis=0) / 255
        probabilities = model.predict(img_array)[0]
        #Calling the predict method on model to predict 'fire' on the image
        prediction = np.argmax(probabilities)
        #if prediction is 0, which means there is fire in the frame.
        if prediction == 0:
                frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
                print(probabilities[prediction])cv2.imshow("Capturing", frame)
        key=cv2.waitKey(1)
        if key == ord('q'):
                break
video.release()
cv2.destroyAllWindows()

下面是上面代码的实时输出。

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

Github 关于这个项目的链接是这里是。您可以在那里找到数据集和上面的所有代码。您可以从这里在 LinkedIn 上与我联系。如果有任何疑问,请在这里或我的 LinkedIn 收件箱中回复。

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

照片由 Anandaram GUnsplash 上拍摄

结论

使用智能摄像机,您可以识别各种可疑事件,如碰撞、医疗急救和火灾。其中,火灾是最危险的异常事件,因为不在早期阶段控制它会导致巨大的灾难,导致人类、生态和经济损失。受 CNN 巨大潜力的启发,我们可以在早期从图像或视频中检测火灾。本文展示了两个火灾探测的定制模型。考虑到 CNN 模型的火灾探测准确性,它可以帮助灾害管理团队及时管理火灾,从而防止巨大的损失。

本文使用的数据集:

[## 1.火灾探测数据集

标签 1 表示火灾,而 0 表示正常

www.kaggle.com](https://www.kaggle.com/atulyakumar98/test-dataset) [## 2.火灾数据集

用于计算机视觉任务的室外火灾图像和非火灾图像。

www.kaggle.com](https://www.kaggle.com/phylake1337/fire-dataset) [## 3.深水/火灾-烟雾-数据集

用于训练火和帧检测的图像数据集 AI 火-火焰数据集是收集用于训练的数据集…

github.com](https://github.com/DeepQuestAI/Fire-Smoke-Dataset)

从社会地理角度看越南的早婚现象

原文:https://towardsdatascience.com/early-marriage-in-vietnam-from-a-socio-geographic-perspective-a58b1f08d162?source=collection_archive---------36-----------------------

这个分析是我在 IBM 数据科学峰会上工作的一部分。

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

照片由 Hisu leeUnsplash 上拍摄

1.介绍

在越南,千禧一代正在推迟或推迟他们的婚姻。在过去十年里,初婚的平均年龄从 24.5 岁上升到了 25.5 岁。这一趋势直接加速了人口老龄化,给这个亚洲增长最快的经济体之一带来了巨大的担忧。根据规划投资部的数据,15 至 64 岁的越南人占人口的 68%。与此同时,65 岁及以上的人是增长最快的群体。这个年龄组在 2019 年占人口的 7.7%,高于 2009 年的 6.4%。

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

作者图片

由于越南官员担心该国部分地区的低生育率,他们鼓励年轻人在 30 岁之前结婚生子。在政府的最新公告中没有太多关于具体战略、政策或提供给地方当局的指导的信息。在深入研究解决方案之前,以下是此分析的两个主要动机:

  • 哪些因素可能推动了越南的晚婚趋势?
  • 地理区域之间结婚年龄有统计学差异吗?

回答第一个问题将会对越南的婚姻状况有一个清晰的了解。相比之下,第二个答案将在实现阶段支持较低级别的本地化(如果有)。

2.数据

2.1.数据理解和收集

以下是本分析中使用的所有资料来源:

  • 来自越南统计总局的统计数据,包括三个要素:(1)人口和就业;(2)教育;(3)健康、文化和生活水平(2020 年 5 月 29 日)。
  • 从越南统计总局2018 年劳动力调查报告中收集的就业工时数据。
  • 地理空间坐标:多边形数据集,包含开放开发湄公河数据库中越南各省政府的地理空间数据。这些 JSON 格式的数据为越南地图的可视化提供了输入。
  • 越南行政区划列表:省级/市级。该信息来自越南统计总局(GSO)(2020 年 5 月 29 日)。

2.2.数据清理

由于政府机构获取和组织的所有数据都是结构化的,因此不需要进行大规模的清理和处理。然而,收集的数据不是集中的,而是以不同的形式存在。例如,关于具有四个主要标准的生活水平的统计数据以四种不同的形式分配。因此,在将每个数据集合并到用于分析的主数据集之前,仔细检查每个数据集是非常重要的。完成了一些小的清洁任务,包括:

  • 从数据中删除越南口音,以便稍后分类
  • 更改省/市名称以匹配地理空间坐标(JSON 格式的多边形数据集)
  • 检查了每一列的数据类型
  • 删除重复记录

数据清理的输出(前 5 行)如下所示:

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

作者图片

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

作者图片

2.3.解释性数据分析— EDA

EDA 是指对数据进行初步调查,以发现模式、发现异常、测试假设,并在汇总统计和图形表示的帮助下检查假设。

首先,检查每个因素的数据分布,以确定它们的基本结构:

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

作者图片

接下来,进行散点图可视化以了解更多关于数据集之间的相关性,并为聚类模型选择数据特征。

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

作者图片

这两个步骤导致选择了与聚类建模最相关的八个数据变量,该模型用于进一步的分析。

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

作者图片

散点图验证:在下面的例子中,月收入和初婚年龄之间存在正线性关系。这表明不同地区不同年龄组的月收入存在差异。同时,在分析之前已经考虑到的生活费用指数已经从模型中删除。

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

作者图片

3.聚类分析

3.1.方法学

由于该项目涵盖了无监督的机器学习问题,K-Means 聚类方法被应用于基于经济、社会和统计普查的越南行政省/市概况。K-means 的目标很简单:将相似的数据点组合在一起,发现潜在的模式。为了实现这个目标,K-means 在数据集中寻找固定数量(K)的聚类。聚类是指由于某些相似性而聚集在一起的数据点的集合。

K-means 分析的第一步是通过将数据集中的数值列的值更改为一个通用范围来规范化数据要素,而不会扭曲值范围的差异。这是必需的,因为我们的功能有不同的范围。

接下来,我们通过评估聚类数之间的关系和聚类平方和(WCSS)来确定最佳聚类数。理想的集群数量是 WCSS 的变化开始趋于平稳的地方(肘法)。

3.2.使聚集

下面是聚类分析中使用的数据变量的结果选择:

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

作者图片

使用上面提到的数据探索技术和 Elbow 方法,我们得出了数字 3,这是最佳的集群数量。

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

作者图片

使用三个期望的聚类进行聚类分析,我们在越南有三组省/市,它们的位置反映了聚类本身。

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

作者图片

从统计角度来看,我们总结了三个集群:

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

作者图片

为了验证该分析,使用了两个用三种颜色表示的聚类图。第一个反映了三个集群在月收入和结婚年龄方面的区别。第二张图显示了密度上的簇之间的分离。人们倾向于在低密度的省/市早早结婚。

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

作者图片

3.3.洞察力

基于上述聚类分析,我们将三个聚类划分为三组省/市,其相关特征如下:

  • 第 1 组(第 0 类):偏远和欠发达地区(平均结婚年龄-22.8 岁)

这组记录了越南最早的婚姻。这些省份位于偏远和人口密度较低的地区,在经济和社会方面都欠发达。与其他地区相比,教育和培训方面的低投资可能会导致劳动力中的人口比例最低。

  • 第 2 组(第 1 组):人口适中的发展中地区(平均结婚年龄为 25.6 岁)

这一最大的群体包括 42 个城市/省份,其中许多是区域连接枢纽。这些地区被视为第 3 组(第 2 组)的下一级城市/省份,地理位置优越(湄公河三角洲、红河三角洲、沿海地区)。更多的人有机会接受高等教育,这是进入劳动力市场的关键。

  • 第三组(第二组):城市、中心和发展最快的地区(平均结婚年龄为 25.8 岁)

这个群体的平均结婚年龄最高。它包括河内、岘港和胡志明市——越南最大的三个城市。其他城市:海防、北宁、平阳和同奈也是最大的经济和工业中心。这个群体的人月收入最高,而且大部分都在职场。这些城市的移民数量逐年增加。

除此之外,上表总结的聚类分析还有其他一些发现:(1)第 1 组女性/男性比例为 100.8,其中人们结婚早,而第 3 组则下降到 95.8,其中晚婚更受欢迎。(2)就每周工作时间而言,第 3 组比第 1 组高 10%。这个群体的人倾向于优先考虑职业发展,而不是成家立业。(3)月收入与生活成本之间的相关性非常弱。(4)平阳的净迁移率最高,为 47.9,其他地区的平均迁移率为-2.1。

4.含义、结论和局限性

基于分析,以下是我的发现的总结,它解决了两个研究问题:(1)哪些因素可能导致了越南的晚婚?(2)不同地理区域之间的结婚年龄有统计学差异吗?

  • 收入和婚姻之间存在正相关关系:许多城市居民等待更长时间才能进入婚姻市场,而更多的职业机会来自家庭以外的教育和经济转型。
  • 农村和小城镇的早婚比城市多。随着蓬勃发展的经济将更偏远的贫困地区转变为城市地区,社会环境和生活水平发生了变化,人们不太可能结婚。
  • 流动性与结婚年龄相关。在流动性和迁移率高的发达地区,人们倾向于晚婚。

总之,鼓励年轻人在 30 岁前结婚对越南官员来说是一个挑战。由于推迟结婚被广泛认为是现代发展中社会的一个不可避免的趋势,解决人口老龄化问题可能需要在国家和省市层面采取长期措施,例如:在贫困地区投资教育和培训,以吸引更多的人加入劳动力队伍,扩大经济中心和网络以减少不必要的移民,或者平衡不同地理区域之间的生活条件。

毕竟,我愿意在未来花更多的时间来发展这种分析,目前这种分析非常简单和幼稚。存在以下一些限制:

获得的数据都来自 2018 年,忽略了不同时期的趋势

社会和经济数据没有考虑性别层面。女性就业人数的增加和女性受教育程度的迅速提高等数字可以解释女性的变化与婚姻减少之间更强的相关性。

一些省/市使用不同的特征来评估其教育、社会和经济发展。这些缺失的数据影响了 Elbow 方法寻找最佳聚类数的有效性。

你可以通过我的 Github 获得我的分析的更多细节。

早期停止介绍:一种有效的神经网络正则化工具

原文:https://towardsdatascience.com/early-stopping-a-cool-strategy-to-regularize-neural-networks-bfdeca6d722e?source=collection_archive---------13-----------------------

为什么以及如何使用提前停车

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

图片来源:Unsplash

过度拟合:

对于所有的机器学习和深度学习问题来说,过拟合是一个非常严重的问题。当您的模型在训练数据上表现良好,但无法在测试数据上复制这种表现时,您可以理解这种情况的发生。

如果你不太喜欢阅读博客,并且想开始写代码,请看看 Kaggle 笔记本,或者,你也可以看看我们的视频教程

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

图 1:三个模型的决策边界(图片来源:作者)

在上图中,我们看到一个二元分类问题(蓝色类和绿色类)。这三个图表示由三个模型获得的决策边界。第一个模型是做出更简单的假设,第二个模型是做一份体面的工作。

然而,真正的罪魁祸首是第三个模型,它试图记住训练数据,拾取训练数据中的微小波动,实际上对于完美的训练集精度来说走得太远了。模型的这种倾向被称为过拟合,这些模型没有学到很多东西,因此不能进一步应用它们的知识。(不能一概而论)

过拟合与模型参数的关系;

这些似乎是模型参数和过拟合之间的关系。让我们再来看看三个可供选择的模型,我们试图根据一个人多年的经验来预测他的工资

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

图 2:替代回归模型(图片来源:作者)

可以观察到-

  • 第一个模型有两个参数,解释了不同年份之间的联系。工资一般。只考虑 x 的线性项
  • 第二个模型有三个参数,它很好地解释了数据,并考虑了二次项
  • 第三个模型有四个参数,被诊断为过度拟合,它只是跟踪所有的工资。

最重要的部分来了,参数数量越多的模型越容易过度拟合,并且随着神经网络的参数数量越多,它越容易过度拟合。

正规化和提前停止:

对抗过度拟合这一诅咒的一般策略集被称为规则化,早期停止就是这样一种技术。

想法很简单。该模型试图通过调整参数来疯狂地追逐训练数据上的损失函数。现在,我们保留另一组数据作为验证集,当我们继续训练时,我们保留验证数据的损失函数记录,当我们看到验证集没有改进时,我们停止,而不是遍历所有时期。这种基于验证集性能的提前停止策略称为**提前停止。**下图对此进行了解释。

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

图 3:提前停止演示(图片来源:作者)

从图 3 中可以观察到

  • 在所有的时期,训练集的精确度持续增加
  • 然而,验证集精度在 8 到 10 个时期之间饱和。这里是模型可以停止训练的地方。

因此,早期停止不仅可以防止过度拟合,而且需要相当少的历元数来训练。

代码摘录:下面的代码演示了我们将 20%的训练数据作为验证集。

fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()trn_images, valid_images, trn_labels, valid_labels = train_test_split(train_images, train_labels,test_size=0.2)

一些其他的正则化技术是损失函数正则化、丢失、数据扩充等。如果有兴趣,你可以自担风险,在这个视频教程中浪费一些时间。

回调 API:

我们现在想到的一个问题是,当模型被训练时,我们如何监控发生了什么,以及如何保持跟踪?这就是我们从 Keras 回调 API 获得帮助的地方。

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

图 4:回调 API 的窗口模拟(来源:Unsplash)

回调 API 就像窗口,在黑盒模型训练过程中,允许我们监控,我们感兴趣的对象。

  • 一个回调是一个强大的工具,用于定制 Keras 模型在训练、评估或推断过程中的行为
  • 它可以让你定期保存你的模型到磁盘
  • 您可以在训练期间查看模型的内部状态和统计数据
  • 可以有多个回调一个用于保存,一个用于监控
  • 回调可以附加拟合评估预测 Keras 模型

当然,我们不能在任何时候看到中间值,它可以在训练开始时、训练停止时、时期结束时或一批训练结束时。

我们确实默认使用了一些回调函数,比如我们在模型编译中提到的度量和损失函数。在这种情况下,我们不需要附加任何回调 API 或窗口。这被称为基础回调 API 。下图显示了这一点。

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

图 5:基础回调 API(图片来源:作者)

提前停止回调的一些重要参数:

  • 监控:被监控的数量。默认情况下,它是验证丢失
  • min_delta: 符合改善条件的监控量的最小变化
  • 耐心:没有改善的周期数,在此之后训练将停止。
  • 模式:为{“自动”、“最小”、“最大”}之一。是最大化问题还是最小化问题,我们最大化精度,最小化损失。
  • restore_best_weights: 是使用最佳模型权重还是上一个时期权重

代码示例:

突出显示的部分是我们在模型拟合过程中需要做的唯一更改。

**callback = tf.keras.callbacks.EarlyStopping(patience=4, restore_best_weights=True)**
history1 = model2.fit(trn_images, trn_labels, epochs=50,validation_data=(valid_images, valid_labels),**callbacks=[callback]**)

结果:

这是在 Fashion MNSIT 上执行的,这是运行您的实验的一个很好的测试平台。

在没有提前停止的情况下,模型运行所有 50 个时期,我们得到 88.8%的验证准确度,而提前停止运行 15 个时期,测试集准确度是 88.1%。

这是其中一个种子值,总体而言,它清楚地表明我们实现了相当的结果,减少了 70%的时期。

========================================

谢谢你读到这里。这些是我们在加尔各答大学数据科学实验室创建的一些附加资源

a)用 Python 分类(https://www.youtube.com/playlist?list = plts 7 rwcd 0 do 2 zoo 4 sad 3 jrxnvfyxhd 6 _ S

b)用 Python(https://www.youtube.com/playlist?)进行聚类 list = plts 7 rwcd 0 do 3ts 44 xgwgvgxmeohyfi 3pm

参考资料:

[1]https://medium . com/@ upendravijay 2/early-stopping-to-avoid-over-fitting-in-neural-network-keras-b 68 c 96 ed 05d 9

[2]https://towards data science . com/a-practical-introduction-to-early-stopping-in-machine-learning-550 AC 88 BC 8 FD

https://sebastianraschka.com/books.html

通过部署 API 利用机器学习赚钱

原文:https://towardsdatascience.com/earn-money-with-machine-learning-by-publishing-an-api-dc6694121ba5?source=collection_archive---------29-----------------------

使用 FastAPI、uvicon/guni corn 和 Python 将您的作品发布到 RapidAPI 市场💸

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

来源:@denarium _ bit coinviaunsplash

如果你正在读这篇文章,那是因为你已经创造了一些有价值的代码,你希望能够发表。无论您只是简单地将一些开源技术打包在一起,还是构建了一个出色的新算法,其他技术专家都很有可能会发现您的解决方案很有用。

在本文中,您将利用开源框架在的 3 个简单步骤中将您引以为豪的东西部署到 API 市场。你甚至可能获得一点被动收入。要获得好评和/或利润,需要一点努力和一点运气——让我们全力以赴吧🏀!

我可以在哪里分发我的作品?

作为一名有才华的数据专家,您对 API 非常熟悉。如果你需要快速复习,这里有一些我最喜欢的:

[## 人工智能和机器学习中你应该知道的 20 大 API

应用程序编程接口是一个现成的代码,可以简化程序员的生活。它有助于数字化…

towardsdatascience.com](/top-20-apis-you-should-know-in-ai-and-machine-learning-8e08515198b3)

API marketplace 允许开发者发布和货币化他们的工作,而不需要管理定制的支付系统和复杂的基础设施。RapidAPI 是我最喜欢的应用程序,为你能想到的每一种应用程序提供“免费增值”和付费订阅计划。假设您正在构建一个自定义应用程序,该应用程序将财务数据与新冠肺炎感染统计数据相关联,您将使用 RapidAPI 来发现、学习和扩展。

我为什么要发布 API?

开源软件运动推动了世界上一些最受欢迎、最赚钱的科技公司。开源脚本语言(Python、R、Julia)、数据库技术(SQL、MongoDB)和计算库(SciPi、Scikit-learn、tidyr)的存在使越来越多的数据专业人员能够构建各种规模的有价值的解决方案。为什么不贡献一个惊人的开发者资源生态系统呢?

如果你是一名新兴的数据科学家,这是推销你的才华和创业技能的最佳方式。我们开始吧!

我如何部署一个 API?

有多种方法可以让 API 启动并运行。以下是我最喜欢的几个 python 部署:

  1. 使用 Zappa 在 AWS Lambda 上部署无服务器 Web 应用
  2. 用 GitHub 页面、Flask 和 Heroku 构建一个简单的 Web 应用
  3. 使用 FastAPI 和 Uvicorn(我们将使用这种方法😉)

FastAPI 是一个闪电般快速、直观和健壮的 API 框架,它简化了开发过程。uvicon是一个流行的 WSGI 服务器,它使得在云中运行 python 应用程序变得很容易。

简单的部署步骤

我最近开发了一个简单的程序,从一篇新闻文章中抓取文本,为命名实体识别词性标注处理文本,然后执行一些高级分析。

I .将此程序部署到我的本地计算机:

  1. 安装依赖项:
pip install fastapi uvicorn gunicorn

2.格式化端点。

在格式化您的代码之前,看一下 path params 文档:

3.运行它!

uvicorn main:app --reload

4.在 Swagger UI 中查看(生成的)文档:

[http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)

5.带着 API 兜一圈!

二。作为微服务部署到 Heroku:

  1. 将您的代码保存到一个 GitHub 库
  2. 打开 Heroku,创建一个新的应用程序,连接你的 GitHub 帐户,链接你想要发布的特定存储库,并启用自动部署。
  3. 通过运行以下命令构建 requirements.txt 文件:
pip freeze > requirements.txt

4.制作一个 Procfile 以便 Heroku 知道如何部署应用程序:

web: gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app

5.推送至 GitHub,等待 Heroku 部署您的解决方案!您可以查看我完成的例子如下适当的格式👇

如果您在将本地部署添加到 Heroku 时遇到问题,请查看此视频!

来源:TutLinksviaYouTube

三。通过 RapidAPI Marketplace 分发,以便开发人员可以使用它:

  1. 注册一个 RapidAPI 帐户并“添加一个新的 API”
  2. 添加一个基本 URL(链接到 Heroku app)并格式化相关的端点
  3. 给 API 打上品牌!添加一个高分辨率的图像,雄辩的描述和诱人的功能。
  4. 格式化公共计划的定价属性。RapidAPI 提供多种订阅计划,可随消费而扩展。根据你的代码的*,从一个完全免费的计划免费层(‘免费增值’计划)开始让其他开发者上钩可能是有意义的。如果你更有信心,直接去“付费”并要求一个订阅的信用卡。*
  5. 最后,将 API 发布到市场上!开发人员将能够使用你出色的新应用程序,你将获得有价值的反馈。未来的更新/附加特性将更好地服务于那些使用你的 API 的开发者。

让其他开发者订阅付费!

很多 API 是由公司开发的,而不是个人开发的。随着有才能的数据专业人员的数量随着需求的增加而增加,对有价值的算法和数据管道的廉价、复杂的替代品的需求也会增加。你可能不会马上获得被动收入*,但是在寻找与数据相关的职位时,你已经很好地展示了独特的才能和企业家精神,提高了你的市场竞争力。我鼓励您尝试 FastAPI 和其他替代方案,看看哪种类型的解决方案最受欢迎。*

如果您想讨论 API 格式和最佳实践、开源理念或您可以开发的各种按需软件选项,请联系我。我很乐意收到你的来信。

感谢阅读!😃

地球:“感谢新冠肺炎,我可以更轻松地呼吸了”

原文:https://towardsdatascience.com/earth-thanks-to-covid-19-i-can-breathe-easier-ebc2c11337c5?source=collection_archive---------48-----------------------

新冠肺炎封锁期间,我所在城市的空气质量发生了怎样的变化

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

来源:Pixabay —标清图片

在冠状病毒疫情期间,许多人呆在家里,一些行业已经暂停生产,因为政府已经制定了防止疾病传播的法规。这导致城市交通减少,一些工业暂时没有污染空气。由此可以推测,城市的空气污染有所减少。

为了验证这个假设,我分析了我的家乡斯洛文尼亚卢布尔雅那的污染数据。为了进一步支持这些假设,我采用了意大利贝加莫的污染数据,这是受冠状病毒影响最严重的欧洲城市之一。

在这篇文章中,我比较了世界卫生组织的两种对健康有重大影响的污染物的测量值。(no₂)城市中的二氧化氮主要是由交通产生的。 PM10 是直径在 2.5 到 10 微米之间的细小颗粒。世卫组织也提到了 PM2.5(直径小于 2.5 微米的颗粒),但我无法获得卢布尔雅那 PM2.5 的数据。我从欧洲环境署的数据库中检索了所有数据。

卢布尔雅那的空气污染

在下图中,我绘制了卢布尔雅那过去四年 NO₂和 PM10 的日平均浓度。每一年都有不同的颜色。

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

图表显示了斯洛文尼亚卢布尔雅那过去四年中 NO₂和 PM10 的日平均浓度。

对于 NO₂,我们可以看到上个月(2020 年)的数值低于前几年,但这些图表很难读懂,因为浓度每天都在变化。我使用了移动平均线来得到一个更平滑的图形。

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

图表显示了斯洛文尼亚卢布尔雅那过去四年的平滑平均日 NO2 和 PM10 浓度。当浓度未被报告或无效时,线路中断。

我们可以看到,在三月中旬之后——我国政府实施了限制——no₂的浓度低于前几年。PM10 的浓度与前一年相似——在三月底的一段时间里,由于风把撒哈拉沙漠带到欧洲,浓度甚至更高。

为什么 NO₂的浓度低于前几年的解释可能是 NO₂的主要来源是燃烧化石燃料的内燃机——交通。另一方面,PM10 来自更多不同的来源,包括发电厂、工业,还有交通,这可能是 PM10 没有改变的原因——燃烧季节仍在继续,许多工业没有停止生产。

贝加莫的空气污染

为了确保我们的结果与新冠肺炎封锁相关,我们检查了另一个城市的数据,该城市受到了意大利北部疫情-贝加莫的影响。这是受新冠肺炎影响最严重的城市之一。

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

图表显示了意大利贝加莫过去四年的日均 NO₂和 PM10 浓度。当浓度未被报告或无效时,线路中断。

对于 Bergamo,我再次在图表上绘制了过去四年的日平均值,因为它们并不完全清楚,我对卢布尔雅那的数据进行了平滑处理。

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

图表显示了意大利贝加莫市过去四年的平滑日均 NO₂和 PM10 浓度。当浓度未被报告或无效时,线路中断。

我们可以在意大利的 NO₂图表中观察到与卢布尔雅那之前相似的趋势。二月底,意大利在该国北部实施了限制。与此同时,与其他年份相比, NO₂ 的浓度开始下降。与其他年份相比,这一差异甚至比卢布尔雅那更为显著——与其他年份相比,浓度减半。
PM10 浓度没有差异。我还分析了佛手柑的 PM2.5 浓度,它们与 PM10 相似,与其他年份相比没有差异。

结论

从这个故事中呈现的数据,我们可以得出结论,被观察城市的空气质量有所改善。 NO₂ 浓度有巨大变化,这表明交通产生的污染明显减少,而颗粒物(测量为 PM10 和 PM2.5)仍停留在同一水平。根据参考资料,我可以得出结论,这是因为许多颗粒来源持续存在——包括燃烧化石燃料来加热。

新冠肺炎的后果是毁灭性的,将给我们未来的生活带来巨大的变化。然而,我们必须承认也有一些积极的方面。他们中的一个也看到了地球是如何被治愈的。过去几周我们呼吸的更清洁的空气是积极的事情之一,如果我们回到以前的轨道上,这种情况会很快改变。

土耳其地震和热门场馆数据分析

原文:https://towardsdatascience.com/earthquake-popular-venues-data-analysis-of-turkey-28f8d02cb0d?source=collection_archive---------28-----------------------

我应该在哪个安全的城市投资哪个部门?

1。简介

1.1。描述&背景讨论

土耳其是一个地震多发国家,T4 有 8200 万居民。由 81 个省份组成。它被北安纳托利亚、西安纳托利亚和东南安纳托利亚地震带环绕。土耳其地貌的多样性是地球运动的结果,几千年来,地球运动塑造了该地区的地形。

它有死火山,地震仍然频繁发生。在这个国家的北部和东部,有导致今天地震的大断层线。1999 年发生在北安纳托利亚断层线上的马尔马拉大地震导致数千人死亡。[1]

尽管土耳其是一个地震多发的国家,尽管它也是一个旅游国家。每年有数百万来自世界各地的游客参观它。甚至有一些外国侨民在土耳其购买房地产并进行交易。[2]

1.2。问题

投资者和消费者会对基于地震统计和每个城市热门地点的数据分析感兴趣。投资者可以在地震风险较低的地方开展项目,并投资于这些地方业务不太密集的工作。对于生活在城市的普通人来说,他们可能想要购买并居住在不太危险同时又靠近社交场所的地方。

因此,通过基于每个城市合理的过去(例如,100 年)进行地震统计来进行聚类研究,可以确定具有高地震风险或没有地震风险的区域。此外,通过比较这些地区的热门场馆,可以揭示地区之间的独特性。

2。数据

2.1。数据来源

本研究中用于解决问题的数据来源如下:

  • AFAD 地震目录页面,1920-2020 年间发生的里氏震级 4-10 级地震的统计数据以 csv 格式通过各种过滤方法获得。[3]
  • 通过 OpenStreetMap ,提供了地震分布所需的 GeoJSON 数据和显示集群组的地图。[4]
  • 通过 Foursquare API ,可以获得这些城市最受欢迎的场馆的类型信息,以及这些地方的经纬度信息。[5]
  • 来自维基百科的是土耳其的城市列表。借助 Python GeoPy 库,通过逐一查询,获得城市的经纬度信息。[6]

2.2。数据探索和清理

AFAD 刮来的地震数据;获得了日期、地震纬度、地震经度、地震震级和深度信息。从多个来源下载或搜集的数据被合并到一个表中。在 1920 年 1 月 1 日至 2020 年 1 月 1 日和 2020 年 1 月 1 日至 2020 年 1 月 1 日大于 4.0 里氏共获得 5707 条数据。csv 文件中出现的一些缺少信息的变量没有包含在原始数据集中,因为它们是多余的。

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

图一。 AFAD 地震目录页。(图片由作者提供)

在接收 AFAD 地震数据时,实施了矩形搜索式。人们认识到,收到的一些数据来自土耳其境外。由于地震发生城市的名称不包括在地震统计中,因此地震发生城市的信息是通过使用 GeoPy 库和对每个数据的反向地理编码方法获得的。发生在土耳其以外的地震数据被从主数据集中删除。因此,总共有 4364 行数据保留在主数据中。

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

图二。摘自 AFAD 网站的第一个地震统计编辑版本。(图片由作者提供)

根据获得的数据集,通过查看震级直方图可以看出,发生的大多数地震的震级在 4 到 4.78 之间。直方图提供了有关地震分布的信息,有助于了解数据集的结构。

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

**图三。**地震震级直方图。(图片由作者提供)

此外,还检查了研究中数据集的标准偏差、最小值和最大值,并得出了意见。本次审查的表格如下所示。

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

**图 4。**创建的第一个数据集的统计信息。(图片由作者提供)

查看图 4,~ 0.47的震级标准偏差值表明,震级值比其他变量分布更均匀,彼此更接近。图 5 中的震级直方图也支持这一观点。下面的深度直方图显示了深度值的分布,也可以检查。

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

**图五。**地震深度直方图。(图片由作者提供)

当比较属性的最大值和最小值范围时,将会看到它们通常是彼此相差不太远的值。此外,当比较所有特性的最大值和所有特性的最小值时,可以理解不需要任何标准化或规范化。

2.3。处理缺失数据

发现第一个数据集中没有一些城市的统计数据。这意味着那些城市已经 100 年没有发生过大于 4.0 的地震了。这些城市分别是*****里泽***巴特恩 基利斯 震级和深度变量仅填充了这四个城市的合理值,因此这些省份的行在数据集中不会显示为 NaN。

这些城市在统计的 100 年内没有大于 4.0 的地震记录,并不代表没有地震。一些小于 4.0 级但我们没有记录的地震可能已经发生。即使这些城市的边界内没有地震,邻近城市的地震也能影响这些城市。所以用零填充 NaN 的幅度部分是没有意义的。

然而,在从 AFAD 获得的统计数据中,发现一些深度值为 0.0 。考虑到这种情况可能是自然的,下面要推导的最大深度和最小深度的值被接受为这些省份的 0.0最大幅度值被接受为 3.0 ,最小幅度值被接受为 1.0。基于此,平均值值被接受为 2.5 。********

2.4。特征提取

每个城市的平均、最大和最小特征通过特征提取产生。这些属性被添加到编辑的第一个数据集。新属性是基于幅度和深度变量导出的。然后从数据集中删除了 Eq_LatitudeEq_Longitude 属性。最后,主数据集被创建,将带有 81 个城市的经纬度信息的数据表添加到数据集。

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

****图六。主数据。(图片由作者提供)

3。方法学

使用 Python 叶库,对 4364 个地震点的地理细节进行可视化,以获得初步见解。这是一个有用的可视化,特别是在看到地震发生在哪些地区以及了解地震分布方面。

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

****图 7。土耳其 1920-2020 年间发生的地震。(图片由作者提供)

Foursquare API 被用来发现城市中受欢迎的场所。作为每个城市的限制, 100 个热门场馆20 公里直径被测量。在一些城市中,已经观察到当直径测量值较短时,没有返回流行的空间数据。为此,进行了 20 公里宽的搜索,以便从每个城市获得至少 10 排。共获得 6581 行数据。

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

图 8 。Foursquare API 查询获得的位置数据。(图片由作者提供)

为城市中确定的热门地点创建了一个汇总表。数据透视表显示了 Foursquare API 为每个城市返回的场馆总数。该表的图表如下。

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

****图九。各城市热门场馆总数。(图片由作者提供)

当检查图 9** 时,可以看到返回了许多大城市的 100 个结果。而伊斯坦布尔亚洛娃伊兹密尔布尔萨特拉布宗阿达纳梅尔辛迪亚巴克尔安塔利亚等省份则被视为热门地的富豪;阿加尔通杰利哈克里锡尔特埃尔祖鲁姆等省份保持在 20 结果以下。**

当然,这张图并没有包括各省所有的热门地点。因为搜索是在距离每个城市 20 公里的地方进行的,并且仅使用一个经纬度对来表示每个城市。考虑到它的面积,这个搜索可能被认为是对某些城市的窄搜索。

也可能有许多位置没有被 Foursquare 检测到或认为是受欢迎的。通过使用关于城市的更多纬度和经度信息执行更详细的搜索,可以获得更受欢迎的位置信息。

当总结使用 Foursquare API 获得的数据时,可以看到总共识别出了属于不同类别的 347 种受欢迎的场所。一个新的数据表已经创建,显示了各省最常见的 10 个场馆**。**

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

****图十。十大最常见的场馆。(图片由作者提供)

确定热门场馆后,对 347 个分类变量进行一次性编码**,从主数据中提取城市属性,用 K-Means 算法进行聚类研究。K-Means 算法通过尝试将样本分成 n 个方差相等的组来对数据进行聚类,最大程度地降低了惯性或类内平方和标准。K-Means 算法是无监督学习中最常用的聚类方法之一。**

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

****图 11。用于 K-Means 算法的数据集摘要。(图片由作者提供)

图 11 总结了 K-Means 聚类算法中使用的数据集(81 行 x 355 列)。空间距离有不同度量距离函数。研究中选择了 Sqeuclidean 指标。因为它让肘部断裂点看得更清楚。为了确定最佳聚类数,用不同的试验进行聚类研究。通过增加 K-Means 算法的聚类常数(K 值)来分析结果。用肘法分析时,确定最佳值为 K = 3 。这种情况在下图中也可以看到。

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

****图 12。优 K 数同肘法。(图片由作者提供)

在聚类研究之后,创建了一个新的数据表,给出了发现的聚类、城市名称、平均值。城市中发生地震的震级,以及每个城市中 10 个最常见的地点。

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

****图 13。最常见的场馆和集群编号。(图片由作者提供)

当对检测到的的 3 个星团进行地震危险性检查时,它们被标记为。当计算每个聚类中所有城市的平均地震震级时,也确定了聚类的风险比。****

地震风险最高的城市群被确定为高,而地震风险最低的城市群被确定为低。创建了一个新的数据表,其中包含分类所拥有的城市总数、分类在形状和地图上的表示颜色以及分类标签。

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

****图 14。检测到的簇的标签、颜色和计数信息。(图片由作者提供)

当比较聚类之间的城市数时,可以看到聚类高46.9% 排在第一位。这一结果表明,该国大多数城市都处于地震的高风险之中。

另一方面,地震风险低的集群低的城市总数过高,不容低估。对于为防范地震风险而进行的各种投资,可以将注意力吸引到这一组中的省份。

集群中等,地震风险处于中等水平,就城市总数而言似乎是最小的集群。下面,您可以查看包含聚类城市编号的饼图。

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

****图 15。聚类中城市的计数。(图片由作者提供)

4。结果分析

到目前为止,我们所取得的成果对那些希望生活在一个安全城市的普通人来说是一个指南,或者在这个方向上做出他们的房地产购买决定。有必要更详细和单独地研究集群,以便提出意见来指导投资者。

4.1。集群:“高”

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

****图十六。簇高的透视表。(图片由作者提供)

高集群是地震风险最大的城市集群。土耳其所有城市中的 38 个都在这个集群中。考虑到所有的集群,它在城市数量方面是第一个集群。当检查城市的特征结构时,可以看到它们通常位于远离大海的内陆地区,在多山的地方,其中一些有海边。

集群中拥有海岸的大多数城市都是爱琴海的邻国。集群中还有两个城市,相邻的马尔马拉、黑海和地中海。

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

****图 17。集群高第一公共场馆数据透视表。(图片由作者提供)

图 17 中给出的表格是在对集群中城市的“最常去的地方”进行比较后得出的。

根据该表,咖啡馆似乎是该集群 38 个城市中 24 个城市的第一个最常见的位置。然后,“酒店”和“土耳其餐厅”分别到来。预计对投资者来说,这些行业将会有激烈的竞争。更明智的做法是将注意力转向竞争力较弱的行业。

这个集群中几乎所有的城市都位于断层线上。在这方面,特别是那些想购买房地产的人,可以从距离断层线较远的集群中或集群低中选择一个城市。

此外,由于具有最高地震风险的集群,可能优选的是,要进行的投资是不受地震影响的成本较低的企业类型。对于高成本投资,地震风险较小的集群城市可能是首选。

当对该集群中从 1 到 10 的所有城市的所有公共场所进行求和时,列表顶部的前 20 个场馆如下图所示。

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

****图 18。集群高中所有最常见场馆的前 20 名图表。(图片由作者提供)

根据图 18** 中的图形,海鲜餐厅看起来是一个比其他行业竞争力弱的地方。可以在这个部门进行投资,特别是在这个集群的海滨城市。**

此外,作为第七家烘焙食品业务“甜品店”的替代方案,投资“面包店”板块,该板块服务的区域相似,竞争比图中要少,可以认为是一个很好的机会。

该集群中的一些城市位于内陆地区,那里是大陆性气候,并且位于冬季非常寒冷的山区。另一方面,看图表,可以看到有很多与茶、咖啡等饮料相关的业务。

与其进入这个竞争激烈的地区,“早餐点”可能是一个不错的投资选择,在这里你可以喝茶和咖啡,一方面吃早餐,另一方面竞争也较少。

4.2。集群:“中等”

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

****图 19。集群中的透视表。(图片由作者提供)

该集群由 10 个城市组成,地震危险度为二级。城市的邻居通常是从集群高的城市。在这方面,就穿过城市的断层线和地震风险而言,地形可能类似于集群高。除了穆拉、安塔利亚和梅尔辛,这些城市都没有海滨。安纳托利亚东部的城市位于山区和高海拔地区。

当根据“第一最常见地点”在集群中的城市之间进行比较时,获得下表。

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

****图 20。第一集群媒体公共场馆数据透视表。(图片由作者提供)

从该表中可以看出,咖啡馆是前两个集群中投资者普遍青睐的行业。所以竞争很大。特别是考察集群介质中的集群时,一些省份常见但竞争较少的“板块可能适合投资。

关于这个问题的进一步评论,看一下前 20 个场馆列表将是有用的,其中包括所有城市中的公共场馆。下图显示了从 1 到 10 的所有常见地点的总和。

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

****图 21。集群媒体中所有最常见场馆的前 20 名图表。(图片由作者提供)

集群中临海的城市可以被认为是可以投资的城市,尤其是在旅游业方面。与集群高一样,我们可以检查在投资方面竞争力较弱且排名较低的行业。

根据该国旅游业的发展情况,排名前 20 位的“酒店”行业和“观景”行业可能是一个不错的投资选择,在高海拔城市,这两个行业的竞争力似乎较弱。

就房地产而言,海滨城市可能很有吸引力。然而,对于这一点来说,选择低地更合适,它具有最小的地震风险,并且有海滨。

4.3。集群:“低”

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

****图 22。簇低的透视表。(图片由作者提供)

是地震风险最小的集群。它总共由 33 个城市组成,城市数量在其他集群中排名第二。几乎所有拥有海岸线的城市都毗邻黑海。除了土耳其黑海的邻国科贾埃利和萨卡里亚之外,所有的城市都位于这个集群中。

这个集群中的城市可能是房地产投资的首选。那些想在海边和地震风险最小的地方买房的人应该详细评估这个集群中的城市以及这些城市的房地产机会。

当根据人口密度进行评估时,它由该国人口最多的城市组成,如伊斯坦布尔和安卡拉。人口密集,地震风险低于其他省份的事实,为投资铺平了道路。

下表显示了城市中“最常见的地方”。

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

****图 23。第一集群媒体公共场馆数据透视表。(图片由作者提供)

在这个集群中的城市,投资机会高于其他集群中的省份。大量的海滨城市、较少的地震和各种各样的投资领域使得集群低的城市更有吸引力。

因此,更好的决定是选择一个不同的、开放发展的部门,而不是像咖啡馆部门那样在每一个集群中都非常普遍和竞争激烈的部门。在下图中,您可以看到聚类低的城市的前 20 个位置列表。

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

****图 24。Cluster LOW 中所有最常见场馆的前 20 名图表。(图片由作者提供)

我们之前为集群高提到的“甜品店”和“面包店”的投资思路在这个集群也是成立的。当图 24** 被检查时,将会看到这些部分可以相互替代,因为它们处于相似的区域。**

黑海沿岸的城市发展了渔业。所以竞争不太激烈的“海鲜馆”可以是不错的投资。为海鲜餐馆供应鱼也是一个好的商业想法。

在“花园”和“农场”中,它们可以被评估为相似且竞争较小的业务类型,作为联合或单独投资。

当检查到目前为止所有集群的表格和图形时,将会看到“”扇区在每个集群中处于显著的顺序。为此,在所有集群中海拔较高的城市,可以认为是一个很好的投资机会。

同样,当将所有集群放在一起考虑时,可以看到“农场”、“公园”和“广场”行业的竞争处于中等水平,它们在总数中所占的比例很大。

4.4。聚类图

所有检测到的聚类都用土耳其地图上的点可视化。 Python 叶子 被用于此。你可以在下面的地图上看到我们在上面对星团所做的所有解释的可视化版本。

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

****图 25。土耳其地图中聚类点的可视化。(图片由作者提供)

上面地图上用红色显示的点属于集群高,地震风险最高。橙色点代表中,绿色点代表低。

除此地图外,还根据平均地震震级绘制了颜色分布的等值线图**。平均地震震级和聚类一起显示在 Choropleth 图中。**

另外,点击每个点时,相关城市名称、集群信息和百年平均地震震级信息作为弹出**。**

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

****图 26。土耳其地图中聚类点和平均地震震级分布的可视化。(图片由作者提供)

5。讨论

这项研究的第一个目的是通过利用地震数据分析城市中受欢迎的场馆,帮助商人和普通市民做出投资决策和未来的社会生活。

虽然该项目中使用的统计数据代表了城市的一部分,但它被视为代表了整个城市。例如,只发生在城市一个地区的地震被认为发生在整个城市。因此,基于城市的研究可以通过更深入的挖掘在地区或社区的基础上进行。此外,还可以用 Foursquare API 数据之外的不同数据源获取更多数据。因此,将有可能获得更清晰和不同的结果。

这个项目的另一个目的是通过检查旧的地震做出推论,并产生我们可以从中受益的信息。

例如,如果一个城市发生了太多地震,并且震级很高,那么该城市很可能会因断层活动而再次发生地震。但是,这种接受并不能得出多年没有地震的地方是安全的结论。本研究所使用的方法在将来可以用不同的数据和不同的方法来处理,可以得到不同的结果。

当检查图 25 中的红点时,可以看到它们与土耳其的地震危险地图是一致的。[7]

6。结论

因此,该项目有助于更好地了解城市在地震和社交场所方面的特点。该项目不仅支持了投资者,也支持了城市管理者或规划者的决策。它也为在与本研究类似的领域中使用数据分析类型的各类研究人员起到了指导作用。

研究中使用的所有数据集、Python 代码和图像文件都存储在相关的 GitHub 帐户中。[8]因此,它可以在将来用于不同的项目。

泽克·奇普拉克 物理学家,数据&计算机科学爱好者。

7。参考文献

坚持科学…

使用混合聚类-LSTM 方法的地震时间序列预报——第一部分:EDA

原文:https://towardsdatascience.com/earthquake-time-series-forecasts-using-a-hybrid-clustering-lstm-approach-part-i-eda-6797b22aed8c?source=collection_archive---------35-----------------------

在加州过去 50 年的历史地震中测试该方法

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

The notorious 1906 San Francisco earthquake hit the bay area on the April 18th 1906, leaving more than 3,000 deaths. Earthquake had a moment magnitude of 7.9 [[Image source](https://en.wikipedia.org/wiki/1906_San_Francisco_earthquake), [license](https://catalog.archives.gov/id/524396)].

这篇博客是描述这一时间序列分析细节的一系列博客中的第一篇

0.序

以我们目前有限的技术进步,地震的确定性预测只是一个无法实现的要求。这种限制可能有两个原因:1 —我们对地下断层结构的了解极其有限;2 —记录地震数据的地震仪具有固有的灵敏度限制。由于地震学研究的进步,随着我们对地震的物理理解的胜利,未来看起来是光明的。然而,仍然有一些地震的发生没有被注意到,例如帕克菲尔德(2004 年)地震,该地震预计发生在 1988 年的早些时候。另一种研究地震预报问题的方法是通过使用更先进的统计学和人工智能工具。作为一名数据科学家,我采取了一种不同的方法来对地震现象有更好的统计理解;因此,这里的“预测”一词只是指统计理解,而绝不是指确定性的地震预测。了解了这一点,现在让我们开始分析。

1.介绍

仅自上个世纪以来,地震就造成了数百万人死亡(T4)。除了生命威胁之外,随之而来的巨大经济和基础设施破坏可能给文明留下长久的创伤。例如,位于太平洋-北美板块边界附近的加利福尼亚州已经经历了许多毁灭性的地震,其中一些造成了大量的人员伤亡和经济损失(参见我的 GitHub 库文档中的简要列表

这些地震时有发生,但我们有时会忽略全球地震网络( GSN )持续记录的大量地震数据。地震数据记录了各种各样的地震、断层系统、地理位置和几个传感器,提供了足够多样的数据集来从数据科学的角度研究地震分析*。此外,数据科学中的工具可以在评估如此重要的社会危害问题时投入真正的试验。目前的物理地震模型无法预测一些地震事件。希望数据驱动的地震分析将为地震发生的系统学提供额外的见解。人口密集的住宅区可以真正受益于早期地震预警系统(例如,检查 震动警报 )。尤其是基于强大的人工智能工具的。*

2.预测地震时间序列的困难

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

图一。1989 年洛马普列塔 6.9 级地震序列。注意没有前兆大事件的主震的发生。

图 1 显示了 1989 年洛马普列塔地震( 63 人伤亡,100 亿美元损失)期间前震(主震前)、6.9 级主震和余震(主震后)的序列。主震发生时几乎没有任何大的前兆信号。对于更传统的时间序列模型,如自回归模型,这使得地震预测的任务变得复杂。

2.问题陈述:

圣安地列斯断层从西北-东南加利福尼亚沿海岸延伸近 700 英里。这个断层导致了臭名昭著的 1906 年旧金山地震,以及后来的洛马普列塔和帕克菲尔德地震。但是,这不是唯一的断层系统,地震发生在许多附近的断层上,这些断层甚至可能以复杂的方式相互作用。这些地震的发生有什么系统性吗?如果有的话,它们能帮助我们辨别小地震是如何发展,导致大地震的吗?这里的分析更多的是基于数据,而不是基于物理。这意味着,任何震级和任何距离的地震对预测大地震都有同样的重要性;而且,没有事先的假设。只是,统计分析决定了地震重要性的权重。

4.模型工作流

模型工作流程由以下连续步骤组成: 1 — 数据收集。 2 — 数据清洗。 3 — 探索性数据分析(EDA)。 4 — 时间序列建模。 5 — 建议。对于这个项目的代码的完整访问,我邀请你在我的 GitHub 个人资料上看到这个库。大部分代码都是在 python 环境中编写的,在这里我使用了 Python 中的 Pandas、 scikit-learn 和 TensorFlow 库。

5.数据收集和清理

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

图 2:圣安地列斯断层几何学,臭名昭著的 1906 年旧金山、1989 年洛马普列塔和 2004 年帕克菲尔德地震就发生在这里【图片来自 Richard 等人,2014,来源许可】。

我用美国地质调查局的 API 提取了加利福尼亚州附近过去 50 年的地震数据。多亏了美国地质勘探局,这个 API 是公开可用的。为了下载一个足够全面的地震目录,我下载了加利福尼亚州以外的地震,经度和纬度范围分别为(-133,-107)和(24,50)度(远超过加利福尼亚州)。对于这篇博客文章,我主要探索了 6.9 级洛马普列塔(1989 年)地震数据的 EDA 分析。这次地震发生在圣安地列斯断层的锁定段(见图 2)。以下函数用于读取 USGS 地震 API:

函数来提取 USGS API 地震数据。查看我的 GitHub 库了解完整的功能。

导入的 json 文件嵌套过多;因此,在数据清理期间,我对 json 文件进行了“去嵌套”,将它们转换成数据帧,修复列数据类型,估算 NaN 值,最后将它们连接成一个全局数据帧,这是可行的。关于数据清理的完整描述,请访问我的 GitHub 档案。最后,我通过时间戳将数据帧索引为时间序列数据帧:

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

这个时间序列是 不规则的 ,意味着时间间隔是不均匀的,正如许多对事件敏感性有限的传感器数据所预期的那样;有些地震数据有 8 毫秒的间隔,有些接近 1 天。这使得时间序列建模变得复杂,我将在以后的博客文章中讨论这个问题。

5.EDA — 50 年的地震数据

下载的数据包含丰富的信息,包括事件发生的时间、力矩大小、强度(由人类评估)以及地震的三维位置。出于数据大小的考虑,我们只将矩震级大于 2 的地震视为更重要的地震。

请注意,矩震级是对数标度单位,这意味着一般来说,6 级地震比 5 级地震大 10 倍。

对震级的时间演变的初步观察表明,时间序列中有一个突然的峰值,没有太多早期的注意,如图 1 所示。

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

图 3:过去 50 年的全部地震数据。总共有 85 次大于 6 级的地震(上图中的灰色线)。力矩大小分布也用直方图表示。震级分布紧密遵循泊松分布(图片由作者提供)。

图 3 显示了全部数据(近 313k 下载的地震数据)。震级大于 6 级的地震有 85 次,我认为这是破坏性地震的阈值(大英百科全书)。地震的破坏性是一个远超过矩量级的更复杂的函数,如震源深度、持续时间和震源机制;然而,在这里,我只是把一个相当简单的 6 级矩作为破坏性的阈值。地震的分布严格遵循著名的古腾堡-里克特幂律分布(log(N) = a-bM,其中 N 和 M 分别是频率和震级。a 和 b 是常数。).由于力矩大小以对数单位表示,图 2 直方图的线性下降表明了这种分布。我不会详细描述这个发行版,因为这超出了这篇博文的范围。重要的一点是,尽管这种分布描述了地震发生的全球分布,但仅依靠这种统计分布进行危险分析是非常不安全的,原因如下:

“假设我们有一个大地震,比如 7 级地震,它不遵循这种分布(如 2004 年帕克菲尔德地震)。它只是一个数据点,不会扰乱幂律分布,因为它只是数千个数据点中的一个!但是,这是一个不容错过的致命数据点!

因此,更详细的统计分析将极大地有助于更好地理解地震现象。

洛马普列塔地震前 30 天发生了什么?

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

图 4:洛马普列塔主震前 30 天事件的地震图(图由叶图书馆创建)(图片由作者提供)。

为了理解是什么导致了主震,我们需要追溯导致主震的事件。如图 4 所示,在主要事件前 30 天有一个大规模的活动。事件倾向于沿西北-东南方向聚集,主要集中在圣安地列斯断层的上部和下部锁定区域(参见图 2)。最后,上部锁定区域导致了 6.9 级地震。有了初步的评估,我们现在可以尝试看看是否有任何位置系统。

位置和震级之间的相关性

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

图 5:整个数据集的 2D 直方图。上图:经纬度之间有明显的 NW-SE 向分带。下图:在深度约 10 公里处,似乎有大地震的聚集现象(图片由作者提供)。

为了更好地理解数据集,我评估了数据框架中变量之间的相关性。2D 直方图(图 5)显示,大部分地震发生在西北-东南方向,与某种线理大致对齐。此外,震级-深度分布表明,大地震发生在近 10 公里的深度。这表明,我们可以使用聚类技术来提出一些工程特征,并尝试看看它们是否有助于我们解决预测问题。

特征工程:空间聚类

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

图 6:随着地震群的发展,随时间的平移和转换。我们可以将这些变化作为地震预报的特征。

图 6 显示了开发这些特性的示意性概念。由于该图是自我描述的,所以我将不进行解释。我使用 DBSCAN 算法对从第一个数据点开始的每 20 次连续地震的事件进行聚类。我使用经度、纬度和深度进行三维聚类。作为聚类的结果,我们可以定义三个特征:

1-事件密度(或聚类的空间大小)。

2-纵横比(簇的 3D 形状)。

3 簇质心平移。

DBSCAN 的超参数为 eps = 0.2 和 min_samples=5]。

特征重要性

为了对已开发的特征进行初步评估,我只过滤了洛马普列塔大地震前的时序数据部分。我对每 20 行的数据进行平均,并将从空间聚类中获得的特征添加到原始 dataframe 列中。

最后,我添加了一个目标标签,作为洛马普列塔主震的时间(time_to_failure)。

下面是数据帧结构:

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

洛马普列塔地震的数据图表。目标标签是 time_to_failure 列。有关列的完整描述,请参见 GitHub repository。

运行单一回归分析以初步评估特征。请注意,这种回归只是为了探索的目的,作为未来的努力,结果需要在其他不同的测试地震数据集上进行交叉验证。下面的相关图(图 7)显示,这些特征实际上是主震时间的强有力指标。

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

图 7:特征和目标标签之间的关联(失效时间)。可以看出,这些是故障时间的强有力指标。请参见 GitHub repository 以获得对专栏的完整描述(图片由作者提供)。

图 8 中的特性重要性图显示了有趣的含义。dept_std、long_std 和 lat_std 表示群集的纵横比。这意味着离故障越近,集群越倾向于在垂直和纵向上拉长,而在纬度上拉长得越少。这些是最强的特征。此外,密度是负相关的,这意味着集群的大小在故障之前会扩大。另一个有趣的方面是地震的平均震级,这是一个奇怪的例子。对其他几次地震数据集的检查也显示了这一趋势。这意味着在大地震发生之前,地震的平均震级实际上是下降的。换句话说,断层变得更加平静。这是一个奇怪的案例,需要进一步研究。

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

图 8:基于洛马普列塔地震线性回归的特征重要性。特征在正文中被讨论。请参阅 GitHub repositopry 以获取列的完整描述(图片由作者提供)。

未来的工作

这是我对这个数据集进行时间序列分析之旅的开始。至此,我想用几句话来结束这篇博文,并为以后的帖子留下更详细的描述。在这里,我进行了初步的 EDA 分析,并建议了一些基于空间聚类的工程特性。这些特征似乎描述了主震发生的时间。

在以后的文章中,我将使用开发的特性,特别是聚类特性来执行更高级的时间序列分析。基于早期的评估,我发现 LSTM 是适合我的目的的方法。两个方面引起了我对 LSTM 序列分析的兴趣:1——我的时间序列的不规则性。2 —没有明显前兆的地震的类似休克的性质。

敬请关注…

感谢你阅读我的博文。对更多阅读感兴趣?请查看我的 LinkedInGitHub 简介。

使用 Python 获取股票数据的最简单指南

原文:https://towardsdatascience.com/easiest-guide-to-getting-stock-data-with-python-f74b5f75d179?source=collection_archive---------19-----------------------

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

我最近在大学里完成了一门数据科学的入门课程,对于我的期末项目,我决定我要研究股票市场数据。我想把我的重点放在算法交易上,需要一种快速简单的方法来收集股票数据,这种方法很容易使用。

我偶然发现了一个名为 yfinance 的库,它让我的项目变得简单多了!

我强烈建议通读文档。这是一个快速阅读,将有助于你任何涉及股票数据的项目。

在我们开始之前,我们需要安装 yfinance 库。为此,只需将以下内容复制到您的命令提示符中:

$ pip install yfinance

现在我们准备开始分析我们的股票市场数据。对于我的项目,我选择了 SPDR 的 P 500 ETF 信托基金,其股票代码为间谍。您可以使用任何您想要的股票代码,但是在本文中我将使用 SPY。

入门指南

幸运的是,yfinance 使得提取我们的数据并快速开始分析它变得极其容易。我们可以从导入 yfinance 开始,使用.download()函数下载我们选择的任何股票代码的历史数据。然后,我们可以通过调用.head()函数返回前 5 行数据来快速查看我们的数据。

import yfinance as yfSPY = yf.download('SPY')
SPY.head()

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

我们的股票数据在 Pandas 数据框架中得到了很好的格式化。例如,如果您只想查看数据集中的收盘价,这就很容易了。

SPY['Close']

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

也可以只下载特定日期范围内的数据。这将需要我们使用 yfinance 的 Ticker 模块,它允许我们使用 yfinance 做更多的事情。一旦这样做了,我们就可以使用.history()功能来处理所有的股票数据,或者某个时间段内的数据。假设我们想要 2020 年 1 月初至 2020 年 2 月初的数据。

SPY = yf.Ticker('SPY')SPY_History = SPY.history(start="2020-01-01", end="2020-02-01")
SPY_History.head()

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

现在我们已经使用了 Ticker 模块,我们可以调用.info来查看我们的数据的更详细的摘要。这将返回一个包含 100 个键的字典。

SPY.info

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

数据真多啊!我们也可以在字典中查看单个键。例如,如果我们想要查看当前 50 天的平均值,我们可以写:

SPY.info['fiftyDayAverage']

查看多个股票代码也同样简单。我们可以再次使用.download()函数,并用空格分隔每个股票代码。然后,我们可以查看数据中的最后 5 行,以检查它是如何格式化的。

data = yf.download('SPY AAPL')
data.tail()

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

为了快速可视化我们的数据,我们可以使用 matplotlib 编写一行程序来比较 SPY 和 AAPL。

import matplotlib.pyplot as pltdata['Close'].plot(figsize=(10, 5))

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

对于任何需要快速、轻松地收集股票数据的人来说,【yfinance】是一个很好的选择,也是迄今为止使用 Python 获取股票市场数据最简单的方法之一!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值