Python数据科学实战

978-7-115-62067-5
作者: 尤利•瓦西列夫(Yuli Vasiliev)
译者: 林炳清
编辑: 谢晓芳

图书目录:

详情

本书主要从实战角度讲述了如何处理、分析和可视化数据,如何用数据建立各种统计学或机器学习模型。本书首先介绍如何使用Python代码获取、转换和分析数据;接着讲述如何使用Python中的数据结构和第三方库;然后展示如何以各种格式加载数据,如何对数据进行分组与汇总,如何创建图表和可视化数据;最后讨论如何解决实际的问题。 本书适合希望使用Python处理和分析数据的开发人员阅读,也可供计算机相关专业的师生参考。

图书摘要

版权信息

书名:Python数据科学实战

ISBN:978-7-115-62067-5

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。


版  权

著     [俄] 尤利 • 瓦西列夫(Yuli Vasiliev)

译    林炳清

责任编辑 谢晓芳

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315

内容提要

本书主要从实战角度讲述了如何处理、分析和可视化数据,如何用数据建立各种统计学或机器学习模型。本书首先介绍如何使用Python代码获取、转换和分析数据;接着讲述如何使用Python中的数据结构和第三方库;然后展示如何以各种格式加载数据,如何对数据进行分组与汇总,如何创建图表和可视化数据;最后讨论如何解决实际的问题。

本书适合希望使用Python处理和分析数据的开发人员阅读,也可供计算机相关专业的师生参考。

技术审校者简介

丹尼尔·津加罗(Daniel Zingaro)博士是多伦多大学计算机科学系副教授。他最近几年在No Starch出版社出版了两本书。其中一本是Algorithmic Thinking,这是一本关于算法和数据结构的入门指南;另一本是Learn to Code by Solving Problems,这是一本关于Python和计算思维的入门图书。

前  言

我们生活在一个信息技术(Information Technology,IT)无处不在的世界中,计算机系统收集、处理大量数据,并从中提取有用信息。这种数据驱动的现实不仅影响现代企业的运营方式,还影响我们的日常生活。如果没有大量使用以数据为中心的设备和系统,许多人将很难与社会保持联系。

在商业领域,公司经常使用IT系统从大量数据中提取可操作的信息来做出决策。数据可能有不同的来源,以不同的格式保存,可能需要经过转换才能进行分析。例如,许多从事在线业务的公司使用数据分析来实现客户的获取和保留,收集、测量可以模拟和了解用户行为的一切信息。他们经常结合并分析许多不同来源的定量和定性用户数据,如用户档案、社交媒体和公司网站。在许多情况下,他们使用Python语言完成这些任务。

本书将介绍如何在面向数据的应用程序中使用Python,如何生成产品推荐,如何预测股市趋势等。通过真实示例,你将获得使用Python第三方库的实践经验。

在数据科学中使用Python

Python语言是访问、操作任何类型数据并挖掘信息的理想选择。Python既有一组丰富的内置数据结构,又有一个强大的开源库生态系统。本书将探讨许多这样的库,包括NumPy、pandas、scikit-learn、Matplotlib等。

你可以使用Python轻松编写简洁的代码,用几行代码表达大多数概念。事实上,Python灵活的语法允许你用一行代码实现多个数据操作。例如,你可以用一行代码过滤、转换和聚合数据。

作为一种通用语言,Python适用于各种任务。在使用Python时,你可以将数据科学与其他任务无缝集成,以创建功能全面的应用程序。例如,你可以构建一个bot应用程序,根据用户的自然语言请求进行股市预测。要创建这样的应用程序,你需要一个bot API、一个机器学习预测模型和一个与用户交互的自然语言处理(Natural Language Processing,NLP)工具。所有这些都可以借助Python第三方库实现。

本书读者对象

本书面向希望更好地理解Python数据处理和分析功能的开发人员。也许你为一家希望使用数据改进业务流程、做出合理决策并面向更多客户的公司工作。或者,你可能想开发自己的数据驱动应用程序,或者简单地将Python知识扩展到数据科学领域。

本书假设你有一些使用Python的基本经验,并且能够按照相关说明轻松地安装数据库或获取API密钥等。本书涵盖Python数据科学方面的概念,并通过示例对其进行解释。你将在实践中学习,不需要有数据分析方面的经验。

本书内容

