一、综合实验内容
用MongoDB数据库设计一个在线商品销售平台的数据库表,包含的数据字段、内容、类型自行定义,但至少需要设计一个数值字段和用于聚组操作的类别字段。用Python完成数据采集、数据表设计、数据存入数据库、数据读取、数据聚合操作和统计图表绘制过程。
一般过程包括:
1.数据库表字段设计;
2.数据入库;
3.数据库数据查询;
4.数据聚合统计及图表绘制。
二、实验要求
1.报告需要对所设计的字段内容、格式进行详细说明;
2.实验的数据任意,可自行获取,但需要满足聚组操作需求;
3.如爬取数据尽量详细的书写数据爬取过程;
4.完整完成数据采集、入库、读取、分析整个流程即可。
5.数据分析阶段需要详细说明聚合条件和数据统计方式。
6.附上完整的实现代码(包含主要、重点步骤的注释)
7.数据库,表名等部分可以尽量包含自己的学号姓名等信息。
三、实验环境
PyCharm 2021.3.2
MongoDB 3.4.4
四、实验过程
1.数据爬取
1.1选择爬取内容
此处选择爬取的内容是新发地蔬菜的数据信息。
目标网址为新发地-价格行情,爬取信息如下:
1.食品名称 2.最低价 3.最高价 4.平均价 5.产地
1.2分析网站内容
(1)检查网页源代码
右击网址新发地-价格行情页面后选择“查看网页源代码”,发现蔬菜相关的数据并不在网页源码当中,需通过动态加载获取信息,此处打开开发者工具进行抓包。刷新页面抓取商品信息,发现一页共20条商品信息。
(2)查看请求头信息
查看请求头信息,比对其他页请求地址发现请求地址统一为
url = 'http://www.xinfadi.com.cn/getPriceData.html'。
查看请求头,发现请求头没有特殊内容,可以直接将信息复制到代码中:
对应核心代码为:
(3)分析关键参数
查看FromData,发现data信息包含关键参数,点击刷新重新进行抓取发现有三个参数分别是:商品数量limit,页数current,不同类IDprodPcatid。
1.3数据爬取与处理
根据分析结果编写python代码,爬取网站的蔬菜信息,并存储到xlxs表格文件中。数据爬取的完整python代码见附录一:爬取新发地蔬菜信息.py。
查看表格中的数据发现部分数据存在字段名重复,为保持实验分析的严谨性,此处对数据进行去重处理,最终得到100条不重复的数据。为便于后续分析,此处对“产地”字段的数据进行简化,将多产地的数据用数据的第一个字符来替代,由于往往将出产蔬菜最多的产地排在字段最前放,故而用第一个字符代替整体的处理不失科学性与严谨性。
2.数据入库
2.1前期准备
启动MongoDB数据库,启动端口号为27017。创建数据库guoxu_FinalTest,在数据库中创建集合guoxu_Vegetable,作为存放爬取的数据的表。
2.2数据库表字段设计
集合guoxu_Vegetable用来统计不同省份蔬菜的价格表,因各地价格不同,对蔬菜价格用最高价格MaxPrice、最低价格MinPrice以及平均价格AvgPrice进行描述;考虑到后续需对不同省份出产的蔬菜量进行统计,此处设置省份
Province字段进行描述。故而可得,数据的整体存储格式如下:
“_Id”:自动生成, “name”:蔬菜名称, “MinPrice”:蔬菜最低售卖价格, “MaxPrice”:蔬菜最高售卖价格, “AvgPrice”:蔬菜平均售卖价格, “Province”:产出省份 |
2.3使用python代码操作
(1)连接数据库
(2)读取蔬菜.xlxs表中的数据,插入数据库中
2.4查看数据库端数据
使用db.getCollection("guoxu_Vegetable").find({})命令查看插入集合guoxu_Vegetable中的全部数据:
使用db.getCollection("guoxu_Vegetable").count({})命令查看插入的数据总条数:
证明数据插入成功!
数据入库操作的完整python代码见附录二:数据入库.py。
3.数据分析与聚合
3.1数据读取
此处使用Python对数据进行读取、查询、分析、聚合等操作。
首先连接数据库guoxu_FinalTest,连接集合guoxu_Vegetable。
3.2查询条件分析
根据蔬菜数据的特点,设计了三个查询条件:
- 查询各省份产出的蔬菜种类;
- 查询不同价格区间的价格数量;
- 查询省份为“豫”的蔬菜价格排行,为使得查询结果更加真实,此查询针对商品的最高价格、最低价格以及平均价格三个字段展开。
3.3查询各省份产出的蔬菜种类
根据查询条件,需要统计各个省份的产出蔬菜种类的总数。首先需要对100条蔬菜数据按照省份Province进行分组,产自于同一省份的蔬菜归为一组;然后在各分组内计数统计数量总和。此处采用管道操作$group将集合中的蔬菜数据进行分组,采用聚合运算符$sum计算总和,因每条蔬菜数据只统计一次,使用$sum:1表示以一倍计数。
即:"$group":{"_id": '$Province',"total": {"$sum": 1}。
核心Python代码如下:
统计结果如下:
成功得出各省份产出的蔬菜种类数值!
3.3查询各省份产出的蔬菜种类的完整python代码见附录三:3.3.py。
3.4查询不同价格区间的价格数量
对蔬菜数据进行分析可得,蔬菜最低价格在[0.4, 7.4]间均匀分布,最高价格在[0.55, 8.5]间均匀分布,平均价格在[0.48, 7.5]间均匀分布。故而可基于此将价格区间划分为(0, 2.0]、(2.0, 4.0]、(4.0, 6.0]、(8.0, 10.0]五部分。
根据查询条件,需分别将蔬菜的最低价格、最高价格、平均价格的数值在不同价格区间内进行比较,满足区间则计数+1。此处采用比较运算符$gt 大于、$lt小于、$gte大于等于、$lte小于等于来分别实现。
核心Python代码如下:
统计结果如下:
成功得出各省份不同价格区间的价格数值!
3.4查询不同价格区间的价格数量的完整python代码见附录四:3.4.py。
3.5查询省份为“豫”的蔬菜价格排行
根据查询条件,需要先列出所有产出省份为“豫”的蔬菜数据,然后再根据最低价格MinPrice、最高价格MaxPrice、平均价格AvgPrice进行降序排列,并一一打印输出。此处先指定省份Province字段的值为“豫”,再采用管道操作$sort将集合中的蔬菜数据按降序排列,使用-1表示降序。
核心Python代码如下:
统计结果如下:
成功得出省份为“豫”的蔬菜价格排行信息!
3.5查询省份为“豫”的蔬菜价格排行的完整python代码见附录五:3.5.py”。
4.图表绘制
4.1前期准备
此处使用Python绘制3.3和3.4的统计聚合结果的图表,选择matplotlib模块绘制结果,需在Python中导入matplotlib库。对于3.3查询各省份产出的蔬菜种类,此处选择绘制柱状图查看蔬菜种类的具体数值。对于3.4查询不同价格区间的价格数量,此处选择绘制柱状图查看不同价格区间的蔬菜数量,绘制饼图查看不同价格区间的蔬菜数量占比。
4.2绘制各省份产出蔬菜种类的柱状图
首先确定横坐标为各省份,纵坐标为蔬菜种类的数量,分别设置列表变量Province与Total存放对应聚合结果。核心Python代码如下:
为避免出现中文乱码,此处利用plt.rc设置定义中文字体;为避免数据的负数无法显示,此处设置正确显示负号;此外,此处还顺便定义柱状图种的字体大小为8。核心Python代码如下:
使用plt.bar()画柱状图,设置图片名称为“各省份产出的蔬菜种类柱状图”、x坐标名称为“省份”、y坐标名称为“蔬菜种类/种”等信息,并将结果以PNG图片的形式进行保存。核心Python代码如下:
绘制各省份产出的蔬菜种类的完整python代码见附录三:3.3.py。
绘制“各省份产出的蔬菜种类柱状图”如下:
对结果进行可视化分析:
蔬菜是人们饮食中必不可缺的食物之一,对于中国这个人口大国,满足民众的蔬菜需求需要大量的蔬菜,那么全国蔬菜最多的地方是哪里呢?我们从柱状图种可以找到答案。由柱状图容易看出,冀(河北)、鲁(山东)两个省份产出的蔬菜种类分别为39种、23种,几乎产出了多半数的蔬菜种类;豫(河南)作为我国重要的农业大省,产出的蔬菜种类紧随其后,排行第三。其余省份产出的蔬菜种类基本上都在个位数。可以看出,河北省、山东省、河南省都是我国的蔬菜产量大省,其中山东寿光更是被誉为“中国蔬菜之乡”的美誉。
4.2绘制不同价格区间的蔬菜数量图
4.2.1不同价格区间的蔬菜数量饼状图
首先确定横坐标为设定的价格区间,纵坐标为不同价格区间的蔬菜种类的数量,分别设置列表变量Province与Total存放对应聚合结果。使用plt.pie()画饼状图,设置颜色列表存放不同价格区间显示的对应颜色,设置图片名称为“不同价格区间蔬菜种类数量饼图”,并将结果以PNG图片的形式进行保存。
核心Python代码如下:
绘制不同价格区间的数量饼状图的完整python代码见附录四:3.4.py。
绘制“不同价格区间蔬菜种类数量饼图”如下:
4.2.2不同价格区间的蔬菜数量柱状图
首先确定横坐标为不同价格区间,纵坐标为蔬菜种类的数量,分别设置列表变量num与AvgPrice存放对应聚合结果。使用plt.bar()画柱状图,设置图片名称为“各省份产出的蔬菜种类柱状图”、x坐标名称为“省份”、y坐标名称为“蔬菜种类/种”等信息,并将结果以PNG图片的形式进行保存。
核心Python代码如下:
绘制不同价格区间的数量柱状图的完整python代码见附录四:3.4.py。
绘制“不同价格区间蔬菜种类数量柱状图”如下:
4.2.3可视化分析
不同价格区间蔬菜种类数量柱状图主要反映了不同区间的蔬菜数量的值,不同价格区间蔬菜种类数量饼图主要反映了不同区间的占比。从两图种可以看出,平均价格在2.0~4.0元之间的蔬菜占比达46%,平均价格在0~2.0元之间的蔬菜占比达到了35%,可得大部分蔬菜的单位平均价格基本在0~4.0元之间,只有少部分平均价格达到了8.0元。利用本学期学习的《管理经济学》课程的经济学知识分析这种现象:因为蔬菜市场属于完全竞争市场,农民种植蔬菜成本较低,蔬菜市场较易进入,故而绝大部分菜农都不具备哄抬高价的能力,蔬菜的价格完全由市场的供求关系自发决定的,大部分蔬菜单位价格在0~4.0元是市场的供求关系决定的,这也符合市场的机制。
五、实验总结
1.期末考察实验总结
略
2.个人课程学习总结
略
六、附录
代码略