水果市场报告与分析
20年6月22日 · 华东师范大学—孟鑫 2481 人阅读
项目研究报告——水果市场报告与分析
一、研究主题
我的客户是一个水果商人,他想开通全国地区的水果贩卖网,并且在各地之间做生意,因此必须知道各地的水果价格。所以要从网上收集水果贩卖的价格,我找到了一个叫“中国水果交易网(http://www.guo68.com/)”的网站(虽然它的信息有些落后),从上面爬取了部分水果的其他人的销售价格并储存了下来。然后分析各地各水果的情况来给客户提供材料,还要提供像旅行商人一样在各地倒买倒卖的路径分析。
二、研究摘要
使用爬虫,pandas数据处理,tkinter进行可视化,还有一些实现功能的复杂算法。
三、研究目标
获取各地水果价格,分析,可视化以用于水果定价,贩卖
四、总体设计
GUI:
五、程序模块详细设计
重要算法总览:
1°爬虫:
我们的爬取目标是各省,各水果的信息,然后在确定省份和水果的情况下,网页会呈现排列的商铺,并且有页码。
首先写出爬单个网页的函数。
get_text() 获取网页文本
get_price() 调用get_text()并用BeautifulSoup分析,将得到的价格字符串放入列表并返回
主函数crawl_tojson中,用两层for循环来循环省份和水果
再按规则构造网页地址,调用get_price()获取改网页信息,再用for循环构造之后页码的网址(此时发现没有页码了会停止)
整个爬取的数据结构是json格式。最外层字典,键是省份,值是第二层字典。第二层字典键是水果,值是价格字符串列表
2°数据处理:
目的是统一单位(字符串中有元/斤,元/公斤,元/箱之类的),使数据工整,计算出每个省份每种水果的平均价格,并都用xls格式保存。
用read_json()读入我们爬好的json文件
在主函数analyse()中依次执行操作来达到目的。
for循环省份,把每一个省份中各水果数据保存在一个文件中
先是把数据存入DataFrame,因为各种水果贩卖数量不一样(比如卖桃的人比卖梨的人少),数据数量也不一样,先用fill_list()函数补齐长度,期间又调用了get_maxlen()来获得水果中最大的长度。
再用函数delete_data()把“元/斤”以外的单位,值为0的数据删去。用正则表达式取出字符串中的价格,再把其中数值过大的数据删掉。
最后剩一个掺杂有NaN的整齐的DataFrame,column是水果,无特殊index,关于一个省份的水果价格,存入xls格式文件,并计算该省平均价格放入一个列表。
最后最后把所有省的各水果平均价格存入xls格式文件,column是省,index是水果。
3°GUI界面
主要思路是左边是功能栏,右边是显示栏,我打算右边显示栏只用一个canvas完成。
先搭好Frame,frm_func和frm_show。
在frm_func上安装Button:使用说明,水果价格行情,省内价格分布,全国果价排行,苹果商人最佳旅行路径。下面安装Label和Entry:省份,水果,起点,终点。
在frm_show上安装Canvas,下面有Label用来在显示水果价格行情的时候显示页数,还有Button:上一页,下一页来在显示水果价格行情的时候翻页。
还有一个穿插在四个功能函数里面,判断输入格式是否正确,若不正确可以调用warn函数弹出提示窗(使用说明按钮使用的也是warn函数)
4°四个功能函数
水果价格行情:
从entry输入省份和水果,读取对应文件数据。
再调用other_func.py里group(),用for循环分别获得各水果的价格列表,并剔除NaN,存入一个列表,再用变量content记录总页数,和各水果所占页数(每页30条数据)
再调用cvs_tableshow()根据lst和content,参数page,输出对应page的内容。用for判定第page页是属于哪个水果哪部分,再用for循环10次对应10行,再用for循环3次对应3列构造字符串输出,若数据不足三个用\t补上。
函数lastpage,nextpage由按钮调用,改变page并调用cvs_tableshow来改变页数显示。
省内价格分布:
从entry输入省份和水果,读取对应文件数据。
用other_func.py里的group_learning()对水果价格分类。采用机器学习中的聚类方法,来对未知分布,希望分出较便宜和较贵的部分,然后统计他们的数量,返回存有列表的列表,其中的列表储存了分类后水果的价格数据。
再在other_func.py中的draw_pie()画出饼图并在canvas显示。
全国果价排行:
从entry输入水果,读取price_mean.xls中的数据,取出对应水果。
用other_func.py中的draw_line()画出柱状图并在canvas上显示。
苹果商人最佳旅行路径:
从entry读入起点终点,从price_mean.xls中读入各省苹果价格。
用search_path()枚举所有从起点到终点的路径(列表中存省的名称的字符串),并存在allp列表中。枚举算法用的是深度优先搜索,当递归函数到达目的地des时,就在allp中添加路径。
再用search_max()开始枚举各个路径利润最大值。计算该路径最大值采用类似动态规划的思想。从当前状态开始决策,比较前一个状态的所有可能中,获利最大的前一个状态,并决定从这个获利最大的状态到当前状态。这是个递归的过程,不断改变当前状态,得到各个“当前状态”的最优解和最大值并及时记录以减少时间复杂度。最后只需要用dp()以在目的地des为当前状态开始运行,就可以得到改路径的最优解。
得到最大利润和最优路径,再用search_plan()寻找最优买卖方案。使用深度优先搜索算法,枚举所有可能的方案得到的最大值,并找出达到最大值的方案。
最后在canvas上显示地图,路径和最大利润。
1°爬虫
因为要爬各省,各水果的信息,所以一定需要循环,首先构建一页的爬虫。
首先爬取网页源字符串:
然后从字符串里提取价格:
单个网页的爬取就完成了
接下来构建循环。
预处理,虽然可以用更通用的模板爬出来对应关系,但更麻烦了
主循环。我们爬虫的最终目标是一个json文件
城市作为key值对应水果为key值的字典——水果为key值对应价格列表——价格
循环城市——循环水果——构建目标水果的首页网址——接着爬后面的网址
储存
结果示例:
2°数据整理:
因为爬下来的数据中有离谱的数据(特别高的价格,0元)、有各种各样的单位(现在还无法实现转换单位,所以干脆只保留最常见的——元/斤——其余准备删去)、现在还只是json格式储存、各省中贩卖不同水果的人数不一样,所以爬到的各价格的数量(数据量)也不一样,这些都要解决。
读入:
主程序:
拿出个省份分别处理。
先把所有水果放在一个DataFrame中,所以先统一长度:
其中又需要:
接着删除所有没用的数并把字符串转换为可分析的浮点数:
(这其中主要是采用遍历DataFrame一个一个判定的形式)
先删除元/斤之外的单位和0元。同时在爬取的时候也可能会出现NaN,所以干脆全部drop掉
之后用正则表达式把字符串中的数字(价格)取出来,再把过大的价格删去
最后就得到仍旧有大量NaN穿插的DataFrame
单个省的价格数据就先处理到这里,虽然仍有NaN,但这是各水果贩卖数量不一样,所以record(记录)的数量不一样导致的,为了保证得到哪些水果卖的多,哪些水果卖的少的信息,不能强行删去含有NaN的记录。
同时得到省份中各水果的平均价格,用于之后的宏观分析。
For循环之后,就是所有省的,至此数据整理结束。
成果:
3°客户端与功能的实现
现在要先在main文件里准备好GUI窗口
搭建完毕后的界面:
接下来是四大板块:
1:水果价格行情
启动按钮:
预处理,然后是输入判断。
Warn函数,用于弹出提示窗口:
根据省份,水果读入数据
之后需要分页显示,由于支持多水果查看,而水果之间数据量不同,所以不能一行输出各水果价格,只能分开输出(如先输出苹果再输出香蕉)。一页只能输出30条记录,所以需要分组分页。
由other_func模块中的group()负责:
目的是得到水果以及对应的价格列表,然后还有一个目录(content),记录了共多少页,每一种水果需要多少页
接下来是cvs_tableshow()函数,在画布上输出
参数是页数,利用之后翻页操作。
首先判断当前页数page属于哪个水果,在哪段数值里。
同时每种水果的尾页需要特殊处理(毕竟可能不足10行)
接下来按行输出,每一行的输出值是用字符串拼接起来的。
翻页操作:
最终效果:
2:省内价格分布
主要目的是查看省内价格分布,有多少卖得贵,多少卖得便宜
其中用机器学习中的聚类来从数据中计算出类别(因为不同的水果,省份,便宜和贵的界限不一样,需要人工智能从中挖掘)
绘图:
结果:
3:全国果价排行
预处理,输入格式判断。
读入数据(全国各省水果平均价格),取出相应水果,并排序
把数据输给other_func中的函数draw_line()
得到图像文件,再在rank_figure()函数中打开显示在画布上。
成果:
0数据是因为没有人卖或者在数据整理的时候被我扔掉了(人太少了参考价值也不是很高嘛)。。。
4:苹果旅行商人最佳路径
首先预处理,构建中国各省的空间相连关系(在字典里储存)
构建各省在画布中的代表位置(一个点,因为画布以中国大陆地图为背景,在图中画出点来代表该省)
然后读入出发点目的地。
接着读入各省苹果平均价格。
然后枚举所有从出发到目的地的不重复路径:
再用递归函数和状态记录(用于节省时间)计算出所有路径中赚取差价最大的路径:
最后,用深度优先搜索算法沿着找出来的最大利润路径,找出最优方案:
结果:
全程模拟一个旅行的商人,在各省之间倒买倒卖,寻找商机。
六、可视化分析结果
以梨为例,各省水果更倾向于便宜出售,但也有相当量的较高价出售。而且不同省份价格的分布也不大相同(虽然也有分类指标不同的影响)
从平均价格上看,大部分在1.5元/斤以上,即使在上面详细价格分布图中,0~2元的占比很多,但可以看出2元/斤的占比很大。
虽然只贴出了一张图,但是从很多路径图中可以看出一些规律,比如从陕西到福建(可能是因为湖北,重庆没有苹果价格数据),从山西到河南等方案都是很赚的。
七、反思
Python和以往其他语言有些许不同,所以在编的时候用了很多新的操作,比以往更加省力,但同时也有很多BUG,找得也很费力。
爬取的对象中国水果交易网在后来再看得时候发现信息还是十分落后,爬下来的数据不是很有及时性,如果能找到更好的网站就好了。不过没办法了,中国水果业也不是很热门。。
数据分析里落下了很多NaN,虽然有违数据清洗的思想,但是本身数据就参差不齐,除非更换数据格式或数据本身。
GUI界面其实还能继续优化,比如下拉条之类的。。
算法重新看下来太笨重了,很多if很多for,还有我弄了好长时间的各省的代表点的位置。这需要精简算法。
路径分析算法也是,太慢了,不过我能力有限,在找BUG的过程中代码越改越长,判断越来越多,只要核心思路不变,算法的速度就不会有很大提高,暂时只能这样了。
一路写下来回头看写了五百行,代码一点一点敲还是能敲出来很多的嘛。
Python3Turtle