本书首先介绍数据处理和分析的概念,解释典型的数据处理流程;然后介绍Python的内置数据结构和一些广泛用于数据科学应用程序的Python第三方库。接下来,本书探索越来越复杂的技术,用于获取、合并、聚合、分析和可视化不同大小、不同类型的数据集。我们将进一步把Python数据科学技术应用到商业管理、营销和金融领域的实际示例中。

以下是每章内容的概述。

第1章讲述数据的类别、数据来源和数据处理流程等。

第2章介绍Python内置的4种数据结构——列表、元组、字典和集合。

第3章讨论用于数据分析和操作的Python第三方库。你将学习pandas库及其主要数据结构、序列和数据框,它们已成为面向数据的Python应用程序的标准。你还将了解两个常用数据科学库——NumPy和scikit-learn。

第4章深入剖析如何获取数据并将其加载到脚本中。你将学习如何把不同来源的数据(如文件和API)加载到Python脚本的数据结构中,以进行进一步处理。

第5章继续讨论如何将数据导入Python,包括如何使用数据库中的数据。你将看到访问和操作存储在不同类型数据库中的数据的示例,这些数据库包括关系数据库(如MySQL)和非关系数据库(如MongoDB)。

第6章介绍如何对数据分组并解决数据汇总的问题。你将学习使用pandas对数据进行分组,并生成小计、总计和其他聚合数据。

第7章介绍如何将不同来源的数据合并到单个数据集中。你将学习SQL开发人员用于连接数据库表的技术,并将其应用于多种数据结构。

第8章讨论可视化,这是揭示数据隐藏模式的自然方式之一。你将了解不同类型的可视化形式,如折线图、柱状图和直方图,并学习如何使用Matplotlib库创建它们,Matplotlib库是用于绘图的主要Python库。

第9章解释如何使用geopy库和Shapely库处理位置数据。你将学习如何获取和使用静止与移动物体的GPS坐标,并将了解共享服务如何为给定的上车位置找到最佳出租车。

第10章介绍一些用于从时间序列数据中提取统计信息的分析技术。该章的示例说明了如何将时间序列数据分析应用于股市数据。

第11章探讨从数据中挖掘信息的策略,以便做出明智的决策。例如,你将学习如何发现超市销售的产品之间的关联,以便确定客户在单笔交易中经常一起购买的商品(这对推荐和促销有用)。

第12章介绍如何用scikit-learn库处理高级数据分析任务。你将训练机器学习模型,根据产品评价的评分对其进行分类,并预测股票价格的趋势。

服务与支持

