读:原始数据本身没有用。为了使它实际有用,你需要准备它。
作者:Mars Geldard, Jonathon Manning, Paris Buttfield-Addison, Tim Nugent
来源:华章科技
数据准备的关键和重复阶段是数据探索。一组因为太大而无法由人工手动读取、检查和编辑每个值的数据,仍需要验证其质量和适用性,然后才可以将其委托给一个值得花费时间和计算的模型。
与将大型数据集的样本转储到电子表格程序中的方法一样简单,只需查看每列中出现的值的类型或范围,即可识别诸如不负责任的默认值之类的错误(例如,在没有测量值的情况下,使用零而不是NULL)或不可能的范围或不兼容的合并(数据似乎来自多个来源,每个来源中使用了不同的单位。例如,华氏度与摄氏度)。
数据分析工具非常丰富。当数据集太大而无法在电子表格程序中打开时,Python脚本或像RStudio这样的应用程序具有可视化、汇总或报告数据的强大功能。使用你熟悉的任何方法,至少要确定不同属性值的格式和一般分布。
在能够使用数据集之前,有许多工具可以用于清洗、处理和了解数据集。Python是这方面的事实标准,它有很多工具来理解和处理数据。
Matplotlib之类的包,通常可以非常容易地生成用于可视化检查的数据图表。
Pillow提供各种处理、转换和操作图像的功能。
Python有一个用于执行统计的内置程序包,如果需要更多功能的话,NumPy也有。
Python还具有广泛的内置和第三方支持内容,可处理你将要遇到的几乎所有文件格式,包括CSV、JSON、YAML、XML和HTML,以及更深奥的格式(如TOML或INI文件)。
如果这些都不起作用,则有一个值得搜索的软件包索引器,可以查看是否有解决你的问题的方法。或者,只需搜索“我想用Python做事情”,大多数情况下,你会发现某人遇到了相同的问题,并为此提供了解决方案,或者至少提供了一些可以查看的指引。
如果你不喜欢Python,那么几乎所有选择的编程语言都具有类似的工具和功能。我们之所以喜欢Python,是因为这些工作已经为你完成了,而且有很多例子可以作为起点。Python在这方面没有什么神奇之处,但它是最受欢迎的选择,所以我们提倡坚持使用主流工具。
另一个不错的选择是电子表格程序,例如Excel、Numbers或Google Sheets。它们经常受到指责,因为在这些程序中进行数据准备可能很麻烦,但在需要使用Python(或你选择的其他工具)之前,你可以使用它们非常快速地获得大量有用的洞见和准备。作为系统附赠的工具,你基本上肯定已经安装了其中一个,并且可以在你的机器上运行。
最后,不要害怕跳出框架思考——一些像压缩数据集这样简单的东西,甚至不需要看数据集内部就能大致了解数据集的熵大小。如果一个数据集压缩得非常好,而来自相同来源的另一个数据集压缩得不那么好,那么第二个数据集的数据的熵可能比第一个数据集的大。
图像数据集不是那么容易观察到的,但绝对值得花时间浏览一下图像的总体质量,以及图像使用了哪些裁剪方法。像Turi Create这样的可视化功能对于了解数据非常有用。图3-1显示了一个例子。
▲图3-1 通过Turi Create了解你的数据
在了解数据集的过程中,你可能会遇到一些错误。记录数据可能会产生错误。需要检查的错误有以下几类:
一致值错误包括可能导致整列或一组值不准确的情况,例如,使用仪器记录某个被统一量校准错误的数据,从产生额外热量的物体旁边测量温度,使用未提前归零的天平称重,等等。这还包括来自不同来源的数据未经转换就被不当合并的情况:简单压缩一组来自美国和一组来自英国的数据,现在系统认为100摄氏度完全合理。
单值错误用于描述离群值或不一致的错误校准,仅在少数情况下导致不准确或完全不合逻辑的值。可能出现的情况,如传感器超载一天,产生的值比理论可能的高1000%(应该是相当明显的)。
当用于记录数据的方法出现问题,或者数据集在其生命周期的某个时刻经历了某种畸形的转换时,可能会出现缺失值。这些可能是简单的nil或NULL值,或者一些不太有用的值,例如字符串"NONE"或默认值0。有些甚至可能只是无意义的字符,什么都有可能出现。
如果可以识别出一致误差,那么这通常可以通过按一致误差值缩放或转换整个值集来纠正。单值错误和缺失值要求你要么猜测需要使用某种可行方法替换的值,要么完全删除行或者观察值以防止出现误差。
你可以通过以下方法来猜测该值:获取该列中所有其他值的平均值;使用该列中与缺失值最接近的观察值;使用一些使用其他属性知识的特定于应用程序的方法。
在使用数据之前进行转换有两个主要原因:为了满足要使用的算法的格式要求;使用新的推断属性改进或扩展当前数据。对于这两种目的,通常有三种数据转换:
1. 归一化(normalization)
一种用于数值数据的方法,它将上界和下界绑定到一个数值范围上,使它们更容易处理。
这方面的一个例子是对数值数据的观察值需要与不同的度量进行比较。如果你试图根据鱼的长度、体重、年龄和失去眼睛的数量来评估不同鱼的健康状况,大概每个人都会同意用不同的标准来比较两条鱼(例如,一只眼睛与一年的鱼,或者一厘米长度的相比较)。如果用同样的标准来比较,则会得出不同的结果。
归一为正数值很简单:
2. 泛化(generalization)
一种将特定值替换为更高级别的概念,以更好地进行群体观察的方法。
当记录某些属性的方法比需要的更精确时,通常会发生这种情况。例如,如果你具有某人运动的GPS统计信息,则可以将纬度和经度归纳为一个地址,从而防止系统将每一个小运动都视为位置变化。或者,将数值测量值转换为人类群体,这意味着相关因素可能不是将个人的身高测量值以毫米为单位,而是将其分为低于、接近或高于平均的身高。
3. 聚合(aggregation)
对某些复杂属性进行总结以使分析更有效的一种方法。
例如,可以从文本中提取关键字(甚至是单词频率),而不是分析文本的段落(Attribute: Text,Classification: Class),只显示与所给出的分类最相关或最独特的方面。
在这些步骤之前、之间或之后,可能会出现不同类型的数据转换,数据可能被更改、扩展或缩减:
一种创建新属性的方法,通常通过推理或组合已有的其他值来实现。
这方面的一个例子是泛化或聚合,其中原始值也被保留,或者更常见的是,当存在两个或多个值时(或允许发现第三个值)。例如,如果你有一家公司的名称和经营所在国,可以查一下它的商业登记号;如果你有某人的身高和体重,可以构建他们的BMI。
一种删除某些属性的方法,这些属性可能与另一个属性相关,也可能与你试图解决的问题无关。
例如,如果你有某人的地址、邮编和区号,这些信息中至少有一条是多余的。也许—就像在特征构建的例子中那样—你由于一些算法的原因想要同时分析两者,但这是不可能的。两个或多个属性之间的高度相关性表明,它们可能在分析中导致错误,并可能被删除。
到了这一步,你应该花更多的时间仔细地看看你试图解决的问题和打算用于任务的数据集。在AI应用程序之前的数据分析世界中,可能没有你想要的那么严格的规则,但你通常会知道一个解决方案是否可行,一个数据集是否能讲述你想要的故事。
相信这个小小的声音,因为如果你回头看,会发现浪费的工作是有价值的。
再次探索你的数据。浏览并可视化它,用少量的数据子集测试你的解决方案—做你需要做的任何事情。如果感觉还是正确的,那就继续前进。
关于作者:Mars Geldard,来自澳大利亚塔斯马尼亚州的研究者和计算机科学家。
Jonathon Manning,Secret 实验室的联合创始人兼技术主管,该实验室位于澳大利亚塔斯马尼亚州,已成立十几年了。
Paris Buttfield-Addison,计算机科学家和历史学家,也是Secret 实验室的联合创始人和产品研发负责人。
Tim Nugent,移动应用程序开发者、游戏设计师和计算机研究者。
本文摘编自《Swift人工智能实战:从基础理论到AI驱动的应用程序开发》,经出版方授权发布。
延伸阅读《Swift人工智能实战》
推荐语:本书从实战角度出发,为所有程序员和开发人员提供了使用Swift进行AI和机器学习开发的一站式服务。全书分为三部分:第一部分介绍机器学习和人工智能背后的基础知识;第二部分讨论许多有趣的主题,包括计算机视觉、音频、运动和语言;第三部分详细研究为第二部分的应用程序提供支持的技术。
联网上有极其丰富的数据资源可以使用。使用Excel可以自动读取部分网页中的表格数据,使用Python编写爬虫程序可以读取网页的内容。
本节通过Python编写测试用Web应用程序,然后使用Excel和Python从编写的Web网站上获取数据。
通过Python Flask Web框架分别构建一个Web网站和一个Web API服务。
1.构建Web网站
新建一个名为“5-5-WebTable.py”的Python脚本,创建一个包含表格的简单网页。如果读者对构建方法不感兴趣,可跳过以下代码,直接执行脚本“5-5-WebTable.py”打开网站。
(1)安装flask包。
pip install flask
(2)构建包含表格的网页。
from flask import Flask
app=Flask(__name__) # 创建Falsk Web应用实例
# 将路由“/”映射到table_info函数,函数返回HTML代码
@app.route('/')
def table_info():
return """<h2>HTML表格实例,用于提供给Excel和Python读取</h2>
<table border="1">
<caption>用户信息表</caption>
<tbody><tr>
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
</tr>
<tr>
<td>小米</td>
<td>女</td>
<td>22</td>
</tr>
……….
</tbody></table>"""
if __name__=='__main__':
app.debug=True # 启用调试模式
app.run() # 运行,网站端口默认为5000
通过命令“python ./5-5-WebTable.py”启动网站,然后在浏览器中输入http://127.0.0.1:5000/,出现如图1所示的网页内容。
图1 使用Flask构建的测试网站
2.构建Web API服务
新建一个名为“5-5-WebAPI.py”的Python脚本,使用flask_restplus包构建Web API服务。如果读者对构建方法不感兴趣,可跳过以下代码,直接执行脚本“5-5-WebAPI.py”打开Web API服务。
(1)安装flask_restplus包。
pip install flask-restplus
(2)导入必要的库与初始化应用对象。
from flask import Flask
# Api类是Web API应用的入口,需要用Flask应用程序初始化
from flask_restplus import Api
# Resource类是HTTP请求的资源的基类
from flask_restplus import Resource
# fields类用于定义数据的类型和格式
from flask_restplus import fields
app=Flask(__name__) # 创建Falsk Web应用实例
# 在flask应用的基础上构建flask_restplus Api对象
api=Api(app, version='1.0',
title='Excel集成Python数据分析-测试用WebAPI',
description='测试用WebAPI', )
# 使用namespace函数生成命名空间,用于为资源分组
ns=api.namespace('ExcelPythonTest', description='Excel与Python Web API测试')
# 使用api.model函数生成模型对象
todo=api.model('task_model', {
'id': fields.Integer(readonly=True,
description='ETL任务唯一标识'),
'task': fields.String(required=True,
description='ETL任务详情')
})
(3)Web API数据操作类,包含增、删、改、查等方法。
class TodoDAO(object):
def __init__(self):
self.counter=0
self.todos=[]
def get(self, id):
for todo in self.todos:
if todo['id']==id:
return todo
api.abort(404, "ETL任务 {} 不存在".format(id))
def create(self, data):
todo=data
todo['id']=self.counter=self.counter + 1
self.todos.append(todo)
return todo
# 实例化数据操作,创建3条测试数据
DAO=TodoDAO()
DAO.create({'task': 'ETL-抽取数据操作'})
DAO.create({'task': 'ETL-数据清洗转换'})
DAO.create({'task': 'ETL-数据加载操作'})
(4)构建Web API的路由映射。
HTTP资源请求类从Resource类继承,然后映射到不同的路由,同时指定可使用HTTP方法。
@ns.route('/') # 路由“/”对应的资源类为TodoList,可使用get方法和post方法进行请求
class TodoList(Resource):
@ns.doc('list_todos') # @doc装饰器对应API文档的信息
@ns.marshal_list_with(todo) # @marshal_xxx装饰器对模型数据进行格式转换与输出
def get(self): # 定义get方法获取所有的任务信息
return DAO.todos
@ns.doc('create_todo')
@ns.expect(todo)
@ns.marshal_with(todo, code=201)
def post(self): # 定义post方法获取所有的任务信息
return DAO.create(api.payload), 201
# 路由/<int:id>对应的资源类为Todo,可使用get、delete、put方法进行请求
@ns.route('/<int:id>')
@ns.response(404, '未发现相关ETL任务')
@ns.param('id', 'ETL任务ID号')
class Todo(Resource):
@ns.doc('get_todo')
@ns.marshal_with(todo)
def get(self, id):
return DAO.get(id)
@ns.doc('delete_todo')
@ns.response(204, 'ETL任务已经删除')
def delete(self, id):
DAO.delete(id)
return '', 204
@ns.expect(todo)
@ns.marshal_with(todo)
def put(self, id):
return DAO.update(id, api.payload)
if __name__=='__main__':
app.run(debug=True, port=8000) # 启动Web API服务,端口为8000
(4)开启Web API服务。
通过命令“python ./5-5-WebAPI.py”启动Web API服务,在浏览器中输入“http://127.0.0.1:8000/”
将出现如图5-23所示的Web API服务请求方法列表。
图2 WebAPI服务请求方法列表
Excel可以通过“数据”选项卡下的“自网站”功能抓取网页数据。Python可以使用 requests 库、Beautiful Soup包、Scrapy框架抓取网页数据。
1.通过Excel抓取
单击“数据”→“自其他源”→“自网站”功能。Excel可读取的网页数据有局限:动态网页数据无法自动识别,非表格数据无法自动识别。
(1)单击“数据”→“自其他源”→“自网站”功能。
(2)确保在5.5.1节中编写的Web网站已经开启。
(3)输入网站URL地址“http://127.0.0.1:5000/”
单击“高级”按钮可配置更详细的HTTP请求信息,然后单击“确定”按钮,如图3所示。
图3 配置要读取网站的URL
(4)在“导航器”窗口中选择导入数据。
如图4所示,Excel自动识别网页中的表格数据,选择表名后单击“加载”按钮即可。
图4 Excel自动识别网页中的表格数据
2.使用Python抓取
下面演示使用requests库抓取整个网页中的数据,然后使用Beautiful Soup解析网页。读者可参考本书代码素材文件“5-5-web.ipynb”进行学习。
(1)通过requests读取网页数据。
import requests #导入requests包
url='http://127.0.0.1:5000/'
strhtml=requests.get(url) #使用get方法请求网页数据
(2)通过Beautiful Soup解析网页。
from bs4 import BeautifulSoup
soup=BeautifulSoup(strhtml.text) # 将网页内容作为参数,创建soup对象
table=soup.find('table') # 查找网页中的table元素
table_body=table.find('tbody') # 查找table元素中的tbody元素
data=[]
rows=table_body.find_all('tr') # 查找表中的所有tr元素
for row in rows: # 遍历数据
cols=row.find_all('td')
cols=[ele.text.strip() for ele in cols]
data.append([ele for ele in cols if ele])
# 结果输出:[[],
['小米', '女', '22'],['小明','男','23'],……
Excel可以通过“数据”选项卡下的“自网站”功能调用Web API服务。Python可以使用 requests 库、Beautiful Soup包、Scrapy框架调用Web API获取数据。
1.使用Excel调用
(1)确保5.5.1节中编写的Web API服务已经开启。
(2)输入Web API方法对应的URL:
http://127.0.0.1:8000/ExcelPythonTest/。
(3)处理返回的数据。
调用Web API服务后数据以JSON格式返回,按照5.4.3小节中介绍的方法处理JSON数据。
2.使用Python调用
使用requests库调用Web API方法,然后对返回的JSON数据进行处理,读者可参考本书代码素材文件“5-5-api.ipynb”进行学习。
import requests #导入requests包
url='http://127.0.0.1:8000/ExcelPythonTest/'
strhtml=requests.get(url) #使用get方法获取网页数据
import pandas as pd
frame=pd.read_json(strhtml.text) #使用Pandas包中的read_json函数
print(frame)
#结果输出:
id task
0 1 ETL-抽取数据操作
1 2 ETL-数据清洗转换
2 3 ETL-数据加载操作
表1所示为Excel和Python抓取互联网数据方法的对比。需要注意Excel从互联网抓取数据的功能并不完善。
表1 Excel和Python抓取互联网数据方法对比
声明:本文选自北京大学出版社的《从零开始利用Excel与Python进行数据分析》一书,略有修改,经出版社授权刊登于此。
ython爬虫是一种使用Python语言编写的网络爬虫程序,用于从互联网上抓取数据并进行分析和处理。Python具有丰富的网络库和强大的数据处理能力,使得它成为爬虫开发的理想选择。
以下是一个简单的Python爬虫示例,用于抓取指定网页上的标题并打印出来
import requests
from bs4 import BeautifulSoup
# 目标网页的URL
url='http://example.com'
# 发送HTTP请求获取网页内容
response=requests.get(url)
# 使用BeautifulSoup解析网页内容
soup=BeautifulSoup(response.text, 'html.parser')
# 查找所有的标题标签
titles=soup.find_all('title')
# 打印每个标题的内容
for title in titles:
print(title.text)
在这个示例中,我们首先使用requests库发送HTTP请求获取目标网页的内容。然后,我们使用BeautifulSoup库对网页内容进行解析,并查找所有的标题标签。最后,我们遍历每个标题标签并打印出它们的内容。
当然,实际的爬虫程序可能会更加复杂,需要处理各种异常情况、反爬虫机制、数据清洗和存储等问题。但是,通过掌握Python的基础语法和网络库的使用方法,你可以逐步构建出功能强大的爬虫程序,从互联网上获取你需要的数据。
需要注意的是,爬虫程序必须遵守网站的robots协议和相关法律法规,不得对网站造成过大的负担或侵犯网站的权益。在进行爬虫开发时,请务必注意合法性和道德性。
*请认真填写需求信息,我们会在24小时内与您取得联系。