数据预处理概念的分享(二)

Python编程语言的比较
我们需要使用各种各样的工具实现预处理,比如Excel和一些专门用于分析的收费软件,如下3种比较受数据科学家青睐的编程语言为工具。

下面列举的3种编程语言基本上可以免费使用,但部分用于执行SQL代码的数据库会收费。

SQL(应用于BigQuery、Redshift等数据库的数据操作语言)
R
Python
上述3种编程语言都能用于预处理,但它们之间有很大的不同,各自的特征如表1-1所示。

3种编程语言各自的特征
  1. SQL(DataBase)
  2. R
  3. Python(版本3)

在这里插入图片描述

表仅表示一般情况,并非在所有情况下都是如此。比如,有些人就可以用R编写出能高速处理的代码,或用Python编写出简洁的代码。虽然我们也可以使用单一的编程语言实现所有预处理,但如果使用多种语言,那么实现效率会更高。

正确使用编程语言

考虑到各编程语言的特征,我们通常会按如下方式区分使用。

  • R和Python最多只能处理内存大小的数据(因为R和Python是基于内存的编程语言),而SQL能够借助数据库资源处理超过内存大小的数据。因此,在针对大批量数据执行提取操作时,使用SQL比较好
  • 在将数据从纵向转换为横向时,如果用SQL描述,代码会变得非常冗长,而如果使用R和Python,一个命令就能搞定,所以通常使用R和Python实现
  • R适用于即时分析,因为它可以一边记录执行结果一边执行分析工作,实现起来很轻松(Python需要借助Jupyter
    Notebook工具才能实现即时分析)
  • 当需要系统地进行预处理时,由于SQL和Python的系统化环境比较丰富,和其他系统的兼容性更强,所以通常选择这两种语言

如上所述,不同的编程语言适用于不同的处理,而且在不同的预处理阶段,最适合的编程语言也有所不同。一般来说,对数据结构的预处理使用SQL,对数据内容的预处理则分两种情况:在需要生成报告或进行即时分析时使用R;在需要进行系统化处理时使用Python。

读到这里,可能有部分读者无法接受以上关于编程语言的一些观点,认为“SQL才是一切的基础,应该使用SQL”“有大量分析包的R才是最好的编程语言,应该使用R”“所有系统性的处理操作都可以用Python编写,Python才是最好的编程语言”“用C语言从头开始写算法的人才是真正的数据科学家”……大家可以通过社交网络进一步交流。

包和库

通常,第三方模块在R中称为“包”,在Python中称为“库”。

用于数据分析的包和库

在使用R和Python分析数据时,需要用到包和库,例题的答案代码中有时会省去相关包和库的导入代码。

用于数据分析的R包

R中提供了许多包,将使用非常受欢迎的tidyverse包集合实现预处理,它可以将用于数据读取、预处理、可视化和建模的包全部导入。将会用到tidyverse包集合中的dplyr包。下面是包的安装方法和导入方法。

包的安装方法
# 安装tidyverse包集合(如果已安装,则不需要这一步)
install.packages('tidyverse')
包的导入方法
# 导入tidyverse包集合
library(tidyverse)

用于数据分析的Python库

Python在诞生之初并不是一种用于数据分析的编程语言,然而随着其普及程度的提高,以及NumPy库和Pandas库的出现,Python也开始广泛用于数据分析。下面是库的安装方法和导入方法。

库的安装方法
# 在终端执行以下命令(要事先确保能调用pip3命令)
# 使用pip3命令,在Python中安装NumPy库
pip3 install numpy
# 使用pip3命令,在Python中安装Pandas库
pip3 install pandas
库的导入方法
# 导入NumPy库(as np是程序调用NumPy库时的缩写设置)
import numpy as np
# 导入Pandas库(as pd是程序调用Pandas库时的缩写设置)
import pandas as pd

数据集

例题所用的数据集,主要包括以下4种。

  • 酒店预订记录
  • 工厂产品记录
  • 月度指标记录
  • 文本数据集

接下来,我们逐个看一下以上数据集的内容。如下页所示,在描述数据集时,括号内是相应的属性在程序中的名称,冒号后面是初始数据类型。

