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

pull/720/head
jackfrued 2020-12-14 00:23:35 +08:00
parent d1f0857d8d
commit a4355b8f95
50 changed files with 540 additions and 166 deletions

View File

@ -74,17 +74,17 @@ insert into tb_college (collname, collintro) values
-- 插入学生数据 -- 插入学生数据
insert into tb_student (stuid, stuname, stusex, stubirth, stuaddr, collid) insert into tb_student (stuid, stuname, stusex, stubirth, stuaddr, collid)
values values
(1001, '杨逍', 1, '1990-3-4', '四川成都', 1), (1001, '杨逍', 1, '1990-3-4', '四川成都', 1),
(1002, '任我行', 1, '1992-2-2', '湖南长沙', 1), (1002, '任我行', 1, '1992-2-2', '湖南长沙', 1),
(1033, '王语嫣', 0, '1989-12-3', '四川成都', 1), (1033, '王语嫣', 0, '1989-12-3', '四川成都', 1),
(1572, '岳不群', 1, '1993-7-19', '陕西咸阳', 1), (1572, '岳不群', 1, '1993-7-19', '陕西咸阳', 1),
(1378, '纪嫣然', 0, '1995-8-12', '四川绵阳', 1), (1378, '纪嫣然', 0, '1995-8-12', '四川绵阳', 1),
(1954, '林平之', 1, '1994-9-20', '福建莆田', 1), (1954, '林平之', 1, '1994-9-20', '福建莆田', 1),
(2035, '东方不败', 1, '1988-6-30', null, 2), (2035, '东方不败', 1, '1988-6-30', null, 2),
(3011, '林震南', 1, '1985-12-12', '福建莆田', 3), (3011, '林震南', 1, '1985-12-12', '福建莆田', 3),
(3755, '项少龙', 1, '1993-1-25', null, 3), (3755, '项少龙', 1, '1993-1-25', null, 3),
(3923, '杨不悔', 0, '1985-4-17', '四川成都', 3), (3923, '杨不悔', 0, '1985-4-17', '四川成都', 3),
(4040, '炼腰的隔壁老王', 1, '1989-1-1', '四川成都', 2); (4040, '炼腰的隔壁老王', 1, '1989-1-1', '四川成都', 2);
-- 删除学生数据 -- 删除学生数据
delete from tb_student where stuid=4040; 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 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 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 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
) )
-- 查询学生姓名、课程名称以及成绩(连接查询) -- 查询学生姓名、课程名称以及成绩(连接查询)

View File

@ -0,0 +1,124 @@
-- 交易表
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;

View File

