提交 a4355b8f 编写于 作者: J jackfrued

更新了数据分析相关章节内容

上级 d1f0857d
......@@ -74,17 +74,17 @@ insert into tb_college (collname, collintro) values
-- 插入学生数据
insert into tb_student (stuid, stuname, stusex, stubirth, stuaddr, collid)
values
(1001, '杨逍', 1, '1990-3-4', '四川成都', 1),
(1002, '任我行', 1, '1992-2-2', '湖南长沙', 1),
(1033, '王语嫣', 0, '1989-12-3', '四川成都', 1),
(1572, '岳不群', 1, '1993-7-19', '陕西咸阳', 1),
(1378, '纪嫣然', 0, '1995-8-12', '四川绵阳', 1),
(1954, '林平之', 1, '1994-9-20', '福建莆田', 1),
(2035, '东方不败', 1, '1988-6-30', null, 2),
(3011, '林震南', 1, '1985-12-12', '福建莆田', 3),
(3755, '项少龙', 1, '1993-1-25', null, 3),
(3923, '杨不悔', 0, '1985-4-17', '四川成都', 3),
(4040, '炼腰的隔壁老王', 1, '1989-1-1', '四川成都', 2);
(1001, '杨逍', 1, '1990-3-4', '四川成都', 1),
(1002, '任我行', 1, '1992-2-2', '湖南长沙', 1),
(1033, '王语嫣', 0, '1989-12-3', '四川成都', 1),
(1572, '岳不群', 1, '1993-7-19', '陕西咸阳', 1),
(1378, '纪嫣然', 0, '1995-8-12', '四川绵阳', 1),
(1954, '林平之', 1, '1994-9-20', '福建莆田', 1),
(2035, '东方不败', 1, '1988-6-30', null, 2),
(3011, '林震南', 1, '1985-12-12', '福建莆田', 3),
(3755, '项少龙', 1, '1993-1-25', null, 3),
(3923, '杨不悔', 0, '1985-4-17', '四川成都', 3),
(4040, '炼腰的隔壁老王', 1, '1989-1-1', '四川成都', 2);
-- 删除学生数据
delete from tb_student where stuid=4040;
......@@ -210,17 +210,17 @@ select stuid as 学号, avg(scmark) as 平均分 from tb_score group by stuid ha
-- 查询年龄最大的学生的姓名(子查询/嵌套的查询)
select stuname from tb_student where stubirth=(
select min(stubirth) from tb_student
select min(stubirth) from tb_student
);
-- 查询年龄最大的学生姓名和年龄(子查询+运算)
select stuname as 姓名, year(now())-year(stubirth) as 年龄 from tb_student where stubirth=(
select min(stubirth) from tb_student
select min(stubirth) from tb_student
);
-- 查询选了两门以上的课程的学生姓名(子查询/分组条件/集合运算)
select stuname from tb_student where stuid in (
select stuid from tb_score group by stuid having count(stuid)>2
select stuid from tb_score group by stuid having count(stuid)>2
)
-- 查询学生姓名、课程名称以及成绩(连接查询)
......
-- 交易表
CREATE TABLE `transaction` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`order_sn` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '交易单号',
`member_id` bigint(20) NOT NULL COMMENT '交易的用户ID',
`amount` decimal(8,2) NOT NULL COMMENT '交易金额',
`integral` int(11) NOT NULL DEFAULT '0' COMMENT '使用的积分',
`pay_state` tinyint(4) NOT NULL COMMENT '支付类型 0:余额 1:微信 2:支付宝 3:xxx',
`source` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '支付来源 wx app web wap',
`status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '支付状态 -1:取消 0 未完成 1已完成 -2:异常',
`completion_time` int(11) NOT NULL COMMENT '交易完成时间',
`note` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `transaction_order_sn_member_id_pay_state_source_status_index` (`order_sn`(191),`member_id`,`pay_state`,`source`(191),`status`)
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 交易记录表
CREATE TABLE `transaction_record` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`order_sn` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`events` text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '事件详情',
`result` text COLLATE utf8mb4_unicode_ci COMMENT '结果详情',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 订单表
CREATE TABLE `order` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`order_no` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '订单编号',
`order_sn` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '交易号',
`member_id` int(11) NOT NULL COMMENT '客户编号',
`supplier_id` int(11) NOT NULL COMMENT '商户编码',
`supplier_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商户名称',
`order_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '订单状态 0未付款,1已付款,2已发货,3已签收,-1退货申请,-2退货中,-3已退货,-4取消交易',
`after_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '用户售后状态 0 未发起售后 1 申请售后 -1 售后已取消 2 处理中 200 处理完毕',
`product_count` int(11) NOT NULL DEFAULT '0' COMMENT '商品数量',
`product_amount_total` decimal(12,4) NOT NULL COMMENT '商品总价',
`order_amount_total` decimal(12,4) NOT NULL DEFAULT '0.0000' COMMENT '实际付款金额',
`logistics_fee` decimal(12,4) NOT NULL COMMENT '运费金额',
`address_id` int(11) NOT NULL COMMENT '收货地址编码',
`pay_channel` tinyint(4) NOT NULL DEFAULT '0' COMMENT '支付渠道 0余额 1微信 2支付宝',
`out_trade_no` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '订单支付单号',
`escrow_trade_no` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '第三方支付流水号',
`pay_time` int(11) NOT NULL DEFAULT '0' COMMENT '付款时间',
`delivery_time` int(11) NOT NULL DEFAULT '0' COMMENT '发货时间',
`order_settlement_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '订单结算状态 0未结算 1已结算',
`order_settlement_time` int(11) NOT NULL DEFAULT '0' COMMENT '订单结算时间',
`is_package` enum('0','1') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '是否是套餐',
`is_integral` enum('0','1') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '是否是积分产品',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`deleted_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `order_order_sn_unique` (`order_sn`),
KEY `order_order_sn_member_id_order_status_out_trade_no_index` (`order_sn`,`member_id`,`order_status`,`out_trade_no`(191))
) ENGINE=InnoDB AUTO_INCREMENT=44 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 售后申请表
CREATE TABLE `order_returns_apply` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`order_no` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '订单单号',
`order_detail_id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '子订单编码',
`return_no` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '售后单号',
`member_id` int(11) NOT NULL COMMENT '用户编码',
`state` tinyint(4) NOT NULL COMMENT '类型 0 仅退款 1退货退款',
`product_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '货物状态 0:已收到货 1:未收到货',
`why` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '退换货原因',
`status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '审核状态 -1 拒绝 0 未审核 1审核通过',
`audit_time` int(11) NOT NULL DEFAULT '0' COMMENT '审核时间',
`audit_why` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '审核原因',
`note` text COLLATE utf8mb4_unicode_ci COMMENT '备注',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 售后记录表
CREATE TABLE `order_returns` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`returns_no` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '退货编号 供客户查询',
`order_id` int(11) NOT NULL COMMENT '订单编号',
`express_no` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '物流单号',
`consignee_realname` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '收货人姓名',
`consignee_telphone` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '联系电话',
`consignee_telphone2` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '备用联系电话',
`consignee_address` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '收货地址',
`consignee_zip` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮政编码',
`logistics_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '物流方式',
`logistics_fee` decimal(12,2) NOT NULL COMMENT '物流发货运费',
`order_logistics_status` int(11) DEFAULT NULL COMMENT '物流状态',
`logistics_settlement_status` int(11) DEFAULT NULL COMMENT '物流结算状态',
`logistics_result_last` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '物流最后状态描述',
`logistics_result` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '物流描述',
`logistics_create_time` int(11) DEFAULT NULL COMMENT '发货时间',
`logistics_update_time` int(11) DEFAULT NULL COMMENT '物流更新时间',
`logistics_settlement_time` int(11) DEFAULT NULL COMMENT '物流结算时间',
`returns_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0全部退单 1部分退单',
`handling_way` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'PUPAWAY:退货入库;REDELIVERY:重新发货;RECLAIM-REDELIVERY:不要求归还并重新发货; REFUND:退款; COMPENSATION:不退货并赔偿',
`returns_amount` decimal(8,2) NOT NULL COMMENT '退款金额',
`return_submit_time` int(11) NOT NULL COMMENT '退货申请时间',
`handling_time` int(11) NOT NULL COMMENT '退货处理时间',
`remark` text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '退货原因',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 评价表
CREATE TABLE `order_appraise` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`order_id` int(11) NOT NULL COMMENT '订单编码',
`info` text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '评论内容',
`level` enum('-1','0','1') COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '级别 -1差评 0中评 1好评',
`desc_star` tinyint(4) NOT NULL COMMENT '描述相符 1-5',
`logistics_star` tinyint(4) NOT NULL COMMENT '物流服务 1-5',
`attitude_star` tinyint(4) NOT NULL COMMENT '服务态度 1-5',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `order_appraise_order_id_index` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
\ No newline at end of file
此差异已折叠。
## NumPy的应用
Numpy是一个开源的Python科学计算库,**用于快速处理任意维度的数组**。Numpy**支持常见的数组和矩阵操作**,对于同样的数值计算任务,使用NumPy比直接使用Python不仅代码要简洁的多,而且NumPy在性能上远远优于原生Python,基本是1到2个数量级的差距,数据量越大,NumPy的优势就越明显。
Numpy最为核心的数据类型是`ndarray`,使用`ndarray`可以处理一维、二维和多维数组,该对象相当于是一个快速而灵活的大数据容器。NumPy底层代码使用C语言编写,解决了GIL的限制,`ndarray`在存储数据的时候,数据与数据的地址都是连续的,这样就给使得批量操作数组元素时速度很快,远远优于Python中的`list`;另一方面`ndarray`对象提供了更多的方法来处理数据,尤其是和统计相关的方法,这些方法也是原生的`list`没有的。
### 创建数组对象
1. 一维数组
2. 二维数组
3. 多维数组
### 数组对象基本属性
### 数组对象常用方法
### 数组的运算
1. 标量运算
2. 矢量运算
### 数组的其他操作
### 矩阵运算
## Pandas的应用
Pandas是Wes McKinney在2008年开发的一个强大的**分析结构化数据**的工具集。Pandas以NumPy为基础(数据表示和运算),提供了用于数据处理的函数和方法,对数据分析和数据挖掘提供了很好的支持;同时Pandas还可以跟数据可视化工具Matplotlib很好的整合在一起,非常轻松愉快的实现数据的可视化展示。
Pandas核心的数据类型是`Series``DataFrame`,分别用于处理一维和二维的数据,除此之外还有一个名为`Index`的类型及其子类型,它为`Series``DataFrame`提供了索引功能。日常工作中以`DataFrame`使用最为广泛,因为二维的数据本质就是一个有行有列的表格(想一想Excel电子表格和关系型数据库中的二维表)。上述这些类型都提供了大量的处理数据的方法,数据分析师可以以此为基础实现对数据的各种常规处理。
### Series的应用
#### 创建Series对象
####基本属性和方法
#### Index的使用
### DataFrame的应用
#### 创建DataFrame对象
#### 基本属性和方法
#### 索引和切片
#### 相关运算
#### 缺失值处理
#### 数据离散化
#### 数据的合并
#### 交叉表和透视表
1. 交叉表:根据一个数据系列计算另一个数据系列的统计结果得到的`DataFrame`对象。
2. 透视表:将`DataFrame`的列分别作为行索引和列索引,然后对指定的列应用聚合函数得到的结果。
#### 分组和聚合
#### 绘制图表
## 数据可视化
数据的处理、分析和可视化已经成为Python近年来最为重要的应用领域之一,其中数据的可视化指的是将数据呈现为漂亮的统计图表,然后进一步发现数据中包含的规律以及隐藏的信息。数据可视化又跟数据挖掘和大数据分析紧密相关,而这些领域以及当下被热议的“深度学习”其最终的目标都是为了实现从过去的数据去对未来的状况进行预测。Python在实现数据可视化方面是非常棒的,即便是使用个人电脑也能够实现对百万级甚至更大体量的数据进行探索的工作,而这些工作都可以在现有的第三方库的基础上来完成(无需“重复的发明轮子”)。[Matplotlib](https://matplotlib.org/)就是Python绘图库中的佼佼者,它包含了大量的工具,你可以使用这些工具创建各种图形(包括散点图、折线图、直方图、饼图、雷达图等),Python科学计算社区也经常使用它来完成数据可视化的工作
数据可视化简单的说就是将数据呈现为漂亮的统计图表,然后进一步发现数据中包含的规律以及隐藏的信息。之前的课程,我们已经为大家展示了Python在数据处理方面的优势,为大家介绍了NumPy和Pandas的应用,以此为基础,我们可以进一步使用[Matplotlib](https://matplotlib.org/)[Seaborn](https://seaborn.pydata.org/)来实现数据的可视化,将数据处理的结果展示为直观的可视化图表
### 安装matplotlib
### Matplotlib的应用
可以使用pip来安装matplotlib,命令如下所示。
#### 安装和导入
对于使用Anaconda的用户,在安装Anaconda时已经携带了数据分析和可视化的库,无需再单独安装Matplotlib。如果没有安装Anaconda但是有Python环境,可以使用Python的包管理工具pip来安装,命令如下所示。
```Shell
pip install matplotlib
```
### 绘制折线图
```Python
# coding: utf-8
import matplotlib.pyplot as plt
def main():
# 保存x轴数据的列表
x_values = [x for x in range(1, 11)]
# 保存y轴数据的列表
y_values = [x ** 2 for x in range(1, 11)]
# 设置图表的标题以及x和y轴的说明
plt.title('Square Numbers')
plt.xlabel('Value', fontsize=18)
plt.ylabel('Square', fontsize=18)
# 设置刻度标记的文字大小
plt.tick_params(axis='both', labelsize=16)
# 绘制折线图
plt.plot(x_values, y_values)
plt.show()
if __name__ == '__main__':
main()
```
运行程序,效果如下图所示。
![](./res/result1.png)
如果使用jupyter的notebook,需要使用魔法指令`%matplotlib inresline`来设置在页面中显示图表,效果如下所示。
![](./res/result-in-jupyter.png)
### 绘制散点图
可以将上面代码中的的`plot`函数换成`scatter`函数来绘制散点图,效果如下图所示。
![](./res/result2.png)
当然,也可以直接通过`plot`函数设置绘图的颜色和线条的形状将折线图改造为散点图,对应的代码如下所示,其中参数'xr'表示每个点的记号是‘x’图形,颜色是红色(<u>r</u>ed)。
接下来,我们在Jupyter Notebook中用下面的方式导入Matplotlib。
```Python
plt.plot(x_values, y_values, 'xr')
from matplotlib import pyplot as plt
```
重新运行程序,效果如下图所示。
![](./res/result3.png)
可能大家已经注意到了,1和10对应的‘x’记号在图形边角的位置不太明显,要解决这个问题可以通过添加下面的代码调整x轴和y轴的坐标范围。
通过下面的魔法指令,可以让创建的图表直接内嵌在浏览器窗口中显示。
```Python
plt.axis([0, 12, 0, 120])
%matplotlib inline
```
调整后的效果如下图所示。
#### 绘图的流程
![](./res/result4.png)
1. 创建画布
2. 绘制图像
3. 显示(保存)图像
### 绘制正弦曲线
在下面的程序中,我们使用了名为[NumPy](http://www.numpy.org/)的第三方库来产生样本并计算正弦值。NumPy是一个运行速度非常快的数学库,主要用于数组计算。它可以让你在Python中使用向量和数学矩阵,以及许多用C语言实现的底层函数。如果想通过Python学习数据科学或者机器学习相关的内容,那么就得先学会使用NumPy。
#### 绘制的例子
```Python
# coding: utf-8
import matplotlib.pyplot as plt
import numpy as np
def main():
# 指定采样的范围以及样本的数量
x_values = np.linspace(0, 2 * np.pi, 1000)
# 计算每个样本对应的正弦值
y_values = np.sin(x_values)
# 绘制折线图(线条形状为--, 颜色为蓝色)
plt.plot(x_values, y_values, '--b')
plt.show()
if __name__ == '__main__':
main()
```
运行程序,效果如下图所示。
![](./res/result5.png)
如果要在一个坐标系上绘制多个图像,可以按照如下的方式修改代码。
```Python
# coding: utf-8
import matplotlib.pyplot as plt
import numpy as np
def main():
x_values = np.linspace(0, 2 * np.pi, 1000)
plt.plot(x_values, np.sin(x_values), '--b')
plt.plot(x_values, np.sin(2 * x_values), '--r')
plt.show()
if __name__ == '__main__':
main()
```
修改后的代码运行效果如下图所示。
![](./res/result6.png)
#### 解决中文显示问题
如果需要分别在两个坐标系上绘制出两条曲线,可以按照如下的方式操作。
```Python
# coding: utf-8
import matplotlib.pyplot as plt
import numpy as np
#### 定制图表效果
def main():
# 将样本数量减少为50个
x_values = np.linspace(0, 2 * np.pi, 50)
# 设置绘图为2行1列活跃区为1区(第一个图)
plt.subplot(2, 1, 1)
plt.plot(x_values, np.sin(x_values), 'o-b')
# 设置绘图为2行1列活跃区为2区(第二个图)
plt.subplot(2, 1, 2)
plt.plot(x_values, np.sin(2 * x_values), '.-r')
plt.show()
if __name__ == '__main__':
main()
#### 图形的种类和意义
```
1. 绘制散点图
2. 绘制柱状图
3. 绘制直方图
4. 绘制饼图
效果如下图所示。
![](./res/result7.png)
### 绘制直方图
#### 显示多个坐标系
我们可以通过NumPy的random模块的normal函数来生成[正态分布](https://zh.wikipedia.org/wiki/%E6%AD%A3%E6%80%81%E5%88%86%E5%B8%83)的采样数据,其中的三个参数分别表示期望、标准差和样本数量,然后绘制成直方图,代码如下所示。
```Python
# coding: utf-8
import matplotlib.pyplot as plt
import numpy as np
def main():
# 通过random模块的normal函数产生1000个正态分布的样本
data = np.random.normal(10.0, 5.0, 1000)
# 绘制直方图(直方的数量为10个)
plt.hist(data, 10)
plt.show()
if __name__ == '__main__':
main()
```
运行效果如下图所示。
### Seaborn的应用
![](./res/result8.png)
......@@ -39,6 +39,7 @@ Docker属于对Linux容器技术(LXC)的一种封装(利用了Linux的name
3. 移除可能存在的旧的Docker版本。
```Bash
yum list installed | grep docker
yum erase -y docker docker-common docker-engine
```
......@@ -473,7 +474,7 @@ myapp
其中api是Flask项目的文件夹,其中包括了项目代码、依赖项以及启动脚本等文件,具体内容如下所示:
app.py文件:
`app.py`文件:
```Python
from flask import Flask
......@@ -495,7 +496,7 @@ class Product(Resource):
api.add_resource(Product, '/api/products')
```
requirements.txt文件:
`requirements.txt`文件:
```INI
flask
......@@ -504,7 +505,7 @@ flask-cors
gunicorn
```
start.sh文件:
`start.sh`文件:
```Shell
#!/bin/bash
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册