酒店预订记录

该数据集汇集了酒店的预订信息,由预订记录表(图1-4)、酒店主表(图1-5)和顾客主表(图1-6)组成。酒店主表和预订记录表可通过酒店ID关联,顾客主表和预订记录表可通过顾客ID关联。

预订记录表(reserve_tb)
预订ID(reserve_id):字符串
酒店ID(hotel_id):字符串
顾客ID(customer_id):字符串
预订时间(reserve_datetime):字符串
入住日期(checkin_date):字符串
入住时间(checkin_time):字符串
退房日期(checkout_date):字符串
顾客数(people_num):整数
住宿费总额(total_price):整数

在这里插入图片描述

酒店主表(hotel_tb)
酒店ID(hotel_id):字符串
基本费用(base_price):整数
大区域名称(big_area_name):字符串
小区域名称(small_area_name):字符串
世界坐标系4中酒店的纬度(hotel_latitude):十进制浮点数
世界坐标系中酒店的经度(hotel_longitude):十进制浮点数
是否为商务酒店(is_business):布尔值

在这里插入图片描述

酒店主表
顾客主表(customer_tb):字符串
顾客ID(customer_id):字符串
年龄(age):整数
性别(sex):字符串
日本坐标系5中家庭住址的纬度(home_latitude):十进制浮点数
日本坐标系中家庭住址的经度(home_longitude):十进制浮点数

在这里插入图片描述

工厂产品记录

该数据集汇集了工厂产品的相关信息和生产结果,由一个生产记录表构成。该数据集主要在数据填充类例题中使用。

生产记录表(production_tb)
产品类型(type):字符串
产品长度(length):十进制浮点数
产品厚度(thickness):十进制浮点数
是否为残次品(fault_flg):布尔值

在这里插入图片描述

月度指标记录

该数据集汇集了零售店的月销售额等指标,由零售店月度指标记录表构成。该数据集主要在时序数据的例题中使用。

零售店月度指标记录表(monthly_index_tb)
目标年月(year_month):字符串
月销售额(sales_amount):整数
月顾客数(customer_number):整数

在这里插入图片描述

文本数据集

该数据集汇集了超过著作权保护期的文学作品中的文章,主要在字符串预处理相关的例题中使用。虽然内容跟商业文章不同,但二者的预处理内容没有太大差别。

每篇文章保存在不同的文本文件中,这些文本文件以文章的作品名称命名,保存在txt文件夹下。

读取数据

主要介绍如何使用各编程语言读取数据。关于例题中处理的记录数据,如果用SQL,需要从数据库中读取;如果用R或Python,则需要从csv文件中读取。

使用SQL读取数据

要想使用SQL处理数据,就得先创建一个空表,用于存储记录数据。在创建空表时,需要定义数据类型和分配键(详见2-2节)。用于定义表的SQL语句称为DDL(Data Definition Language,数据库模式定义语言)。预订记录表的DDL如下所示。如果你想了解有关DDL的更多信息,请查阅AWS(Amazon Web Services,亚马逊云服务)的官方文档。

ddl_reserve.sql(节选)

-- 将生成的表名称指定为work.reserve_tb
CREATE TABLE work.reserve_tb
(
  -- 创建reserve_id列(数据类型为文本,添加非空约束)
  reserve_id TEXT NOT NULL,

  -- 创建hotel_id列(数据类型为文本,添加非空约束)
  hotel_id TEXT NOT NULL,

  -- 创建customer_id列(数据类型为文本,添加非空约束)
  customer_id TEXT NOT NULL,

  -- 创建reserve_datetime列(数据类型为timestamp时间戳)
  -- 添加非空约束
  reserve_datetime TIMESTAMP NOT NULL,

  -- 创建checkin_date列(时间类型为日期,添加非空约束)
  checkin_date DATE NOT NULL,

  -- 创建checkin_time列(数据类型为文本,添加非空约束)
  checkin_time TEXT NOT NULL,

  -- 创建checkout_date列(时间类型为日期,添加非空约束)
  checkout_date DATE NOT NULL,

  -- 创建people_num列(数据类型为整数型,添加非空约束)
  people_num INTEGER NOT NULL,

  -- 创建total_price列(数据类型为整数型,添加非空约束)
  total_price INTEGER NOT NULL,

  -- 将reserve_id列设置为主键(表中唯一标识记录的列)
  PRIMARY KEY(reserve_id),

  -- 将hotel_id列设置为外键(表示与其他表内容相同的列)
  -- 外键引用的对象是hotel主表中的hotel_id
  -- 外键引用对象所在的表中必须先创建该键
  -- 外键引用对象必须是表的主键
  FOREIGN KEY(hotel_id) REFERENCES work.hotel_tb(hotel_id),

  -- 将customer_id列设置为外键(表示与其他表内容相同的列)
  -- 外键引用的对象是顾客主表中的customer_id
  FOREIGN KEY(customer_id) REFERENCES work.customer_tb(customer_id)
)
-- 将数据的分配方法设置为KEY
DISTSTYLE KEY