@ -1,2 +1,281 @@
## 数据分析概述 ## 数据分析概述
当今世界对信息技术的依赖程度在不断加深,每天都会有大量的数据产生,我们经常会感到数据越来越多,但是要从中发现有价值的信息却越来越难。这里所说的信息,可以理解为对数据集处理之后的结果,是从数据集中提炼出的可用于其他场合的结论性的东西,而**从原始数据中抽取出有价值的信息**的这个过程我们就称之为**数据分析**,它是数据科学工作的一部分。
### 数据分析师的职责和技能栈
我们通常将从事数据分析、数据科学和数据相关产品的岗位都统称为数据分析岗位,但是根据工作性质的不同,又可以分为**数据分析方向**、**数据挖掘方向**、**数据产品方向**和**数据工程方向**。我们通常所说的数据分析师主要是指**业务数据分析师**,很多数据分析师的职业生涯都是从这个岗位开始的,而且这个岗位也是招聘数量最大的岗位。业务数据分析师在公司通常不属于研发部门而**属于运营部门**,所以这个岗位也称为**数据运营**或**商业分析**,通常招聘信息对这个岗位的描述是:
1. 负责各部门相关的报表。
2. 建立和优化指标体系。
3. 监控数据波动和异常,找出问题。
4. 优化和驱动业务,推动数字化运营。
5. 找出潜在的市场和产品的上升空间。
根据上面的描述,作为业务数据分析师,我们的工作不是给领导一个简单浅显的结论,而是结合公司的业务,完成**揪出异常**、**找到原因**、**探索趋势**的工作。所以作为数据分析师不管是用Python语言、Excel、SPSS或其他的商业智能工具工具只是达成目标的手段**数据思维是核心技能**,而从实际业务问题出发到最终发现数据中的商业价值是终极目标。数据分析师在很多公司只是一个基础岗位,精于业务的数据分析师可以向**数据分析经理**或**数据运营总监**等管理岗位发展;对于熟悉机器学习算法的数据分析师来说,可以向**数据挖掘工程师**或**算法专家**方向发展而这些岗位除了需要相应的数学和统计学知识在编程能力方面也比数据分析师有更高的要求可能还需要有大数据存储和处理的相关经验作为数据产品经理除了传统产品经理的技能栈之外也需要较强的技术能力例如要了解常用的推荐算法、机器学习模型能够为算法的改进提供依据能够制定相关埋点的规范和口径虽然不需要精通各种算法但是要站在产品的角度去考虑数据模型、指标、算法等的落地数据工程师是一个偏技术的岗位基本上的成长道路都是从SQL开始逐步向Hadoop生态圈迁移然后每天跟Flume和Kafka亲密接触的一个过程。
以下是我总结的数据分析师的技能栈,仅供参考。
1. 计算机科学(数据分析工具、编程语言、数据库、……)
2. 数学和统计学(数据思维、统计思维)
3. 人工智能(机器学习算法)
4. 业务理解能力(沟通、表达、经验)
5. 总结和表述能力商业PPT、文字总结
### 数据分析的流程
一个完整的数据分析流程应该包含以下几个方面,当然因为行业和工作内容的不同会略有差异。
1. 确定目标(输入):理解业务,确定要解决的问题
2. 收集数据(数据库、电子表格、三方接口、网络爬虫、开放数据集、……)
3. 数据清洗(数据清洗、数据变换、特征工程、……)
4. 探索数据(分组、聚合、拼接、运算、可视化、……)
5. 模型迭代(选择模型、应用算法、模型调优、……)
6. 模型部署输出模型落地改进业务A/B测试报告撰写
### 数据分析相关库
使用Python从事数据科学相关的工作是一个非常棒的选择因为Python整个生态圈中有大量的成熟的用于数据科学的软件包工具库。而且不同于其他的用于数据科学的编程语言Julia、RPython除了可以用于数据科学能做的事情还很多可以说Python语言几乎是无所不能的。
#### 三大神器
1. [NumPy](https://numpy.org/):支持常见的数组和矩阵操作,通过`ndarray`类实现了对多维数组的封装提供了操作这些数组的方法和函数集。由于NumPy内置了并行运算功能当使用多核CPU时Numpy会自动做并行计算。
2. [Pandas](https://pandas.pydata.org/)pandas的核心是其特有的数据结构`DataFrame`和`Series`这使得pandas可以处理包含不同类型的数据的负责表格和时间序列这一点是NumPy的`ndarray`做不到的。使用pandas可以轻松顺利的加载各种形式的数据然后对数据进行切片、切块、处理缺失值、聚合、重塑和可视化等操作。
3. [Matplotlib](https://matplotlib.org/)matplotlib是一个包含各种绘图模块的库能够根据我们提供的数据创建高质量的图形。此外matplotlib还提供了pylab模块这个模块包含了很多像[MATLAB](https://www.mathworks.com/products/matlab.html)一样的绘图组件。
#### 其他相关库
1. [SciPy](https://scipy.org/)完善了NumPy的功能封装了大量科学计算的算法包括线性代数、稀疏矩阵、信号和图像处理、最优化问题、快速傅里叶变换等。
2. [Seaborn](https://seaborn.pydata.org/)Seaborn是基于matplotlib的图形可视化工具直接使用matplotlib虽然可以定制出漂亮的统计图表但是总体来说还不够简单方便Seaborn相当于是对matplotlib做了封装让用户能够以更简洁有效的方式做出各种有吸引力的统计图表。
3. [Scikit-learn](https://scikit-learn.org/)Scikit-learn最初是SciPy的一部分它是Python数据科学运算的核心提供了大量机器学习可能用到的工具包括数据预处理、监督学习分类、回归、无监督学习聚类、模式选择、交叉检验等。
4. [Statsmodels](https://www.statsmodels.org/stable/index.html):包含了经典统计学和经济计量学算法的库。
### 安装和使用Anaconda
如果希望快速开始使用Python处理数据科学相关的工作建议大家直接安装Anaconda它是工具包最为齐全的Python科学计算发行版本。对于新手来说先安装官方的Python解释器再逐个安装工作中会使用到的库文件会比较麻烦尤其是在Windows环境下经常会因为构建工具或DLL文件的缺失导致安装失败而一般新手也很难根据错误提示信息采取正确的解决措施容易产生严重的挫败感。
对于个人用户来说可以从Anaconda的[官方网站](https://www.anaconda.com/)下载它的“个人版Individual Edition”安装程序安装完成后你的计算机上不仅拥有了Python环境和Spyder类似于PyCharm的集成开发工具还拥有了与数据科学工作相关的近200个工具包包括我们上面提到的那些库。除此之外Anaconda还提供了一个名为conda的包管理工具通过这个工具不仅可以管理Python的工具包还可以用于创建运行Python程序的虚拟环境。
可以通过Anaconda官网提供的下载链接选择适合自己操作系统的安装程序建议大家选择图形化的安装程序下载完成后双击安装程序开始安装如下所示。
![](res/download-anaconda.png)
![](res/install-anaconda.png)
完成安装后macOS用户可以在“应用程序”或“Launchpad”中找到名为“Anaconda-Navigator”的应用程序运行该程序可以看到如下所示的界面我们可以在这里选择需要执行的操作。
![](res/run-anaconda-navigator.png)
对于Windows用户建议按照安装向导的提示和推荐的选项来安装Anaconda。在完成安装之后通过Windows的“开始菜单”找到Anaconda并选择要执行的功能。我们可以选择启动名为“Jupyter Notebook”的工具以下都简称为Notebook来开始数据科学的探索之旅我们也可以运行名为“Spyder”的工具来编写Python代码。
### 使用Notebook
#### 安装和启动Notebook
如果已经安装了Anaconda可以按照上面所说的方式直接启动Notebook。对于安装了Python环境但是没有安装Anaconda的用户可以用Python的包管理工具pip来安装`jupyter`然后在终端Windows系统称之为命令行提示符中运行`jupyter notebook`命令来启动Notebook如下所示。
安装:
```Bash
pip install jupyter
```
运行:
```Bash
jupyter notebook
```
Notebook是基于网页的用于交互计算的应用程序可以用于代码开发、文档撰写、代码运行和结果展示。简单的说你可以在网页中直接**编写代码**和**运行代码**代码的运行结果也会直接在代码块下方进行展示。如在编写代码的过程中需要编写说明文档可在同一个页面中使用Markdonw格式进行编写而且可以直接看到渲染后的效果。此外Notebook的设计初衷是提供一个能够支持多种编程语言的工作环境目前它能够支持超过40种编程语言包括Python、R、Julia、Scala等。
首先我们可以创建一个用于书写Python代码的Notebook如下图所示。
![](res/jupyter-create-notebook.png)
接下来,我们就可以编写代码、撰写文档和运行程序啦,如下图所示。
![](res/use-jupyter-notebook.png)
#### Notebook使用技巧
如果使用Python做工程化的项目开发PyCharm肯定是最好的选择它提供了一个集成开发环境应该具有的所有功能尤其是智能提示、代码补全、自动纠错这类功能会让开发人员感到非常舒服。如果使用Python做数据科学相关的工作Notebook并不比PyCharm逊色在数据和图表展示方面Notebook更加优秀。这个工具的使用非常简单大家可以看看Notebook菜单栏相信理解起来不会有太多困难在知乎上有一篇名为[《最详尽使用指南超快上手Jupyter Notebook》](https://zhuanlan.zhihu.com/p/32320214)的文章也可以帮助大家快速认识Notebook。
下面我为大家介绍一些Notebook的使用技巧希望能够帮助大家提升工作效率。
1. 自动补全。在使用Notebook编写代码时按`Tab`键会获得代码提示。
2. 获得帮助。在使用Notebook时如果希望了解一个对象如变量、类、函数等的相关信息或使用方式可以在对象后面使用`?`并运行代码, 窗口下方会显示出对应的信息,帮助我们了解该对象,如下所示。
![](res/notebook-get-help.png)
3. 搜索命名。如果只记得一个类或一个函数名字的一部分,可以使用通配符`*`并配合`?`进行搜索,如下所示。
![](res/notebook-search-namespace.png)
4. 调用命令。可以在Notebook中使用`!`后面跟系统命令的方式来执行系统命令。
5. 魔法指令。Notebook中有很多非常有趣且有用的魔法指令例如可以使用`%timeit`测试语句的执行时间,可以使用`%pwd`查看当前工作目录等。如果想查看所有的魔法指令,可以使用`%lsmagic`,如果了解魔法指令的用法,可以使用`%magic`来查看,如下图所示。
![](res/notebook-magic-command.png)
常用的魔法指令有:
| 魔法指令 | 功能说明 |
| ------------------------------------------- | ------------------------------------------ |
| `%pwd` | 查看当前工作目录 |
| `%ls` | 列出当前或指定文件夹下的内容 |
| `%cat` | 查看指定文件的内容 |
| `%hist` | 查看输入历史 |
| `%matplotlib inline` | 设置在页面中嵌入matplotlib输出的统计图表 |
| `%config Inlinebackend.figure_format='svg'` | 设置统计图表使用SVG格式矢量图 |
| `%run` | 运行指定的程序 |
| `%load` | 加载指定的文件到单元格中 |
| `%quickref` | 显示IPython的快速参考 |
| `%timeit` | 多次运行代码并统计代码执行时间 |
| `%prun` | 用`cProfile.run`运行代码并显示分析器的输出 |
| `%who` / `%whos` | 显示命名空间中的变量 |
| `%xdel` | 删除一个对象并清理所有对它的引用 |
6. 快捷键。Notebook中的很多操作可以通过快捷键来实现使用快捷键可以提升我们的工作效率。Notebook的快捷键又可以分为命令模式下的快捷键和编辑模式下的快捷键所谓编辑模式就是处于输入代码或撰写文档状态的模式在编辑模式下按`Esc`可以回到命令模式,在命令模式下按`Enter`可以进入编辑模式。
命令模式下的快捷键:
| 快捷键 | 功能说明 |
| ------------------------------- | -------------------------------------------- |
| Alt + EnterOption + Enter | 运行当前单元格并在下面插入新的单元格 |
| Shift + Enter | 运行当前单元格并选中下方的单元格 |
| Ctrl + EnterCommand + Enter | 运行当前单元格 |
| j / k、Shift + j / Shift + k | 选中下方/上方单元格、连续选中下方/上方单元格 |
| a / b | 在下方/上方插入新的单元格 |
| c / x | 复制单元格 / 剪切单元格 |
| v / Shift + v | 在下方/上方粘贴单元格 |
| dd / z | 删除单元格 / 恢复删除的单元格 |
| l / Shift + l | 显示或隐藏当前/所有单元格行号 |
| ii / 00 | 中断/重启Notebook内核 |
| Space / Shift + Space | 向下/向上滚动页面 |
编辑模式下的快捷键:
| 快捷键 | 功能说明 |
| ------------------------------------------------ | -------------------------------------- |
| Shift + Tab | 获得提示信息 |
| Ctrl + ]Command + ]/ Ctrl + [Command + [ | 增加/减少缩进 |
| Alt + EnterOption + Enter | 运行当前单元格并在下面插入新的单元格 |
| Shift + Enter | 运行当前单元格并选中下方的单元格 |
| Ctrl + EnterCommand + Enter | 运行当前单元格 |
| Ctrl + Left / RightCommand + Left / Right | 光标移到行首/行尾 |
| Ctrl + Up / DownCommand + Up / Down | 光标移动代码开头/结尾处 |
| Up / Down | 光标上移/下移一行或移到上/下一个单元格 |
> **温馨提示**:如果记不住这些快捷键也没有关系,在命令模式下按`h`键可以打开Notebook的帮助系统马上就可以看到快捷键的设置而且可以根据实际的需要重新编辑快捷键如下图所示。
>
> ![](res/notebook-shortcut.png)
### 补充知识
#### 描述型统计
1. 集中趋势
- **众数**mode数据集合中出现频次最多的数据。数据的趋势越集中众数的代表性就越好。众数不受极值的影响但是无法保证唯一性。
- **均值**mean均值代表某个数据集的整体水平它的缺点是容易受极值的影响可以使用加权平均值来消除极值的影响但是可能事先并不清楚数据的权重所以对于正数可以用几何平均值来替代算术平均值二者的计算公式如下所示。
算术平均值:
$
\bar{x}=\frac{\sum_{i=1}^{n}x_{i}}{n}=\frac{x_{1}+x_{2}+\cdots +x_{n}}{n}
$
几何平均值:
$
\left(\prod_{i=1}^{n}x_{i}\right)^{\frac{1}{n}}={\sqrt[{n}]{x_{1}x_{2} \cdots x_{n}}}
$
- **分位数**将一个随机变量的概率分布范围分为几个具有相同概率的连续区间比如最常见的中位数二分位数median就是将数据集划分为数量相等的上下两个部分。除此之外常见的分位数还有四分位数quartile、百分位数percentile等。
- 中位数:
$
{Q}_{\frac {1}{2}}(x)={\begin{cases}x'_{\frac{n+1}{2}},&n是奇数\\{\frac {1}{2}}(x'_{\frac{n}{2}}+x'_{{\frac{n}{2}}+1}),&n是偶数\end{cases}}
$
- 四分位数:
**第一四分位数**$Q_1$),又称**较小四分位数**或**下四分位数**等于该样本中所有数值由小到大排列后第25%的数字。
**第二四分位数**$Q_2$),又称**中位数**等于该样本中所有数值由小到大排列后第50%的数字。
**第三四分位数**$Q_3$),又称**较大四分位数**或**上四分位数**等于该样本中所有数值由小到大排列后第75%的数字。
**四分位距离**$IQR$Inter-Quartile Range即$Q_3-Q_1$的值。
在实际工作中,我们经常通过四分位数再配合[箱线图](https://zhuanlan.zhihu.com/p/110580568)来发现异常值。例如,小于$Q_1 - 1.5 \times IQR$的值或大于$Q3 + 1.5 \times IQR$的值可以视为普通异常值,而小于$Q_1 - 3 * IQR$的值或大于$Q3 + 3 * IQR$的值通常视为极度异常值。这种检测异常值的方法跟[“$3\sigma$法则”](https://zh.wikipedia.org/wiki/68%E2%80%9395%E2%80%9399.7%E5%8E%9F%E5%89%87)的道理是一致的,如下图所示。
![](res/quartile_and_3sigma.png)
2. 离散趋势
- **极值**就是最大值maximum、最小值minimum代表着数据集合中的上限和下限。
- **极差**range又称“全距”是一组数据中的最大观测值和最小观测值之差记作$R$。一般情况下,极差越大,离散程度越大,数据受极值的影响越严重。
- 方差variance将每个值与均值的偏差进行平方最后除以总数据量的值。简单来说就是表示数据与期望值的偏离程度。方差越大就意味着每个值与平均值的差值平方和越大、越不稳定、波动越剧烈因此代表着数据整体比较分散呈现出离散的趋势而方差越小代表着每个值与平均值的差值平方和越小、越稳定、波动越平滑因此代表着数据整体很集中。
- **标准差**standard deviation将方差进行平方根与方差一样都是表示数据与期望值的偏离程度。
- **分位差**:分位数的差值,如上面提到的四分位距离。
3. 分布
- **峰态**:峰态就是概率分布曲线的峰值高低,是尖峰、平顶峰,还是正态峰。
- **偏度**:偏度就是峰值与平均值的偏离程度,是左偏还是右偏。
#### 推理性统计
1. 概率分布
- 离散型分布:如果随机发生的事件之间是毫无联系的,每一次随机事件发生都是独立的、不连续的、不受其他事件影响的,那么这些事件的概率分布就属于离散型分布。
- 二项分布Binomial distribution$n$个独立的是/非试验中成功的次数的离散概率分布,其中每次试验的成功概率为$p$。一般地,如果随机变量$X$服从参数为$n$和$p$的二项分布,记为$X\sim B(n,p)$。$n$次试验中正好得到$k$次成功的概率由概率质量函数给出,如下所示。
$
\displaystyle f(k,n,p)=\Pr(X=k)={n \choose k}p^{k}(1-p)^{n-k}
$
对于$k= 0, 1, 2, ..., n$,其中${n \choose k}={\frac {n!}{k!(n-k)!}}$
- 泊松分布适合于描述单位时间内随机事件发生的次数的概率分布。如某一服务设施在一定时间内受到的服务请求的次数、汽车站台的候客人数、机器出现的故障数、自然灾害发生的次数、DNA序列的变异数、放射性原子核的衰变数等等。泊松分布的概率质量函数为
$
P(X=k)=\frac{e^{-\lambda}\lambda^k}{k!}
$
泊松分布的参数$\lambda$是单位时间(或单位面积)内随机事件的平均发生率。
- 连续型分布:
- 正态分布:又名**高斯分布**Gaussian distribution是一个非常常见的连续概率分布经常用自然科学和社会科学中来代表一个不明的随机变量。若随机变量$X$服从一个位置参数为$\mu$、尺度参数为$\sigma$的正态分布,记为$X \sim N(\mu,\sigma^2)$,其概率密度函数为:
$
\displaystyle f(x)={\frac {1}{\sigma {\sqrt {2\pi }}}}\;e^{-{\frac {\left(x-\mu \right)^{2}}{2\sigma ^{2}}}}
$
- 伽马分布:假设$X_1, X_2, ... X_n$为连续发生事件的等候时间,且这$n$次等候时间为独立的,那么这$n$次等候时间之和$Y$$Y=X_1+X_2+...+X_n$)服从伽玛分布,即$Y \sim \Gamma(\alpha,\beta)$,其中$\alpha=n, \beta=\lambda$,这里的$\lambda$是连续发生事件的平均发生频率。
- 卡方分布:若$k$个随机变量$Z_1,Z_2,...,Z_k$是相互独立且符合标准正态分布数学期望为0方差为1的随机变量则随机变量$Z$的平方和$X=\sum_{i=1}^{k}Z_i^2$被称为服从自由度为$k$的卡方分布,记为$X \sim \chi^2(k)$。
- 大数定律:样本数量越多,则其算术平均值就有越高的概率接近期望值。
- 弱大数定律(辛钦定理):样本均值依概率收敛于期望值,即对于任意正数$\epsilon$,有:
$
\lim_{n \to \infty}P(|\overline{X_n}-\mu|>\epsilon)=0
$
- 强大数定律样本均值以概率1收敛于期望值
$
P(\lim_{n \to \infty}\overline{X_n}=\mu)=1
$
- 中心极限定理:如果统计对象是大量独立的随机变量,那么这些变量的平均值分布就会趋向于正态分布,不管原来它们的概率分布是什么类型。
2. 假设检验
假设检验就是通过抽取样本数据,并且通过**小概率反证法**去验证整体情况的方法。假设检验的核心思想是小概率反证法首先假设想推翻的命题是成立的然后试图找出矛盾找出不合理的地方来证明命题为假命题即在原假设零假设null hypothesis的前提下估算某事件发生的可能性如果该事件是小概率事件在一次研究中本来是不可能发生的现在却发生了这时候就可以推翻原假设接受备择假设alternative hypothesis。如果该事件不是小概率事件我们就找不到理由来推翻之前的假设实际中可引申为接受所做的无效假设。
假设检验会存在两种错误情况,一种称为“拒真”,一种称为“取伪”。如果原假设是对的,但你拒绝了原假设,这种错误就叫作“拒真”,这个错误的概率也叫作显著性水平$\alpha$,或称为容忍度;如果原假设是错的,但你承认了原假设,这种错误就叫作“取伪”,这个错误的概率我们记为$\beta$。
描述性统计通常用于研究表象,将现象用数据的方式描述出来;推理性统计通常用于推测本质,也就是你看到的表象的东西有多大概率符合你对隐藏在表象后的本质的猜测。

View File

@ -1,2 +1,31 @@
## NumPy的应用 ## 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. 矢量运算
### 数组的其他操作
### 矩阵运算

View File

@ -1,2 +1,61 @@
## Pandas的应用 ## 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`的列分别作为行索引和列索引,然后对指定的列应用聚合函数得到的结果。
#### 分组和聚合
#### 绘制图表

View File

@ -1,182 +1,64 @@
## 数据可视化 ## 数据可视化
数据的处理、分析和可视化已经成为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 ```Shell
pip install matplotlib pip install matplotlib
``` ```
### 绘制折线图 接下来我们在Jupyter Notebook中用下面的方式导入Matplotlib。
```Python ```Python
# coding: utf-8 from matplotlib import pyplot as plt
import matplotlib.pyplot as plt ```
通过下面的魔法指令,可以让创建的图表直接内嵌在浏览器窗口中显示。
def main(): ```Python
# 保存x轴数据的列表 %matplotlib inline
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__': 1. 创建画布
main() 2. 绘制图像
3. 显示(保存)图像
#### 绘制的例子
```Python
``` ```
运行程序,效果如下图所示。 运行程序,效果如下图所示。
![](./res/result1.png) #### 解决中文显示问题
如果使用jupyter的notebook需要使用魔法指令`%matplotlib inresline`来设置在页面中显示图表,效果如下所示。
![](./res/result-in-jupyter.png)
### 绘制散点图
可以将上面代码中的的`plot`函数换成`scatter`函数来绘制散点图,效果如下图所示。
![](./res/result2.png)
当然,也可以直接通过`plot`函数设置绘图的颜色和线条的形状将折线图改造为散点图,对应的代码如下所示,其中参数'xr'表示每个点的记号是x图形颜色是红色<u>r</u>ed
```Python
plt.plot(x_values, y_values, 'xr')
```
重新运行程序,效果如下图所示。
![](./res/result3.png)
可能大家已经注意到了1和10对应的x记号在图形边角的位置不太明显要解决这个问题可以通过添加下面的代码调整x轴和y轴的坐标范围。
```Python
plt.axis([0, 12, 0, 120])
```
调整后的效果如下图所示。
![](./res/result4.png)
### 绘制正弦曲线
在下面的程序中,我们使用了名为[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()
``` #### 图形的种类和意义
运行程序,效果如下图所示。 1. 绘制散点图
2. 绘制柱状图
![](./res/result5.png) 3. 绘制直方图
4. 绘制饼图
如果要在一个坐标系上绘制多个图像,可以按照如下的方式修改代码。
```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(): ### Seaborn的应用
# 将样本数量减少为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()
```
效果如下图所示。
![](./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()
```
运行效果如下图所示。
![](./res/result8.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 298 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 386 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 308 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 374 KiB

View File

@ -39,6 +39,7 @@ Docker属于对Linux容器技术LXC的一种封装利用了Linux的name
3. 移除可能存在的旧的Docker版本。 3. 移除可能存在的旧的Docker版本。
```Bash ```Bash
yum list installed | grep docker
yum erase -y docker docker-common docker-engine yum erase -y docker docker-common docker-engine
``` ```
@ -473,7 +474,7 @@ myapp
其中api是Flask项目的文件夹其中包括了项目代码、依赖项以及启动脚本等文件具体内容如下所示 其中api是Flask项目的文件夹其中包括了项目代码、依赖项以及启动脚本等文件具体内容如下所示
app.py文件 `app.py`文件:
```Python ```Python
from flask import Flask from flask import Flask
@ -495,7 +496,7 @@ class Product(Resource):
api.add_resource(Product, '/api/products') api.add_resource(Product, '/api/products')
``` ```
requirements.txt文件 `requirements.txt`文件:
```INI ```INI
flask flask
@ -504,7 +505,7 @@ flask-cors
gunicorn gunicorn
``` ```
start.sh文件 `start.sh`文件:
```Shell ```Shell
#!/bin/bash #!/bin/bash