一、数据采集的方法
什么是数据采集? 从互联网、传感器和信息系统等来源获取所需要数据的过程。 它是大数据分析流程的第一步。 下图为数据采集在各行业的应用:
上图中的不同行业会从不同的地方获取数据,通过汇总不同的数据信息,就能得到得到更大更全的数据集。 数据采集的方法:传感器、日志系统(eg:Flume)、网络爬虫
1、传感器
**传感器(transducer/sensor)**是一种检测装置。能感受到被测量的信息,并将感受到的信息按所需形式进行信息输出,以满足信息的处理要求。
1.1、传感器主要应用
1.2、传感器的功能
传感器的功能与人类感官类似:
- 压敏、温敏、传感器流体传感器——触觉
- 气敏传感器——嗅觉
- 光敏传感器——视觉
- 声敏传感器——听觉
- 化学传感器——味觉
2、日志系统
系统日志记录系统中硬件、软件和系统问题的信息,同时还可以监视系统中发生的事件。 在windows系统的控制面板—管理工具—事件查看器,可以看到系统记录的信息。
许多企业的平台每天都会产生大量日志,需要日志系统对日志进行统一管理。 日志系统对终端日志进行管理,检测操作系统和设备日志信息。 常见的开源日志系统包括Apache的Chukwa,Linkedin的Kafka和Cloudera的Flume等。
上述的日志系统具有共同特征:
- 将应用系统和法分析系统联系起来
- 支持实时在线分析系统和离线分析系统
- 具有高拓展性
进行日志管理的第一步,是要进行日志采集,但需要注意,日志的等级规范:
- debug——调试信息
- info——用来收集关注的信息
- warn——警告信息
- error——错误信息
3、网络爬虫
网络爬虫(Web Crawler / Web Spider)是实现互联网数据采集的主要方式,是自动下载网页并提取所需信息的程序。其运行的主要对象是网站(website)。
3.1、爬虫的作用
- 作为搜索引擎的网页搜集器,抓取整个互联网,比如百度等
- 作为垂直搜索引擎,抓取特定主题信息,如视频网站等
- 作为测试网站前端的检测工具,用来评估网站前端代码的健壮性
3.2、爬虫的分类
- 批量爬虫:限制抓取的属性,当到达给定的条件,爬虫就会停止抓取过程
- 增量爬虫:持续不断的抓取网页数据。对于抓取的网页,爬虫需要定期更新
- 垂直爬虫:预先定义好主题,有选择地进行爬取。如Email地址、商品价格等
3.3、爬虫的框架
比如说我们对豆瓣高分电影等进行爬取。下面以电影《1917》为例
对电影进行元素审查是抓取信息前的必要步骤
二、数据采集的工具
1、日志系统 Flume
Flume是由Cloudera软件公司产出的可分布式日志收集系统,后来2009年被捐赠给Apache软件基金会,成为了Hadoop相关关组件之一,现已经成为了Apache的顶级项目之一。
1.1、工作机制
Apache Flume是一个从可以收集例如日志、事件等数据资源,并将这些数量庞大的数据从各项数据资源中集中起来存储的工具/服务。 Flume具有高可用,分布式的特点,其设计的原理也是基于将数据流,如日志数据从各种网站服务器上汇集起来存储到HDFS,Hbase等集中存储器中。
1.2、应用场景
- Flume获取消费者访问的页面以及点击商品的次数,存储在Hadoop平台进行分析。
- 制作精准的内容推送,比如广告定点投放和新闻的私人定制。
2、日志系统 Kafka
- Kafka是一种高吞吐量的分布式分布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。
- Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。
2.1、应用场景
- 日志收集:企业用Kafka收集各种鼓舞日志,并开放给各种consumer消息系统。
- 用户活动跟踪:记录web用户或者app用户的各种活动,比如浏览网页、搜索等进行数据分析。
- 运营指标:Kafka也经常用来记录运营监控数据,比如报警和报告。
- 流式处理:比如spark streaming和storm。
2.2、工作机制
tips: Producer:向Topic发布消息的客户端。 Consumer:从Topic订阅消息的客户端。 Producer和Consumer可以同时从多个Topic读写数据。
3、日志系统 Chukwa
Chukwa是一个开源的用于监控大型分布式系统的数据收集系统。继承了Hadoop的可伸缩性和健壮性。 除此之外,Chukwa还包含了一个强大和灵活的工具集,可用于展示、监控和分析已收集的数据。
3.1、Chukwa的架构
Agent:驻守在各个节点上的负责收集数据的程序,由若干adapter组成。 adapter执行实际收集数据的工作,而Agent负责adapter的管理。 Collector收集各个Agent传来的数据,并将这些数据写入HDFS。 Map/Reduce jobs定时启动,负责把集群中的数据分类、排序、去重和合并。
3.2、各个日志系统的对比
日志系统的三个基本组件: Agent(封装数据源,将数据源中的数据发送给collector) Collector(接收多个agent的数据,并进行奎总后导入后端的store中) Store(中央存储系统,具有可拓展性和可靠性)
4、网络爬虫
有多种编程语言都可以对网络爬虫进行开发,但是我们通常使用Python
为什么用Python呢? 因为Python实现网络爬虫更加简单快捷。
4.1、Python的特点
- 语法简单易用
- 开发迅速
- 提供交互式的Shell,便于调试
- 网络功能简单易用
Python为实现网络爬虫提供了许多强大的功能库: 通过使用这些网络库,我们可以对网络上的一些资源进行操作。
4.2、爬虫库的使用与解析
网络爬虫使用Python网络库和远程服务器建立联系。
1、urllib库
urllib是Python自带的标准库,无需安装
有以下功能:
- 网页请求
- 响应获取
- 代理和cookie设置
- 异常处理
- URL解析
2、Requests库
Requests库是基于urllib,采用Apache2 Licensed开源协议的HTTP库,比urllib更加方遍。
安装:win R
输入:pip install requests
3、re库
re库用来使用正则表达式。 正则表达式是对字符串进行操作的一种逻辑公式
- 用事先定义好的字符串和字符组合,组成“规则字符串”;
- 用来表达对字符串的一种过滤逻辑。
除了正则表达式以外,Python还提供了两种强大的解析库。
4、BeautifulSoup
- 处理不规范标记并生成分析树(parse tree)。
- 提供简单常用的导航,搜索以及修改分析树的操作功能。
5、lxml
- 同样提供文本解析功能。
4.3、Python爬虫案例
1、普通爬取
以爬取豆瓣阅读为例: 解析页面
代码语言:javascript复制利用正则表达式对标签进行定位
import re
import urllib
from urllib.request import urlopen
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0'}
url = 'https://read.douban.com/provider/all'
ret = urllib.request.Request(url, headers=headers)
res = urlopen(ret)
con = res.read().decode('utf-8')
# 正则表达式中,普通字符代表着寻找文本中的对应的字符
# .的含义是匹配除“n”之外的任何单个字符,n是换行的意思
# *匹配前面的子表达式零次或多次
# ?使用非贪婪模式,也就是尽量匹配到少的字符
pat1='<div class="name">(.*?)</div>'
publish_name=re.compile(pat1).findall(con)
pat2='<div class="works-num">(.*?) 部作品在售</div>'
book_number=re.compile(pat2).findall(con)
pat3='<div class="avatar"><img src="(.*?)"'
picture_link=re.compile(pat3).findall(con)
使用for循环打印输出结果
# 输出爬取结果
for i in range(len(publish_name)):
print(publish_name[i],book_number[i],picture_link[i])
如果想把得到的结果以表格的形式展现出来:
代码语言:javascript复制import pandas as pd
然后添加以下代码块:
代码语言:javascript复制df = pd.DataFrame([publish_name,book_number,picture_link])
df.T.head()
最终可以得到下图:
2、Scrapy框架
Python的Scrapy框架是一套比较成熟的爬虫框架,可以高效地爬取web页面并提取出结构化数据。 Scrapy应用的范围非常广:爬虫开发、数据挖掘、数据检测、自动化测试。
Scrapy的特点:
- 提供用CSS和XPath定位标签和提取数据的方法。
- 提供可交互的命令行,易于开发和调试。
- 可将数据保存成多种样式(JSON,CSV,XML)。
- 支持多种存储方式(本地文件系统,FTP,S3)。
- 扩展性好,开发容易Middlewares,Extensions,Pipelines。
三、数据清洗的方法
1、数据清洗概括
随着信息技术的快速发展,数量信息量日渐增加,从海量数据中提取有用的信息的同时,需要对质量不高的数据进行处理。 大数据的处理主要是对数据的清洗,将其转化为可利用的数据目标,数据科学家约60%的时间都在进行数据清洗工作。
数据清洗是对数据进行转换、缺失处理、异常处理等。数据清洗可以提高数据的质量,提高数据分析的准确性。 数据清洗一般在大数据分析流程中的第三步:
1.1、数据来源
大数据分析中的数据一般来自于:
- 传统的关系型数据库
- 互联网平台的埋点数据
- 第三方数据
1.2、一般流程
2、数据类型和基本统计信息
数据是一个十分广泛的概念,并且与我们的生活息息相关:
- 数据可以是音乐、图片、视频
- 也可以是语言、文字、数字等
对于不同类型的数据,需要采取不同的处理方法
数据类型一般分为:表格数据、多媒体数据、网络数据等。
2.1、数据类型
1、表格数据
表格数据一般为数据集:
- 由数据对象构成
- 数据表格中的行为数据对象
- 数据表格中的列为数据属性
表格数据中的列表示数据对象的某个特征:
上图中的数据特征对应的值有几种类型: ①数值型:最常见的数据类型
- 连续型数值:价格;BMI指数
- 离散型数值:年龄;孩子个数
②等级型:有顺序、等级之分的离散型数据,可分成不同类型
- 年纪:1年级、2年级、3年级
③名义型:可分成不同类别,没有等级之分
- 地区:南方、北方
④布尔值:0和1;True or False
2、多媒体数据
- 图像
- 视频
- 语音等
2.2、数据的基本统计信息
了解数据的基本统计信息,可以更好的理解数据,获取数据的基本分布
1、基本统计信息
- 数据的中心趋势:均值、中位数等
- 数据的离散程度:最小值、最大值、方差、分位数等
- 离散性数据的分类及其数量统计
2、数值类型数据的基本统计信息
根据上面的表格(含有age)我们可以计算出如下的值:
3、离散型数据类别统计
2.3、数据可视化
通过数据可视化的方式可以了解数据的分布情况 4. 直方图:了解数值型数据的分布情况 5. 条形图:了解离散型数据的分类情况
3、数据质量评估与处理
3.1、数据的质量评估
- 数据的准确性:数据中是否含有异常数据、错误数据等
- 数据的一致性:数据格式是否一致
- 数据的时效性:数据信息是否能正确体现当前的情形
- 数据的完整性:数据是否存在缺失值
3.2、处理
1、缺失值处理
- 确定缺失值的范围及所占比例
- 提取需要的特征属性(去除不需要的特征属性)
- 删除缺失值或者填补缺失值
2、异常值处理
- 检测异常值:基于统计、距离等方法进行检测
- 删除异常值或者保留异常值
3、数据转换
- 数据转换是对格式不统一的数据进行转换。
- 不同数据文件格式的转换
- 去除重复的数据
- 数据标准化:避免连续性数值的方差过大或者取值范围不一致等问题对后续分析的影响
- 数据离散化:将连续型数据转换成离散型数据
- 特征编码:将非数值型数据转换成数值型数据,方便后续建立分析模型
四、数据清洗的工具(***)
1、Python数据清洗概述
Python是大数据清洗常用的工具之一。除了Python以外还有Trifacta Wrangler 和 OpenRefine两种常用的大数据清洗工具。
- Python的Pandas和Sklearn库可进行数据转换等操作
- Pandas库:提供数据导入、数据可视化、整合、转换等功能
- Sklearn库:提供数据标准化、数据离散化、特征编码等功能
导入数据集:
代码语言:javascript复制import pandas as pd
df = pd.read_csv("insurance.csv")
1.1、查看数据类型
1.2、数值型变量分布情况
根据上图可以看出特征age可能存在的异常值:8和200
1.3、查看存在异常值的数据
1.4、查看缺失值
1.5、对保留下来的行中的缺失值进行填补
2、Python清洗案例
代码语言:javascript复制# 载入必要库
# numpy是一个数值计算库,能够快速的进行矩阵计算
import numpy as np
# pandas基于numpy的一种数据分析工具,能够快速的进行数据分析、可视化
import pandas as pd
# matplotlib是一个2D绘图库,能够跨平台的快速绘制图表
import matplotlib.pyplot as plt
# 一种基于matplotlib的绘图库,能够通过简单的配置,把图表绘制得更好看
import seaborn as sns
# 由于我们的酷客平台底层是基于IPython的,因此可以使用IPython自带的一些方法
# 比如这个方式就是让前端展示一些数据
# 除了display方法,同样的还存在例如display_jpeg等其他的方法
from IPython.display import display, display_png, Image
# 前面带有%的方法都是magic方法,能够对前端展示进行一些配置
%matplotlib inline
代码语言:javascript复制# 字体补丁
plt.rcParams['font.family'] = ['DejaVu Serif']
代码语言:javascript复制# 使用display系的方法对图片进行展示
# 展示的内容是CSV的文件格式
# CSV使用的是,对字段进行分割
# 逗号前后是两个不同的字段
# 如果数据中原本就有逗号
# 例如Hello, everyone.,那么就会被双引号包裹起来,变成"Hello, everyone."
# 如果内容里还有双引号,那么双引号会被转义
display_png(Image("./input/CSV.png"))
代码语言:javascript复制# 读取数据
# read_csv是读取csv文件的,同理,还有很多read类型的方法
# 例如pd.read_clipboard, pd.read_excel, pd.read_json等等,方便从各种格式中读取数据
df = pd.read_csv("./input/insurance.csv")
# 查看数据,展示前5行
display(df.head())
# 可以通过n这个参数来制定显示的行数
df.head(n=10)
代码语言:javascript复制# 查看数据类型
# 数据会划分类型:
# int64是64个比特长度的整型,大小范围在-2^63到2^63-1之间
# object是一个python对象
# float64是64个比特长度的浮点数,大小范围在为-2^1024到2^1024之间,但是有精度限制
df.dtypes
代码语言:javascript复制# 数据的统计汇总
# count数量,除去空值
# mean均值
# std标准差
# min最小值
# 25%百分位点
# 中值
# 75#百分位点
# 最大值
df.describe()
代码语言:javascript复制# 数据的维度
# 数据的形状
df.shape
代码语言:javascript复制# 性别的分布
# 对性别进行统计,两种不同性别分别有多少
df['sex'].value_counts()
代码语言:javascript复制# 是否吸烟的分布
# 对是否吸烟进行统计,了解有多少人吸烟
df['smoker'].value_counts()
代码语言:javascript复制df['smoker'].value_counts().values
代码语言:javascript复制# 地区的分布
# 地区的统计
df['region'].value_counts()
代码语言:javascript复制# 费用分布直方图
# hist是直方图,用来统计频率或者频数
fig,ax=plt.subplots(figsize=(10,8))
# 这里使用的是dataframe类中的plot方法,内部其实也是调用matplotlib
df['charges'].plot(kind="hist",fontsize=16)
ax.set_ylabel("Frequency",fontsize=16)
Text(0,0.5,'Frequency')
代码语言:javascript复制# 吸烟者与非吸烟者的分布条形图
# bar是条形图,用于统计不同类别的数量
fig,ax=plt.subplots(figsize=(10,8))
# 使用matplotlib进行数据展示
plt.bar(df['smoker'].value_counts().index,height=df['smoker'].value_counts().values)
<Container object of 2 artists>
代码语言:javascript复制# 异常值检测
df.loc[(df['age']==8 ) | (df['age']==200)]
代码语言:javascript复制# 异常值处理
# 使用nan空值去替换原来的年龄
df.loc[2,'age']=np.nan
df.loc[114,'age']=np.nan
# 缺失值统计
# isna的意思是是否为空值
df.isnull().sum()
代码语言:javascript复制# isnull演示
df.isnull()
代码语言:javascript复制np.unique(np.where(df.isnull())[0])
代码语言:javascript复制# 查看存在缺失值的数据行
# where方法返回所有等于True的位置,分别存放在两个数组中
# 前一个是行,后一个是列
df.iloc[np.unique(np.where(df.isnull())[0])]
代码语言:javascript复制# 去掉存在超过3个缺失值的数据行
# thresh=4的意思是,除了缺失值意外事件的值还剩下4个或以上的,才保留
df = df.dropna(thresh=4)
# thresh演示
df_tmp = df.iloc[np.unique(np.where(df.isnull())[0])]
df_tmp.dropna(thresh=7)
代码语言:javascript复制# 再次查看存在缺失值的数据行
df.iloc[np.unique(np.where(df.isnull())[0])]
代码语言:javascript复制# 性别特征的众数
# 众数就是最多的那个类别
df['sex'].mode()
代码语言:javascript复制# 缺失值插补
# 填补众数
df['sex'].fillna('male',inplace = True)
# 缺失值插补
# 填补均值
df['bmi'].fillna(df['bmi'].mean(),inplace=True)
# 缺失值插补
# 填补默认值
df['smoker'].fillna('no',inplace=True)
# 缺失值插补
# 填补均值
df['age'].fillna(df['age'].mean(),inplace=True)
# 再次查看存在缺失值的数据行
df.iloc[np.unique(np.where(df.isnull())[0])]
代码语言:javascript复制# 数据类型转换
df['children'] = df['children'].astype('int64')
df['children'].dtype
代码语言:javascript复制# 最后的df的数据类型
df.dtypes
代码语言:javascript复制df.head(n=10)
五、Scrapy爬虫框架案例
爬虫框架:
关于Scrapy爬虫框架会在过一段时间以后进行更新,请谅解!