本书由异步社区出品,社区(https://www.epubit.com/)为您提供后续服务。

提交勘误信息

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,单击“发表勘误”,输入相关信息,单击“提交勘误”按钮即可,如下图所示。本书的作者和编辑会对您提交的相关信息进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。

与我们联系

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区投稿(直接访问www.epubit.com/contribute即可)。

如果您所在的学校、培训机构或企业想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接通过邮件发送给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。

关于异步社区和异步图书

“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。

“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、人工智能、测试、前端、网络技术等。

异步社区

微信服务号

第1章 数据的基础知识

数据对不同人有不同的含义:股票交易员可能会认为数据是实时股票报价,而美国航空航天局的工程师可能会认为数据是来自火星探测器的信号。但是,对于数据处理和分析,同样或者相似的方法可以用来处理各种各样的数据(无论数据来自哪里)。重要的是数据是如何组织的。

本章将概述数据处理和数据分析。我们首先学习一些主要数据类别,然后讨论一些常见的数据来源。之后,我们将考虑典型数据处理流程(获取、准备和分析数据)。最后,我们将讨论Python的独特优势。

1.1 数据类别

程序员把数据分成3个主要类别——非结构化数据、结构化数据和半结构化数据。在数据处理流程中,初始数据通常是非结构化的;基于初始数据,可以得到结构化数据或者半结构化数据,以做进一步处理。但是,一些数据处理流程从一开始便使用结构化数据。例如,处理地理位置信息的应用程序可能直接从GPS传感器接收结构化数据。接下来几节将探讨主要数据类别和时间序列数据。时间序列数据是一种特别的结构化或者半结构数据。

1.1.1 非结构化数据

非结构化数据是指没有预先定义的结构或者模式的数据。这是广泛存在的数据形式,常见的示例包括图片、视频、音频和自然语言文本。考虑某制药公司的如下财务报表。

GoodComp shares soared as much as 8.2% on 2021-01-07 after the company announced positive
early-stage trial results for its vaccine.

该文本应被视为非结构化数据,因为其中的信息没有组织成预先定义的模式,而随机地散乱在文本中,用户可以把该文本改写成其他形式,但是仍然可以传递同样的信息。例如:

Following the January 7, 2021, release of positive results from its vaccine trial, which is
still in its early stages, shares in GoodComp rose by 8.2%.

虽然缺乏结构,但是非结构化数据可能包含重要的信息。通过适当的变换和分析,用户可以从中提取出结构化或者半结构化数据。例如,图像识别工具首先将图像的像素集合转化为预先定义格式的数据,然后分析数据并实现图像识别。同样地,1.1.2节将展示从财务报表提取出结构化数据的几种方式。

1.1.2 结构化数据

结构化数据有预定义的格式,用于明确数据的组织形式。此类数据通常存储在数据库中,如关系数据库、.csv 文件。数据库中的每一行数据称为记录,记录的信息由字段构成,字段顺序必须与预期结构相匹配。在一个数据库中,相同结构的记录保存在一起,形成一个表。一个数据库可能包含多个表,每个表都有一组字段。

结构化数据有两种基本类型——数值数据和分类数据。分类数据是指可以根据相似特征进行分类的数据。例如,汽车可以按品牌和型号进行分类。另外,数值数据以数字形式表达信息,允许对其进行数学运算。

注意,分类数据(如邮政编码或者电话号码)有时候也使用数字表示。虽然它们看上去像数字,但是对其进行数学运算(例如,计算邮政编码的中间值或者电话号码的平均值)是没有意义的。

我们如何把1.1.1 节的文本示例转化成结构化数据呢?我们可能对文本中的某些具体信息(如公司名称、日期和股票价格)感兴趣。我们希望使用以下格式在字段中显示这些信息,以便插入数据库。

Company:    ABC
Date:       yyyy-mm-dd
Stock:      nnnnn

我们可以使用NLP技术从文本中为这些字段提取出相应的信息技术,NLP是一个训练机器理解人类语言的学科。例如,我们通过识别分类数据的变量寻找公司名称,该变量只能是许多预设值(如Google、Apple或GoodComp)中的一个。同样,我们可以通过将日期的排序与一组给定的排序格式进行匹配(如yyyy-mm-dd)识别日期。在这里的示例中,识别、提取并把如下数据表示为上述格式。

Company:    GoodComp
Date:       2021-01-07
Stock:      +8.2%

为了把这条记录存储在数据库中,最好将其字段放在一行。因此,我们可以将记录重新组织为矩形形式的数据对象或二维矩阵。

Company  | Date      | Stock
---------------------------
GoodComp |2021-01-07 | +8.2%

一般来说,从非结构化数据中提取什么信息取决于你的需求。该示例文本不仅包含GoodComp某一天的股价变动情况,还指出了股价变动的原因,即“the company announced positive early-stage trial results for its vaccine”。从这个角度来看,使用如下字段创建一条记录。

Company: GoodComp
Date:    2021-01-07
Product: vaccine
Stage:   early-stage trial

请将其与第1条记录进行比较。在第1条记录中,我们提取了如下信息。

Company: GoodComp
Date:    2021-01-07
Stock:   +8.2%

注意,这两条记录包含不同的字段,有不同的结构。因此,它们必须存储在两个不同的表中。

1.1.3 半结构化数据

当信息本身的格式无法满足严格的格式化要求时,我们可能需要使用半结构化数据结构。这样的结构可以让我们在同一个容器(数据库表或者文件)中保存不同结构的记录。与非结构化数据一样,半结构化数据没有完全遵从预定义的模式。然而,与非结构化数据不同,半结构化数据的样本通常以自我描述的标记或者其他标志的形式表现出一定程度的结构。

常见的半结构化数据的格式包括XML和JSON。财务报表可以用如下JSON格式表示。

{
  "Company": "GoodComp",
  "Date": "2021-01-07",
  "Stock": 8.2,
  "Details": "the company announced positive early-stage trial results for its vaccine."
}

在这里,可以看到我们之前从财务报表提取出的关键信息。每一条信息都有一个描述性标记,如"Company"或"Date"。由于有这些标记,因此信息的结构与1.1.2节中数据的结构相似。但是,现在有第4个标记——"Details",它表示的是原始财务报表的一个片段,这是非结构化的。这个示例展示了半结构化数据格式如何在单条记录中同时包含结构化数据和非结构化数据。

另外,你还可以把多条结构不同的记录放在同一个容器中。这里,在同一个JSON文档中存储来自财务报表的两条不同记录。

[
  {
    "Company": "GoodComp",
    "Date":    "2021-01-07",
    "Stock":   8.2
  },
  {
    "Company": "GoodComp",
    "Date":    "2021-01-07",
    "Product": "vaccine",
    "Stage":   "early-stage trial"
  }
]

作为一个结构严格的数据存储库,关系数据库无法在同一表格中容纳不同结构的记录。

1.1.4 时间序列数据

时间序列数据是按时间顺序列出的一组数据点。因为金融数据通常由多个时间点的观测数据组成,所以很多金融数据存储为时间序列数据。时间序列数据可以是结构化的,也可以是半结构化的。想象一下,你每隔1min从出租车的GPS跟踪设备接收位置数据,数据可能表示为如下形式。

[
  {
    "cab": "cab_238",
    "coord": (43.602508,39.715685),
    "tm": "14:47",
    "state": "available"
  },
  {
    "cab": "cab_238",
    "coord": (43.613744,39.705718),
    "tm": "14:48",
    "state": "available"
  }
  ...
]

每分钟都有一条新的数据记录,包括编号为cab_238的出租车最新的位置坐标(纬度/经度)。每条记录都有相同的字段,在每条记录中,每个字段都具有一致的结构,允许你将该时间序列数据作为常规结构化数据存储在关系数据库表中。

现在考虑更加实际的情况,假设在1min内可能接收到多组坐标。新的数据结构可以表示为如下形式。

[
  {
    "cab": "cab_238",
    "coord": [(43.602508,39.715685),(43.602402,39.709672)],
    "tm": "14:47",
    "state": "available"
  },
  {
    "cab": "cab_238",
    "coord": (43.613744,39.705718),
    "tm": "14:48",
    "state": "available"
  }
]

在该示例中,第1个coord字段包含两组坐标,因此与第2个coord字段不一致。该数据是半结构化的。

1.2 数据来源

既然现在你已经知道了数据的主要类别,那么你可能会从哪些地方获取数据呢?一般来说,数据有各种不同的来源,包括文本、视频、图像、传感器等。但是,从你将要写的Python脚本的角度来看,常见的数据源有如下4种:

 应用程序接口(Application Program Interface,API);

 网页;

 数据库;

 文件。

当然,上面列的数据来源并不全面,Python脚本能够处理的数据不只限于这几种。在实际中,还有许多其他数据来源。

从技术上来说,这里列出的所有选项要求用户使用相应的Python库。例如,从API获取数据之前,需要为API安装Python包装器,或者使用Python库Requests直接向API发出HTTP请求。同样,为了访问某数据库的数据,需要在Python代码中安装一个连接器,使用户能够访问该数据库。

虽然许多库是必须下载和安装的,但一些用于加载数据的库是Python默认分配的。例如,要从JSON文件加载数据,可以使用Python内置的json包。

在第4章和第5章中,我们将学习如何使用Python从不同来源加载特定类型的数据,以便进一步处理。下面将简要介绍前面提到的常见数据源。

1.2.1 API

现在获取数据最常见的方式可能是使用API(Application Program Interface,应用程序接口)。要在Python中使用API,可能需要以Python库的形式为该API安装包装器。现在常用的安装方式是通过pip命令。

虽然并不是所有API都有自己的Python包装器,但是这并不一定意味着你不能从Python访问它们。如果一个API服务于HTTP请求,那么你可以在Python中使用Python库Requests与该API进行交互。这将让你可以使用Python代码从成千上万的API中请求数据并做进一步处理。

当你为特定任务选择一个API时,你需要考虑以下几个因素。

 功能。许多API能提供类似的功能,因此你需要了解自己的确切需求。例如,许多API允许你从Python脚本进行Web搜索,但只有一些API允许你按发布日期缩小搜索范围。

 成本。许多API允许你使用所谓的开发人员密钥,该密钥通常是免费提供的,但有一定的限制,如限制每天的调用次数。

 稳定性。由于有Python包索引(Python Package Index,PyPI)存储库,因此任何人都可以将API打包为一个pip包,并公开发布。因此,对于你能想象到的几乎任何任务,都有一个(或几个)API,但并非所有这些都是完全可靠的。幸运的是,PyPI存储库可以跟踪包的性能和使用情况。

 说明文档。流行的API通常有一个相应的文档网站,允许你查看所有的API命令,并有示例用法。Nasdaq Data Link(又名Quandl)API是一个很好的示例,请查看Nasdaq Data Link的文档页面,在那里可以找到多种时间序列调用的示例。

许多API返回的结果保存为JSON、XML或CSV这3种格式之一。这些格式中的任何一种都可以轻松地将数据转换为Python内置或常用的数据结构。例如,Yahoo Finance API检索并分析股票数据,然后返回结果,且结果是pandas数据框。pandas数据框是一种广泛使用的结构,这将在第3章中讨论。

1.2.2 网页

网页可以是静态的,为了响应用户的交互,网页也可以是动态生成的,在这种情况下,它们可能包含来自多个不同来源的信息。无论哪种情况,程序都可以读取网页并提取部分内容。这称为网络抓取,只要网页是公开的,这就是合法的。

Python中一个典型的抓取流程涉及两个库——Requests库和BeautifulSoup库。使用Requests库获取网页的源代码,使用BeautifulSoup库为页面创建解析树,即页面内容的分层表示。你可以搜索解析树,并使用Python从中提取数据。例如,以下是解析树的片段。

[<td title="03/01/2020 00:00:00"><a href="Download.aspx?ID=630751" id="lnkDownload630751"
 target="_blank">03/01/2020</a></td>,
<td title="03/01/2020 00:00:00"><a href="Download.aspx?ID=630753" id="lnkDownload630753"
 target="_blank">03/01/2020</a></td>,
<td title="03/01/2020 00:00:00"><a href="Download.aspx?ID=630755" id="lnkDownload630755"
 target="_blank">03/01/2020</a></td>]

使用Python的for循环可以轻松地把解析树变换为如下列表。

[
  {'Document_Reference': '630751', 'Document_Date': '03/01/2020',
   'link': '**** *** **** dummy ****/Download.aspx?ID=630751'}
  {'Document_Reference': '630753', 'Document_Date': '03/01/2020',
   'link': '**** *** **** dummy **** /Download.aspx?ID=630753'}
  {'Document_Reference': '630755', 'Document_Date': '03/01/2020',
   'link': '**** *** **** dummy **** /Download.aspx?ID=630755'}
]

这是一个将半结构化数据变换为结构化数据的示例。

1.2.3 数据框

除网页之外,另一种常见的数据源是关系数据库,这种结构提供了一种高效地存储、访问和操作结构化数据的机制。你可以使用结构化查询语言(Structured Query Language,SQL)从数据库的表中获取数据或将数据的一部分发送到表中。例如,向数据库中的employees表发出的以下请求只检索在IT部门工作的程序员的列表,因此无须获取整个表。

SELECT first_name, last_name FROM employees WHERE department = 'IT' and title = 'programmer'

Python有一个内置的数据库引擎——SQLite。或者,你可以使用任何其他可用的数据库。在访问数据库之前,你需要在环境中安装数据库客户端软件。

除传统的严格结构化数据库之外,近年来,人们越来越需要在类似于数据库的容器中存储异构数据和非结构化数据。这使得所谓的NoSQL(non-SQL或者not only SQL)数据库越来越流行。NoSQL数据库使用灵活的数据模型,允许你使用键值(key-value)方法存储大量非结构化数据,其中每一段数据都可以使用关联的键访问。之前的示例中的财务报表可以用如下格式存储在NoSQL数据库中。

key   value
---   -----
...
26    GoodComp shares soared as much as 8.2% on 2021-01-07 after the company announced ...

整个财务报表的文本与键26配对。将整个语句存储在数据库中似乎有些奇怪。然而,回想一下,我们可以从一个文本中提取几条不同的记录。存储整个语句使我们能够灵活地在以后提取不同的信息。

1.2.4 文件

文件可能包含结构化数据、半结构化数据和非结构化数据。Python的内置函数open()允许你打开文件,以便在脚本中使用其数据。但是,根据数据的格式(如CSV、JSON或XML),你可能需要导入相应的库才能对其执行读、写或者追加等操作。

纯文本文件在Python中被视为字符序列,不需要其他库即可进一步处理。下面的示例是思科路由器可能会发送到日志文件的信息。

dat= 'Jul 19 10:30:37'
host='sm1-prt-highw157'
syslogtag='%SYS-1-CPURISINGTHRESHOLD:'
msg=' Threshold: Total CPU Utilization(Total/Intr): 17%/1%,
           Top 3 processes(Pid/Util): 85/9٪, 146/4٪, 80/1٪'

你可以逐行阅读上面的日志文件,以寻找所需的信息。因此,如果你的任务是查找包含CPU利用率的信息,并从中提取特定的数字,那么你的脚本应该将代码段中的最后一行识别为要选择的信息。

1.3 数据处理流程

在本节中,我们将从概念上了解数据处理(也称为数据处理流程)涉及的步骤。通常的数据处理流程包含如下步骤。

(1)数据获取。

(2)数据清洗。

(3)数据变换。

(4)数据分析。

(5)数据存储。

这些步骤并不总是完全泾渭分明的。在某些应用中,你可以将多个步骤合并为一个步骤;而在某些应用中,你也可以省略某些步骤。

1.3.1 数据获取

在处理数据之前,需要先获取数据。这就是为什么数据获取是任何数据处理流程的第一步。在常见的数据源类型中,一些数据源只允许你根据请求加载所需的部分数据。

例如,对Yahoo Finance API的请求要求你指定公司的股票代码以及检索该公司股票价格的时间段。类似地,允许你检索新闻文章的News API可以使用多个参数以缩小所请求文章的列表,包括来源和发布日期。尽管有这些参数,但是检索到的列表可能仍需要进一步过滤。也就是说,数据可能需要清洗。

1.3.2 数据清洗

数据清洗是检测和纠正错误的或不准确的数据或删除不必要数据的过程。在某些情况下,这一步是不需要的,所获得的数据可以立即用于分析。例如,yfinance库(Yahoo Finance API的Python包装器)将股票数据作为易于使用的pandas库的数据框对象返回。这通常允许你跳过数据清洗和数据变换步骤,直接进行数据分析。

但是,如果使用网页抓取获取数据,通常HTML标签可能会包含在数据中,那么一定要进行数据清洗,如下所示。

6.\tThe development shall comply with the requirements of DCCa\x80\x99s Drainage Division as
follows\r\n\r\n

清理后,此文本片段如下所示。

6. The development shall comply with the requirements of DCC's Drainage Division as follows

除HTML标签外,抓取的文本可能还包括其他不需要的文本。在以下示例中,短语A View full text是超链接文本。你可能需要打开此链接才能访问其中的文本。

Permission for proposed amendments to planning permission received on the 30th A View full text

你还可以使用数据清洗步骤过滤特定的实体。例如,从News API请求一组文章后,你可能只需要选择指定时间段内标题包含金钱或百分比短语的文章。此过滤器可被视为数据清洗器,因为其目标是删除不必要的数据,并为数据变换和数据分析做好准备。

1.3.3 数据变换

数据变换通过改变数据的格式或结构,为数据分析做好准备。例如,要从GoodComp的非结构化文本数据中提取信息,你可以将其拆分为单个单词或标记,以便命名实体识别(Named Entity Recognition, NER)工具可以查找所需的信息。在信息提取中,一个命名实体通常代表现实世界中的一个对象,如一个人、一个组织或一个产品,这个对象可以用专有名词标识。另外,还有代表日期、百分比、财务条款等的命名实体。

许多NLP工具可以自动处理这些变换。经过变换后,分解的GoodComp数据如下所示。

['GoodComp', 'shares', 'soared', 'as', 'much', 'as', '8.2%', 'on',
 '2021-01-07', 'after', 'the', 'company', 'announced', 'positive',
 'early-stage', 'trial', 'results', 'for', 'its', 'vaccine']

其他形式的数据变换可能更深入,例如,文本数据被转换成数字数据。例如,如果我们收集了一组新闻文章,我们可以通过执行情绪分析变换它们。情绪分析是一种文本处理技术,可以生成一个数字,这个数字代表文本表达的情绪。

情感分析可以使用诸如SentimentAnalyzer(在包nltk.sentiment中)之类的工具来实现,其输出可能如下所示。

Sentiment URL
--------- ----------------------------------------------------------------
0.9313    /uk/shopping/amazon-face-mask-store-july-28/
0.9387    /save-those-crustacean-shells-to
                -make-a-sauce-base-1844520024

现在,数据集中的每个条目都包含一个数字,如0.9313,代表相应文章表达的情绪。通过数字形式表达每篇文章的情绪,我们可以计算整个数据集的平均情绪,从而确定对某个感兴趣的对象(如某个公司或产品)的总体情绪。

1.3.4 数据分析

数据分析是数据处理流程中的关键步骤。在这里,你可以解释原始数据,从而得出某些原本不明显的结论。

继续情绪分析示例,你可能希望研究特定时段内人们对公司的情绪与公司股价之间的关系。或者,你可以将股市指数(如标准普尔500指数)与同期大量新闻表达的情绪进行比较。下面的数据片段展示了标准普尔500指数与当天新闻的总体情绪。

Date         News_sentiment   S&P_500
--------------------------------------
2021-04-16   0.281074         4185.47
2021-04-19   0.284052         4163.26
2021-04-20   0.262421         4134.94

由于情绪数据和股票数据均用数字表示,因此你可以在同一个图上绘制两条对应的曲线以进行可视化分析,如图1-1所示。

图1-1 可视化数据分析的一个示例

可视化分析是解释数据最常用、最有效的方法之一。第8章将更详细地讨论可视化分析。

1.3.5 数据存储

在大多数情况下,你需要存储数据分析过程中生成的结果,以便以后使用。存储形式通常包括文件和数据库。如果数据可能会频繁使用,数据库可能是更好的选择。

1.4 Python特有的方式

若在数据科学中使用Python,代码应该以Python特有的方式编写,这意味着代码应该简洁、高效。以Python特有的方式编写的代码通常使用列表推导式(list comprehension)来实现。列表推导式可以使用一行代码实现数据处理功能。

第2章将更详细地介绍列表推导式。下面的简单示例说明了以Python特有的方式编写的代码在实践中是如何实现的。假设要处理下面包含多个句子的文本。

txt = ''' Eight dollars a week or a million a year - what is the difference? A mathematician or
a wit would give you the wrong answer. The magi brought valuable gifts, but that was not among
them. - The Gift of the Magi, O'Henry'''

具体来说,需要将文本按句子分割,去除标点符号,然后为每个句子创建单个单词的列表。使用Python的列表推导式功能,所有这些都可以在一行代码中实现,即用一行代码解决实际问题。

word_lists = [[w.replace(',','') ❶ for w in line.split() if w not in ['-']]
           ❷ for line in txt.replace('?','.').split('.')]

循环❷将文本txt拆分为句子,并将这些句子存储在一个更大的列表中。然后循环❶将每个句子拆分为单个单词,并将这些单词存储在这个更大的列表的一个列表中。因此,你会得到如下列表。

[['Eight', 'dollars', 'a', 'week', 'or', 'a', 'million', 'a', 'year', 'what',
  'is', 'the', 'difference'], ['A', 'mathematician', 'or', 'a', 'wit',
  'would', 'give', 'you', 'the', 'wrong', 'answer'], ['The', 'magi',
  'brought', 'valuable', 'gifts', 'but', 'that', 'was', 'not', 'among',
  'them'], ['The', 'Gift', 'of', 'the', 'Magi', "O'Henry"]]

在这里,你已经成功地在一行代码中完成了数据处理流程的两个步骤——清洗和变换。通过从文本中删除标点符号清洗数据,通过拆分单词形成每个句子的单词列表来变换数据。

如果你学习过另一种编程语言,请尝试使用该语言实现此任务。你的实现过程需要多少行代码呢?

1.5 总结

阅读本章后,你应该大致了解数据的主要类别、数据来源,以及典型的数据处理流程的主要步骤。

数据可以分为三大类——非结构化数据、结构化数据和半结构化数据。数据处理流程中的原始输入通常是非结构化数据,通过清洗和变换将其变换为结构化或半结构化数据,以便进一步分析。你还了解了在有些数据处理流程中从一开始就使用从API或关系数据库获取的结构化数据或半结构化数据。

相关图书

Python极客项目编程(第2版)
Python极客项目编程(第2版)
动手学自然语言处理
动手学自然语言处理
Python财务应用编程
Python财务应用编程
深度学习的数学——使用Python语言
深度学习的数学——使用Python语言
Web应用安全
Web应用安全
Python自动化测试教程
Python自动化测试教程

相关文章

相关课程