-- 将checkin_date设置为分配列6
DISTKEY (checkin_date);

DISTKEY(分配键)和SORTKEY(排序键)是Redshift中两种比较常见的优化表设计方式。

Redshift中不存在时间(TIME)类型,所以checkin_time列只能定义为字符串类型或者日期固定的时间戳(TIMESTAMP)类型。

在创建DDL后,要将数据加载到表中。在加载数据之前,需要将数据文件提前上传到AWS的S3(云存储服务)中,然后使用COPY命令将数据加载到Redshift里。这样一来,数据就会被加载到表中。用于复制预订记录表的COPY命令如下所示。未介绍将文件上传至AWS云存储服务S3中的方法,不懂的读者请参考AWS的官方文档。

ddl_reserve.sql(节选)

-- 设置要加载的数据表为work.reserve_tb
COPY work.reserve_tb

-- 将要加载的csv文件数据源设置为S3云服务器上的reserve.csv
FROM 's3://awesomebk/reserve.csv'

-- 设置用于访问S3时的AWS认证信息
CREDENTIALS 'aws_access_key_id=XXXXX;aws_secret_access_key=XXXXX'

-- 设置要使用的地区(云服务的地区)
REGION AS 'us-east-1'

-- 由于CSV文件的第1行是列名,所以此处设置为不加载第1行
CSV IGNOREHEADER AS 1

-- 设置DATE类型的格式
DATEFORMAT 'YYYY-MM-DD'

-- 设置TIMESTAMP类型的格式
TIMEFORMAT 'YYYY-MM-DD HH:MI:SS';

将数据加载到表中后,就能用SQL轻松地从表中提取数据了。获取预订记录表的SQL语句如下所示。例题中,我们假设所有数据都已经在数据库中以表格的形式准备好了。

-- 通过SELECT语句选取数据
-- 使用*可以选择所有列
-- 通过FROM设置从表work.reserve_tb中获取数据
SELECT * FROM work.reserve_tb
使用R读取数据

在R中,可以将csv文件直接作为data.frame读取。R中的data.frame跟SQL中的表一样,是一种能够以行或列为单位处理数据的数据格式。

在R中称为data.frame,在Python中称为DataFrame。

data_loader.R(节选)

# 使用 read.csv函数将reserve.csv文件作为data.frame读取
# 通过fileEncoding设置读取文件的字符编码
# 将header设置为TRUE,从而将csv文件的第1行作为列名读取
# 将stringsAsFactors设置为FALSE,表示不将字符串类型转换为分类型数据(详见第9章)

reserve_tb <- read.csv('data/reserve.csv', fileEncoding='UTF-8',
header=TRUE, stringsAsFactors=FALSE)
使用Python读取数据

在Python中,可以使用Pandas库直接将csv文件作为DataFrame读取。Pandas库中的DataFrame和R的data.frame一样,都是能够以行或列为单位处理的数据格式。

data_loader.py(节选)

# 使用Pandas库的read_csv函数将customer.csv文件作为DataFrame读取
# 通过encoding设置读取文件的字符编码
reserve_tb = pd.read_csv('data/reserve.csv', encoding='UTF-8')
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值